1
The following changes since commit 5bac3c39c82e149515c10643acafd1d292433775:
1
The following changes since commit 6632f6ff96f0537fc34cdc00c760656fc62e23c5:
2
2
3
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2017-03-13 15:08:01 +0000)
3
Merge remote-tracking branch 'remotes/famz/tags/block-and-testing-pull-request' into staging (2017-07-17 11:46:36 +0100)
4
4
5
are available in the git repository at:
5
are available in the git repository at:
6
6
7
https://github.com/jasowang/qemu.git tags/net-pull-request
7
https://github.com/jasowang/qemu.git tags/net-pull-request
8
8
9
for you to fetch changes up to adb560f7fc92903f52071086a46422be1e3f4640:
9
for you to fetch changes up to 189ae6bb5ce1f5a322f8691d00fe942ba43dd601:
10
10
11
hw/net: implement MIB counters in mcf_fec driver (2017-03-14 15:39:55 +0800)
11
virtio-net: fix offload ctrl endian (2017-07-17 20:13:56 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
- fix e100e memory regions leaks during cleanup
14
15
- fix fec MIB counters
15
- fix virtio-net ctrl offload endian
16
- fix COLO trace print
16
- vnet header support for variou COLO netfilters and compare thread
17
17
----------------------------------------------------------------
18
----------------------------------------------------------------
18
Greg Ungerer (1):
19
Jason Wang (1):
19
hw/net: implement MIB counters in mcf_fec driver
20
virtio-net: fix offload ctrl endian
20
21
21
Paolo Bonzini (1):
22
Michal Privoznik (1):
22
e1000e: correctly tear down MSI-X memory regions
23
virtion-net: Prefer is_power_of_2()
23
24
24
Zhang Chen (1):
25
Zhang Chen (12):
25
COLO-compare: Fix trace_event print bug
26
net: Add vnet_hdr_len arguments in NetClientState
27
net/net.c: Add vnet_hdr support in SocketReadState
28
net/filter-mirror.c: Introduce parameter for filter_send()
29
net/filter-mirror.c: Make filter mirror support vnet support.
30
net/filter-mirror.c: Add new option to enable vnet support for filter-redirector
31
net/colo.c: Make vnet_hdr_len as packet property
32
net/colo-compare.c: Introduce parameter for compare_chr_send()
33
net/colo-compare.c: Make colo-compare support vnet_hdr_len
34
net/colo.c: Add vnet packet parse feature in colo-proxy
35
net/colo-compare.c: Add vnet packet's tcp/udp/icmp compare
36
net/filter-rewriter.c: Make filter-rewriter support vnet_hdr_len
37
docs/colo-proxy.txt: Update colo-proxy usage of net driver with vnet_header
26
38
27
hw/net/e1000e.c | 2 +-
39
docs/colo-proxy.txt | 26 ++++++++++++++++
28
hw/net/mcf_fec.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++
40
hw/net/virtio-net.c | 4 ++-
29
net/colo-compare.c | 33 +++++++++++----
41
include/net/net.h | 10 ++++--
30
3 files changed, 141 insertions(+), 9 deletions(-)
42
net/colo-compare.c | 84 ++++++++++++++++++++++++++++++++++++++++++---------
43
net/colo.c | 9 +++---
44
net/colo.h | 4 ++-
45
net/filter-mirror.c | 75 +++++++++++++++++++++++++++++++++++++++++----
46
net/filter-rewriter.c | 37 ++++++++++++++++++++++-
47
net/net.c | 37 ++++++++++++++++++++---
48
net/socket.c | 8 ++---
49
qemu-options.hx | 19 ++++++------
50
11 files changed, 265 insertions(+), 48 deletions(-)
31
51
32
52
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
Add vnet_hdr_len arguments in NetClientState
4
that make other module get real vnet_hdr_len easily.
5
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
include/net/net.h | 1 +
10
net/net.c | 1 +
11
2 files changed, 2 insertions(+)
12
13
diff --git a/include/net/net.h b/include/net/net.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/net/net.h
16
+++ b/include/net/net.h
17
@@ -XXX,XX +XXX,XX @@ struct NetClientState {
18
unsigned int queue_index;
19
unsigned rxfilter_notify_enabled:1;
20
int vring_enable;
21
+ int vnet_hdr_len;
22
QTAILQ_HEAD(NetFilterHead, NetFilterState) filters;
23
};
24
25
diff --git a/net/net.c b/net/net.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/net/net.c
28
+++ b/net/net.c
29
@@ -XXX,XX +XXX,XX @@ void qemu_set_vnet_hdr_len(NetClientState *nc, int len)
30
return;
31
}
32
33
+ nc->vnet_hdr_len = len;
34
nc->info->set_vnet_hdr_len(nc, len);
35
}
36
37
--
38
2.7.4
39
40
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
We add a flag to decide whether net_fill_rstate() need read
4
the vnet_hdr_len or not.
5
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Suggested-by: Jason Wang <jasowang@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
---
10
include/net/net.h | 9 +++++++--
11
net/colo-compare.c | 4 ++--
12
net/filter-mirror.c | 2 +-
13
net/net.c | 36 ++++++++++++++++++++++++++++++++----
14
net/socket.c | 8 ++++----
15
5 files changed, 46 insertions(+), 13 deletions(-)
16
17
diff --git a/include/net/net.h b/include/net/net.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/net/net.h
20
+++ b/include/net/net.h
21
@@ -XXX,XX +XXX,XX @@ typedef struct NICState {
22
} NICState;
23
24
struct SocketReadState {
25
- int state; /* 0 = getting length, 1 = getting data */
26
+ /* 0 = getting length, 1 = getting vnet header length, 2 = getting data */
27
+ int state;
28
+ /* This flag decide whether to read the vnet_hdr_len field */
29
+ bool vnet_hdr;
30
uint32_t index;
31
uint32_t packet_len;
32
+ uint32_t vnet_hdr_len;
33
uint8_t buf[NET_BUFSIZE];
34
SocketReadStateFinalize *finalize;
35
};
36
@@ -XXX,XX +XXX,XX @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
37
void print_net_client(Monitor *mon, NetClientState *nc);
38
void hmp_info_network(Monitor *mon, const QDict *qdict);
39
void net_socket_rs_init(SocketReadState *rs,
40
- SocketReadStateFinalize *finalize);
41
+ SocketReadStateFinalize *finalize,
42
+ bool vnet_hdr);
43
44
/* NIC info */
45
46
diff --git a/net/colo-compare.c b/net/colo-compare.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/net/colo-compare.c
49
+++ b/net/colo-compare.c
50
@@ -XXX,XX +XXX,XX @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
51
return;
52
}
53
54
- net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize);
55
- net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize);
56
+ net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
57
+ net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
58
59
g_queue_init(&s->conn_list);
60
61
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/net/filter-mirror.c
64
+++ b/net/filter-mirror.c
65
@@ -XXX,XX +XXX,XX @@ static void filter_redirector_setup(NetFilterState *nf, Error **errp)
66
}
67
}
68
69
- net_socket_rs_init(&s->rs, redirector_rs_finalize);
70
+ net_socket_rs_init(&s->rs, redirector_rs_finalize, false);
71
72
if (s->indev) {
73
chr = qemu_chr_find(s->indev);
74
diff --git a/net/net.c b/net/net.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/net/net.c
77
+++ b/net/net.c
78
@@ -XXX,XX +XXX,XX @@ QemuOptsList qemu_net_opts = {
79
};
80
81
void net_socket_rs_init(SocketReadState *rs,
82
- SocketReadStateFinalize *finalize)
83
+ SocketReadStateFinalize *finalize,
84
+ bool vnet_hdr)
85
{
86
rs->state = 0;
87
+ rs->vnet_hdr = vnet_hdr;
88
rs->index = 0;
89
rs->packet_len = 0;
90
+ rs->vnet_hdr_len = 0;
91
memset(rs->buf, 0, sizeof(rs->buf));
92
rs->finalize = finalize;
93
}
94
@@ -XXX,XX +XXX,XX @@ int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
95
unsigned int l;
96
97
while (size > 0) {
98
- /* reassemble a packet from the network */
99
- switch (rs->state) { /* 0 = getting length, 1 = getting data */
100
+ /* Reassemble a packet from the network.
101
+ * 0 = getting length.
102
+ * 1 = getting vnet header length.
103
+ * 2 = getting data.
104
+ */
105
+ switch (rs->state) {
106
case 0:
107
l = 4 - rs->index;
108
if (l > size) {
109
@@ -XXX,XX +XXX,XX @@ int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
110
/* got length */
111
rs->packet_len = ntohl(*(uint32_t *)rs->buf);
112
rs->index = 0;
113
- rs->state = 1;
114
+ if (rs->vnet_hdr) {
115
+ rs->state = 1;
116
+ } else {
117
+ rs->state = 2;
118
+ rs->vnet_hdr_len = 0;
119
+ }
120
}
121
break;
122
case 1:
123
+ l = 4 - rs->index;
124
+ if (l > size) {
125
+ l = size;
126
+ }
127
+ memcpy(rs->buf + rs->index, buf, l);
128
+ buf += l;
129
+ size -= l;
130
+ rs->index += l;
131
+ if (rs->index == 4) {
132
+ /* got vnet header length */
133
+ rs->vnet_hdr_len = ntohl(*(uint32_t *)rs->buf);
134
+ rs->index = 0;
135
+ rs->state = 2;
136
+ }
137
+ break;
138
+ case 2:
139
l = rs->packet_len - rs->index;
140
if (l > size) {
141
l = size;
142
diff --git a/net/socket.c b/net/socket.c
143
index XXXXXXX..XXXXXXX 100644
144
--- a/net/socket.c
145
+++ b/net/socket.c
146
@@ -XXX,XX +XXX,XX @@ static void net_socket_send(void *opaque)
147
closesocket(s->fd);
148
149
s->fd = -1;
150
- net_socket_rs_init(&s->rs, net_socket_rs_finalize);
151
+ net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
152
s->nc.link_down = true;
153
memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
154
155
@@ -XXX,XX +XXX,XX @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
156
s->fd = fd;
157
s->listen_fd = -1;
158
s->send_fn = net_socket_send_dgram;
159
- net_socket_rs_init(&s->rs, net_socket_rs_finalize);
160
+ net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
161
net_socket_read_poll(s, true);
162
163
/* mcast: save bound address as dst */
164
@@ -XXX,XX +XXX,XX @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
165
166
s->fd = fd;
167
s->listen_fd = -1;
168
- net_socket_rs_init(&s->rs, net_socket_rs_finalize);
169
+ net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
170
171
/* Disable Nagle algorithm on TCP sockets to reduce latency */
172
socket_set_nodelay(fd);
173
@@ -XXX,XX +XXX,XX @@ static int net_socket_listen_init(NetClientState *peer,
174
s->fd = -1;
175
s->listen_fd = fd;
176
s->nc.link_down = true;
177
- net_socket_rs_init(&s->rs, net_socket_rs_finalize);
178
+ net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
179
180
qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
181
return 0;
182
--
183
2.7.4
184
185
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
This patch change the filter_send() parameter from CharBackend to MirrorState,
4
we can get more information like vnet_hdr(We use it to support packet with vnet_header).
5
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
net/filter-mirror.c | 10 +++++-----
10
1 file changed, 5 insertions(+), 5 deletions(-)
11
12
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/net/filter-mirror.c
15
+++ b/net/filter-mirror.c
16
@@ -XXX,XX +XXX,XX @@ typedef struct MirrorState {
17
SocketReadState rs;
18
} MirrorState;
19
20
-static int filter_send(CharBackend *chr_out,
21
+static int filter_send(MirrorState *s,
22
const struct iovec *iov,
23
int iovcnt)
24
{
25
@@ -XXX,XX +XXX,XX @@ static int filter_send(CharBackend *chr_out,
26
}
27
28
len = htonl(size);
29
- ret = qemu_chr_fe_write_all(chr_out, (uint8_t *)&len, sizeof(len));
30
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
31
if (ret != sizeof(len)) {
32
goto err;
33
}
34
35
buf = g_malloc(size);
36
iov_to_buf(iov, iovcnt, 0, buf, size);
37
- ret = qemu_chr_fe_write_all(chr_out, (uint8_t *)buf, size);
38
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
39
g_free(buf);
40
if (ret != size) {
41
goto err;
42
@@ -XXX,XX +XXX,XX @@ static ssize_t filter_mirror_receive_iov(NetFilterState *nf,
43
MirrorState *s = FILTER_MIRROR(nf);
44
int ret;
45
46
- ret = filter_send(&s->chr_out, iov, iovcnt);
47
+ ret = filter_send(s, iov, iovcnt);
48
if (ret) {
49
error_report("filter mirror send failed(%s)", strerror(-ret));
50
}
51
@@ -XXX,XX +XXX,XX @@ static ssize_t filter_redirector_receive_iov(NetFilterState *nf,
52
int ret;
53
54
if (qemu_chr_fe_backend_connected(&s->chr_out)) {
55
- ret = filter_send(&s->chr_out, iov, iovcnt);
56
+ ret = filter_send(s, iov, iovcnt);
57
if (ret) {
58
error_report("filter redirector send failed(%s)", strerror(-ret));
59
}
60
--
61
2.7.4
62
63
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
We add the vnet_hdr_support option for filter-mirror, default is disabled.
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
5
You can use it for example:
6
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0,vnet_hdr_support
7
8
If it has vnet_hdr_support flag, we will change the sending packet format from
9
struct {int size; const uint8_t buf[];} to {int size; int vnet_hdr_len; const uint8_t buf[];}.
10
make other module(like colo-compare) know how to parse net packet correctly.
11
12
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
13
Signed-off-by: Jason Wang <jasowang@redhat.com>
14
---
15
net/filter-mirror.c | 42 +++++++++++++++++++++++++++++++++++++++++-
16
qemu-options.hx | 5 ++---
17
2 files changed, 43 insertions(+), 4 deletions(-)
18
19
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/net/filter-mirror.c
22
+++ b/net/filter-mirror.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct MirrorState {
24
CharBackend chr_in;
25
CharBackend chr_out;
26
SocketReadState rs;
27
+ bool vnet_hdr;
28
} MirrorState;
29
30
static int filter_send(MirrorState *s,
31
const struct iovec *iov,
32
int iovcnt)
33
{
34
+ NetFilterState *nf = NETFILTER(s);
35
int ret = 0;
36
ssize_t size = 0;
37
uint32_t len = 0;
38
@@ -XXX,XX +XXX,XX @@ static int filter_send(MirrorState *s,
39
goto err;
40
}
41
42
+ if (s->vnet_hdr) {
43
+ /*
44
+ * If vnet_hdr = on, we send vnet header len to make other
45
+ * module(like colo-compare) know how to parse net
46
+ * packet correctly.
47
+ */
48
+ ssize_t vnet_hdr_len;
49
+
50
+ vnet_hdr_len = nf->netdev->vnet_hdr_len;
51
+
52
+ len = htonl(vnet_hdr_len);
53
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
54
+ if (ret != sizeof(len)) {
55
+ goto err;
56
+ }
57
+ }
58
+
59
buf = g_malloc(size);
60
iov_to_buf(iov, iovcnt, 0, buf, size);
61
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
62
@@ -XXX,XX +XXX,XX @@ static void filter_redirector_setup(NetFilterState *nf, Error **errp)
63
}
64
}
65
66
- net_socket_rs_init(&s->rs, redirector_rs_finalize, false);
67
+ net_socket_rs_init(&s->rs, redirector_rs_finalize, s->vnet_hdr);
68
69
if (s->indev) {
70
chr = qemu_chr_find(s->indev);
71
@@ -XXX,XX +XXX,XX @@ static void filter_mirror_set_outdev(Object *obj,
72
}
73
}
74
75
+static bool filter_mirror_get_vnet_hdr(Object *obj, Error **errp)
76
+{
77
+ MirrorState *s = FILTER_MIRROR(obj);
78
+
79
+ return s->vnet_hdr;
80
+}
81
+
82
+static void filter_mirror_set_vnet_hdr(Object *obj, bool value, Error **errp)
83
+{
84
+ MirrorState *s = FILTER_MIRROR(obj);
85
+
86
+ s->vnet_hdr = value;
87
+}
88
+
89
static char *filter_redirector_get_outdev(Object *obj, Error **errp)
90
{
91
MirrorState *s = FILTER_REDIRECTOR(obj);
92
@@ -XXX,XX +XXX,XX @@ static void filter_redirector_set_outdev(Object *obj,
93
94
static void filter_mirror_init(Object *obj)
95
{
96
+ MirrorState *s = FILTER_MIRROR(obj);
97
+
98
object_property_add_str(obj, "outdev", filter_mirror_get_outdev,
99
filter_mirror_set_outdev, NULL);
100
+
101
+ s->vnet_hdr = false;
102
+ object_property_add_bool(obj, "vnet_hdr_support",
103
+ filter_mirror_get_vnet_hdr,
104
+ filter_mirror_set_vnet_hdr, NULL);
105
}
106
107
static void filter_redirector_init(Object *obj)
108
diff --git a/qemu-options.hx b/qemu-options.hx
109
index XXXXXXX..XXXXXXX 100644
110
--- a/qemu-options.hx
111
+++ b/qemu-options.hx
112
@@ -XXX,XX +XXX,XX @@ queue @var{all|rx|tx} is an option that can be applied to any netfilter.
113
@option{tx}: the filter is attached to the transmit queue of the netdev,
114
where it will receive packets sent by the netdev.
115
116
-@item -object filter-mirror,id=@var{id},netdev=@var{netdevid},outdev=@var{chardevid}[,queue=@var{all|rx|tx}]
117
+@item -object filter-mirror,id=@var{id},netdev=@var{netdevid},outdev=@var{chardevid},queue=@var{all|rx|tx}[,vnet_hdr_support]
118
119
-filter-mirror on netdev @var{netdevid},mirror net packet to chardev
120
-@var{chardevid}
121
+filter-mirror on netdev @var{netdevid},mirror net packet to chardev@var{chardevid}, if it has the vnet_hdr_support flag, filter-mirror will mirror packet with vnet_hdr_len.
122
123
@item -object filter-redirector,id=@var{id},netdev=@var{netdevid},indev=@var{chardevid},
124
outdev=@var{chardevid}[,queue=@var{all|rx|tx}]
125
--
126
2.7.4
127
128
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
We add the vnet_hdr_support option for filter-redirector, default is disabled.
4
If you use virtio-net-pci net driver or other driver needs vnet_hdr, please enable it.
5
Because colo-compare or other modules needs the vnet_hdr_len to parse
6
packet, we add this new option send the len to others.
7
You can use it for example:
8
-object filter-redirector,id=r0,netdev=hn0,queue=tx,outdev=red0,vnet_hdr_support
9
10
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
11
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
---
13
net/filter-mirror.c | 23 +++++++++++++++++++++++
14
qemu-options.hx | 6 +++---
15
2 files changed, 26 insertions(+), 3 deletions(-)
16
17
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/net/filter-mirror.c
20
+++ b/net/filter-mirror.c
21
@@ -XXX,XX +XXX,XX @@ static void filter_redirector_set_outdev(Object *obj,
22
s->outdev = g_strdup(value);
23
}
24
25
+static bool filter_redirector_get_vnet_hdr(Object *obj, Error **errp)
26
+{
27
+ MirrorState *s = FILTER_REDIRECTOR(obj);
28
+
29
+ return s->vnet_hdr;
30
+}
31
+
32
+static void filter_redirector_set_vnet_hdr(Object *obj,
33
+ bool value,
34
+ Error **errp)
35
+{
36
+ MirrorState *s = FILTER_REDIRECTOR(obj);
37
+
38
+ s->vnet_hdr = value;
39
+}
40
+
41
static void filter_mirror_init(Object *obj)
42
{
43
MirrorState *s = FILTER_MIRROR(obj);
44
@@ -XXX,XX +XXX,XX @@ static void filter_mirror_init(Object *obj)
45
46
static void filter_redirector_init(Object *obj)
47
{
48
+ MirrorState *s = FILTER_REDIRECTOR(obj);
49
+
50
object_property_add_str(obj, "indev", filter_redirector_get_indev,
51
filter_redirector_set_indev, NULL);
52
object_property_add_str(obj, "outdev", filter_redirector_get_outdev,
53
filter_redirector_set_outdev, NULL);
54
+
55
+ s->vnet_hdr = false;
56
+ object_property_add_bool(obj, "vnet_hdr_support",
57
+ filter_redirector_get_vnet_hdr,
58
+ filter_redirector_set_vnet_hdr, NULL);
59
}
60
61
static void filter_mirror_fini(Object *obj)
62
diff --git a/qemu-options.hx b/qemu-options.hx
63
index XXXXXXX..XXXXXXX 100644
64
--- a/qemu-options.hx
65
+++ b/qemu-options.hx
66
@@ -XXX,XX +XXX,XX @@ queue @var{all|rx|tx} is an option that can be applied to any netfilter.
67
68
filter-mirror on netdev @var{netdevid},mirror net packet to chardev@var{chardevid}, if it has the vnet_hdr_support flag, filter-mirror will mirror packet with vnet_hdr_len.
69
70
-@item -object filter-redirector,id=@var{id},netdev=@var{netdevid},indev=@var{chardevid},
71
-outdev=@var{chardevid}[,queue=@var{all|rx|tx}]
72
+@item -object filter-redirector,id=@var{id},netdev=@var{netdevid},indev=@var{chardevid},outdev=@var{chardevid},queue=@var{all|rx|tx}[,vnet_hdr_support]
73
74
filter-redirector on netdev @var{netdevid},redirect filter's net packet to chardev
75
-@var{chardevid},and redirect indev's packet to filter.
76
+@var{chardevid},and redirect indev's packet to filter.if it has the vnet_hdr_support flag,
77
+filter-redirector will redirect packet with vnet_hdr_len.
78
Create a filter-redirector we need to differ outdev id from indev id, id can not
79
be the same. we can just use indev or outdev, but at least one of indev or outdev
80
need to be specified.
81
--
82
2.7.4
83
84
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
We can use this property flush and send packet with vnet_hdr_len.
4
5
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
---
8
net/colo-compare.c | 8 ++++++--
9
net/colo.c | 3 ++-
10
net/colo.h | 4 +++-
11
net/filter-rewriter.c | 2 +-
12
4 files changed, 12 insertions(+), 5 deletions(-)
13
14
diff --git a/net/colo-compare.c b/net/colo-compare.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/net/colo-compare.c
17
+++ b/net/colo-compare.c
18
@@ -XXX,XX +XXX,XX @@ static int packet_enqueue(CompareState *s, int mode)
19
Connection *conn;
20
21
if (mode == PRIMARY_IN) {
22
- pkt = packet_new(s->pri_rs.buf, s->pri_rs.packet_len);
23
+ pkt = packet_new(s->pri_rs.buf,
24
+ s->pri_rs.packet_len,
25
+ s->pri_rs.vnet_hdr_len);
26
} else {
27
- pkt = packet_new(s->sec_rs.buf, s->sec_rs.packet_len);
28
+ pkt = packet_new(s->sec_rs.buf,
29
+ s->sec_rs.packet_len,
30
+ s->sec_rs.vnet_hdr_len);
31
}
32
33
if (parse_packet_early(pkt)) {
34
diff --git a/net/colo.c b/net/colo.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/net/colo.c
37
+++ b/net/colo.c
38
@@ -XXX,XX +XXX,XX @@ void connection_destroy(void *opaque)
39
g_slice_free(Connection, conn);
40
}
41
42
-Packet *packet_new(const void *data, int size)
43
+Packet *packet_new(const void *data, int size, int vnet_hdr_len)
44
{
45
Packet *pkt = g_slice_new(Packet);
46
47
pkt->data = g_memdup(data, size);
48
pkt->size = size;
49
pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST);
50
+ pkt->vnet_hdr_len = vnet_hdr_len;
51
52
return pkt;
53
}
54
diff --git a/net/colo.h b/net/colo.h
55
index XXXXXXX..XXXXXXX 100644
56
--- a/net/colo.h
57
+++ b/net/colo.h
58
@@ -XXX,XX +XXX,XX @@ typedef struct Packet {
59
int size;
60
/* Time of packet creation, in wall clock ms */
61
int64_t creation_ms;
62
+ /* Get vnet_hdr_len from filter */
63
+ uint32_t vnet_hdr_len;
64
} Packet;
65
66
typedef struct ConnectionKey {
67
@@ -XXX,XX +XXX,XX @@ Connection *connection_get(GHashTable *connection_track_table,
68
ConnectionKey *key,
69
GQueue *conn_list);
70
void connection_hashtable_reset(GHashTable *connection_track_table);
71
-Packet *packet_new(const void *data, int size);
72
+Packet *packet_new(const void *data, int size, int vnet_hdr_len);
73
void packet_destroy(void *opaque, void *user_data);
74
75
#endif /* QEMU_COLO_PROXY_H */
76
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
77
index XXXXXXX..XXXXXXX 100644
78
--- a/net/filter-rewriter.c
79
+++ b/net/filter-rewriter.c
80
@@ -XXX,XX +XXX,XX @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf,
81
char *buf = g_malloc0(size);
82
83
iov_to_buf(iov, iovcnt, 0, buf, size);
84
- pkt = packet_new(buf, size);
85
+ pkt = packet_new(buf, size, 0);
86
g_free(buf);
87
88
/*
89
--
90
2.7.4
91
92
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
This patch change the compare_chr_send() parameter from CharBackend to CompareState,
4
we can get more information like vnet_hdr(We use it to support packet with vnet_header).
5
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
net/colo-compare.c | 14 +++++++-------
10
1 file changed, 7 insertions(+), 7 deletions(-)
11
12
diff --git a/net/colo-compare.c b/net/colo-compare.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/net/colo-compare.c
15
+++ b/net/colo-compare.c
16
@@ -XXX,XX +XXX,XX @@ enum {
17
SECONDARY_IN,
18
};
19
20
-static int compare_chr_send(CharBackend *out,
21
+static int compare_chr_send(CompareState *s,
22
const uint8_t *buf,
23
uint32_t size);
24
25
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
26
}
27
28
if (result) {
29
- ret = compare_chr_send(&s->chr_out, pkt->data, pkt->size);
30
+ ret = compare_chr_send(s, pkt->data, pkt->size);
31
if (ret < 0) {
32
error_report("colo_send_primary_packet failed");
33
}
34
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
35
}
36
}
37
38
-static int compare_chr_send(CharBackend *out,
39
+static int compare_chr_send(CompareState *s,
40
const uint8_t *buf,
41
uint32_t size)
42
{
43
@@ -XXX,XX +XXX,XX @@ static int compare_chr_send(CharBackend *out,
44
return 0;
45
}
46
47
- ret = qemu_chr_fe_write_all(out, (uint8_t *)&len, sizeof(len));
48
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
49
if (ret != sizeof(len)) {
50
goto err;
51
}
52
53
- ret = qemu_chr_fe_write_all(out, (uint8_t *)buf, size);
54
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
55
if (ret != size) {
56
goto err;
57
}
58
@@ -XXX,XX +XXX,XX @@ static void compare_pri_rs_finalize(SocketReadState *pri_rs)
59
60
if (packet_enqueue(s, PRIMARY_IN)) {
61
trace_colo_compare_main("primary: unsupported packet in");
62
- compare_chr_send(&s->chr_out, pri_rs->buf, pri_rs->packet_len);
63
+ compare_chr_send(s, pri_rs->buf, pri_rs->packet_len);
64
} else {
65
/* compare connection */
66
g_queue_foreach(&s->conn_list, colo_compare_connection, s);
67
@@ -XXX,XX +XXX,XX @@ static void colo_flush_packets(void *opaque, void *user_data)
68
69
while (!g_queue_is_empty(&conn->primary_list)) {
70
pkt = g_queue_pop_head(&conn->primary_list);
71
- compare_chr_send(&s->chr_out, pkt->data, pkt->size);
72
+ compare_chr_send(s, pkt->data, pkt->size);
73
packet_destroy(pkt, NULL);
74
}
75
while (!g_queue_is_empty(&conn->secondary_list)) {
76
--
77
2.7.4
78
79
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
2
3
Because of inet_ntoa() return a statically allocated buffer,
3
We add the vnet_hdr_support option for colo-compare, default is disabled.
4
subsequent calls will overwrite, So we fix this bug.
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
5
You can use it for example:
6
-object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,vnet_hdr_support
7
8
COLO-compare can get vnet header length from filter,
9
Add vnet_hdr_len to struct packet and output packet with
10
the vnet_hdr_len.
5
11
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
12
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
13
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
14
---
9
net/colo-compare.c | 33 +++++++++++++++++++++++++--------
15
net/colo-compare.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++-------
10
1 file changed, 25 insertions(+), 8 deletions(-)
16
qemu-options.hx | 4 ++--
17
2 files changed, 55 insertions(+), 9 deletions(-)
11
18
12
diff --git a/net/colo-compare.c b/net/colo-compare.c
19
diff --git a/net/colo-compare.c b/net/colo-compare.c
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/net/colo-compare.c
21
--- a/net/colo-compare.c
15
+++ b/net/colo-compare.c
22
+++ b/net/colo-compare.c
16
@@ -XXX,XX +XXX,XX @@ static int packet_enqueue(CompareState *s, int mode)
23
@@ -XXX,XX +XXX,XX @@ typedef struct CompareState {
17
*/
24
CharBackend chr_out;
18
static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
25
SocketReadState pri_rs;
26
SocketReadState sec_rs;
27
+ bool vnet_hdr;
28
29
/* connection list: the connections belonged to this NIC could be found
30
* in this list.
31
@@ -XXX,XX +XXX,XX @@ enum {
32
33
static int compare_chr_send(CompareState *s,
34
const uint8_t *buf,
35
- uint32_t size);
36
+ uint32_t size,
37
+ uint32_t vnet_hdr_len);
38
39
static gint seq_sorter(Packet *a, Packet *b, gpointer data)
19
{
40
{
20
- trace_colo_compare_ip_info(ppkt->size, inet_ntoa(ppkt->ip->ip_src),
41
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
21
- inet_ntoa(ppkt->ip->ip_dst), spkt->size,
42
}
22
- inet_ntoa(spkt->ip->ip_src),
43
23
- inet_ntoa(spkt->ip->ip_dst));
44
if (result) {
24
+ if (trace_event_get_state(TRACE_COLO_COMPARE_MISCOMPARE)) {
45
- ret = compare_chr_send(s, pkt->data, pkt->size);
25
+ char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
46
+ ret = compare_chr_send(s,
26
+
47
+ pkt->data,
27
+ strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
48
+ pkt->size,
28
+ strcpy(pri_ip_dst, inet_ntoa(ppkt->ip->ip_dst));
49
+ pkt->vnet_hdr_len);
29
+ strcpy(sec_ip_src, inet_ntoa(spkt->ip->ip_src));
50
if (ret < 0) {
30
+ strcpy(sec_ip_dst, inet_ntoa(spkt->ip->ip_dst));
51
error_report("colo_send_primary_packet failed");
31
+
52
}
32
+ trace_colo_compare_ip_info(ppkt->size, pri_ip_src,
53
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
33
+ pri_ip_dst, spkt->size,
54
34
+ sec_ip_src, sec_ip_dst);
55
static int compare_chr_send(CompareState *s,
35
+ }
56
const uint8_t *buf,
36
57
- uint32_t size)
37
if (ppkt->size == spkt->size) {
58
+ uint32_t size,
38
return memcmp(ppkt->data + offset, spkt->data + offset,
59
+ uint32_t vnet_hdr_len)
39
@@ -XXX,XX +XXX,XX @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
40
static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
41
{
60
{
42
trace_colo_compare_main("compare other");
61
int ret = 0;
43
- trace_colo_compare_ip_info(ppkt->size, inet_ntoa(ppkt->ip->ip_src),
62
uint32_t len = htonl(size);
44
- inet_ntoa(ppkt->ip->ip_dst), spkt->size,
63
@@ -XXX,XX +XXX,XX @@ static int compare_chr_send(CompareState *s,
45
- inet_ntoa(spkt->ip->ip_src),
64
goto err;
46
- inet_ntoa(spkt->ip->ip_dst));
65
}
47
+ if (trace_event_get_state(TRACE_COLO_COMPARE_MISCOMPARE)) {
66
48
+ char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
67
+ if (s->vnet_hdr) {
49
+
68
+ /*
50
+ strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
69
+ * We send vnet header len make other module(like filter-redirector)
51
+ strcpy(pri_ip_dst, inet_ntoa(ppkt->ip->ip_dst));
70
+ * know how to parse net packet correctly.
52
+ strcpy(sec_ip_src, inet_ntoa(spkt->ip->ip_src));
71
+ */
53
+ strcpy(sec_ip_dst, inet_ntoa(spkt->ip->ip_dst));
72
+ len = htonl(vnet_hdr_len);
54
+
73
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
55
+ trace_colo_compare_ip_info(ppkt->size, pri_ip_src,
74
+ if (ret != sizeof(len)) {
56
+ pri_ip_dst, spkt->size,
75
+ goto err;
57
+ sec_ip_src, sec_ip_dst);
76
+ }
58
+ }
77
+ }
59
+
78
+
60
return colo_packet_compare_common(ppkt, spkt, 0);
79
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
80
if (ret != size) {
81
goto err;
82
@@ -XXX,XX +XXX,XX @@ static void compare_set_outdev(Object *obj, const char *value, Error **errp)
83
s->outdev = g_strdup(value);
61
}
84
}
85
86
+static bool compare_get_vnet_hdr(Object *obj, Error **errp)
87
+{
88
+ CompareState *s = COLO_COMPARE(obj);
89
+
90
+ return s->vnet_hdr;
91
+}
92
+
93
+static void compare_set_vnet_hdr(Object *obj,
94
+ bool value,
95
+ Error **errp)
96
+{
97
+ CompareState *s = COLO_COMPARE(obj);
98
+
99
+ s->vnet_hdr = value;
100
+}
101
+
102
static void compare_pri_rs_finalize(SocketReadState *pri_rs)
103
{
104
CompareState *s = container_of(pri_rs, CompareState, pri_rs);
105
106
if (packet_enqueue(s, PRIMARY_IN)) {
107
trace_colo_compare_main("primary: unsupported packet in");
108
- compare_chr_send(s, pri_rs->buf, pri_rs->packet_len);
109
+ compare_chr_send(s,
110
+ pri_rs->buf,
111
+ pri_rs->packet_len,
112
+ pri_rs->vnet_hdr_len);
113
} else {
114
/* compare connection */
115
g_queue_foreach(&s->conn_list, colo_compare_connection, s);
116
@@ -XXX,XX +XXX,XX @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
117
return;
118
}
119
120
- net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
121
- net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
122
+ net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, s->vnet_hdr);
123
+ net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, s->vnet_hdr);
124
125
g_queue_init(&s->conn_list);
126
127
@@ -XXX,XX +XXX,XX @@ static void colo_flush_packets(void *opaque, void *user_data)
128
129
while (!g_queue_is_empty(&conn->primary_list)) {
130
pkt = g_queue_pop_head(&conn->primary_list);
131
- compare_chr_send(s, pkt->data, pkt->size);
132
+ compare_chr_send(s,
133
+ pkt->data,
134
+ pkt->size,
135
+ pkt->vnet_hdr_len);
136
packet_destroy(pkt, NULL);
137
}
138
while (!g_queue_is_empty(&conn->secondary_list)) {
139
@@ -XXX,XX +XXX,XX @@ static void colo_compare_class_init(ObjectClass *oc, void *data)
140
141
static void colo_compare_init(Object *obj)
142
{
143
+ CompareState *s = COLO_COMPARE(obj);
144
+
145
object_property_add_str(obj, "primary_in",
146
compare_get_pri_indev, compare_set_pri_indev,
147
NULL);
148
@@ -XXX,XX +XXX,XX @@ static void colo_compare_init(Object *obj)
149
object_property_add_str(obj, "outdev",
150
compare_get_outdev, compare_set_outdev,
151
NULL);
152
+
153
+ s->vnet_hdr = false;
154
+ object_property_add_bool(obj, "vnet_hdr_support", compare_get_vnet_hdr,
155
+ compare_set_vnet_hdr, NULL);
156
}
157
158
static void colo_compare_finalize(Object *obj)
159
diff --git a/qemu-options.hx b/qemu-options.hx
160
index XXXXXXX..XXXXXXX 100644
161
--- a/qemu-options.hx
162
+++ b/qemu-options.hx
163
@@ -XXX,XX +XXX,XX @@ Dump the network traffic on netdev @var{dev} to the file specified by
164
The file format is libpcap, so it can be analyzed with tools such as tcpdump
165
or Wireshark.
166
167
-@item -object colo-compare,id=@var{id},primary_in=@var{chardevid},secondary_in=@var{chardevid},
168
-outdev=@var{chardevid}
169
+@item -object colo-compare,id=@var{id},primary_in=@var{chardevid},secondary_in=@var{chardevid},outdev=@var{chardevid}[,vnet_hdr_support]
170
171
Colo-compare gets packet from primary_in@var{chardevid} and secondary_in@var{chardevid}, than compare primary packet with
172
secondary packet. If the packets are same, we will output primary
173
packet to outdev@var{chardevid}, else we will notify colo-frame
174
do checkpoint and send primary packet to outdev@var{chardevid}.
175
+if it has the vnet_hdr_support flag, colo compare will send/recv packet with vnet_hdr_len.
176
177
we must use it with the help of filter-mirror and filter-redirector.
62
178
63
--
179
--
64
2.7.4
180
2.7.4
65
181
66
182
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
Make colo-compare and filter-rewriter can parse vnet packet.
4
5
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
---
8
net/colo.c | 6 +++---
9
1 file changed, 3 insertions(+), 3 deletions(-)
10
11
diff --git a/net/colo.c b/net/colo.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/net/colo.c
14
+++ b/net/colo.c
15
@@ -XXX,XX +XXX,XX @@ int parse_packet_early(Packet *pkt)
16
{
17
int network_length;
18
static const uint8_t vlan[] = {0x81, 0x00};
19
- uint8_t *data = pkt->data;
20
+ uint8_t *data = pkt->data + pkt->vnet_hdr_len;
21
uint16_t l3_proto;
22
ssize_t l2hdr_len = eth_get_l2_hdr_length(data);
23
24
- if (pkt->size < ETH_HLEN) {
25
+ if (pkt->size < ETH_HLEN + pkt->vnet_hdr_len) {
26
trace_colo_proxy_main("pkt->size < ETH_HLEN");
27
return 1;
28
}
29
@@ -XXX,XX +XXX,XX @@ int parse_packet_early(Packet *pkt)
30
}
31
32
network_length = pkt->ip->ip_hl * 4;
33
- if (pkt->size < l2hdr_len + network_length) {
34
+ if (pkt->size < l2hdr_len + network_length + pkt->vnet_hdr_len) {
35
trace_colo_proxy_main("pkt->size < network_header + network_length");
36
return 1;
37
}
38
--
39
2.7.4
40
41
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
COLO-Proxy just focus on packet payload, so we skip vnet header.
4
5
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
---
8
net/colo-compare.c | 8 ++++++--
9
1 file changed, 6 insertions(+), 2 deletions(-)
10
11
diff --git a/net/colo-compare.c b/net/colo-compare.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/net/colo-compare.c
14
+++ b/net/colo-compare.c
15
@@ -XXX,XX +XXX,XX @@ static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
16
sec_ip_src, sec_ip_dst);
17
}
18
19
+ offset = ppkt->vnet_hdr_len + offset;
20
+
21
if (ppkt->size == spkt->size) {
22
- return memcmp(ppkt->data + offset, spkt->data + offset,
23
+ return memcmp(ppkt->data + offset,
24
+ spkt->data + offset,
25
spkt->size - offset);
26
} else {
27
trace_colo_compare_main("Net packet size are not the same");
28
@@ -XXX,XX +XXX,XX @@ static int colo_packet_compare_tcp(Packet *spkt, Packet *ppkt)
29
*/
30
if (ptcp->th_off > 5) {
31
ptrdiff_t tcp_offset;
32
+
33
tcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
34
- + (ptcp->th_off * 4);
35
+ + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
36
res = colo_packet_compare_common(ppkt, spkt, tcp_offset);
37
} else if (ptcp->th_sum == stcp->th_sum) {
38
res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN);
39
--
40
2.7.4
41
42
diff view generated by jsdifflib
1
From: Greg Ungerer <gerg@uclinux.org>
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
2
3
The FEC ethernet hardware module used on ColdFire SoC parts contains a
3
We add the vnet_hdr_support option for filter-rewriter, default is disabled.
4
block of RAM used to maintain hardware counters. This block is accessible
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
5
via the usual FEC register address space. There is currently no support
5
You can use it for example:
6
for this in the QEMU mcf_fec driver.
6
-object filter-rewriter,id=rew0,netdev=hn0,queue=all,vnet_hdr_support
7
7
8
Add support for storing a MIB RAM block, and provide register level
8
We get the vnet_hdr_len from NetClientState that make us
9
access to it. Also implement a basic set of stats collection functions
9
parse net packet correctly.
10
to populate MIB data fields.
11
10
12
This support tested running a Linux target and using the net-tools
11
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
13
"ethtool -S" option. As of linux-4.9 the kernels FEC driver makes
14
accesses to the MIB counters during its initialization (which it never
15
did before), and so this version of Linux will now fail with the QEMU
16
error:
17
18
qemu: hardware error: mcf_fec_read: Bad address 0x200
19
20
This MIB counter support fixes this problem.
21
22
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
23
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
24
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
25
---
13
---
26
hw/net/mcf_fec.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
14
net/filter-rewriter.c | 37 ++++++++++++++++++++++++++++++++++++-
27
1 file changed, 115 insertions(+)
15
qemu-options.hx | 4 ++--
16
2 files changed, 38 insertions(+), 3 deletions(-)
28
17
29
diff --git a/hw/net/mcf_fec.c b/hw/net/mcf_fec.c
18
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
30
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/net/mcf_fec.c
20
--- a/net/filter-rewriter.c
32
+++ b/hw/net/mcf_fec.c
21
+++ b/net/filter-rewriter.c
33
@@ -XXX,XX +XXX,XX @@ do { printf("mcf_fec: " fmt , ## __VA_ARGS__); } while (0)
22
@@ -XXX,XX +XXX,XX @@
34
23
#include "qemu-common.h"
35
#define FEC_MAX_DESC 1024
24
#include "qapi/error.h"
36
#define FEC_MAX_FRAME_SIZE 2032
25
#include "qapi/qmp/qerror.h"
37
+#define FEC_MIB_SIZE 64
26
+#include "qemu/error-report.h"
38
27
#include "qapi-visit.h"
39
typedef struct {
28
#include "qom/object.h"
40
SysBusDevice parent_obj;
29
#include "qemu/main-loop.h"
41
@@ -XXX,XX +XXX,XX @@ typedef struct {
30
@@ -XXX,XX +XXX,XX @@ typedef struct RewriterState {
42
uint32_t erdsr;
31
NetQueue *incoming_queue;
43
uint32_t etdsr;
32
/* hashtable to save connection */
44
uint32_t emrbr;
33
GHashTable *connection_track_table;
45
+ uint32_t mib[FEC_MIB_SIZE];
34
+ bool vnet_hdr;
46
} mcf_fec_state;
35
} RewriterState;
47
36
48
#define FEC_INT_HB 0x80000000
37
static void filter_rewriter_flush(NetFilterState *nf)
49
@@ -XXX,XX +XXX,XX @@ typedef struct {
38
@@ -XXX,XX +XXX,XX @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf,
50
#define FEC_BD_OV 0x0002
39
ConnectionKey key;
51
#define FEC_BD_TR 0x0001
40
Packet *pkt;
52
41
ssize_t size = iov_size(iov, iovcnt);
53
+#define MIB_RMON_T_DROP 0
42
+ ssize_t vnet_hdr_len = 0;
54
+#define MIB_RMON_T_PACKETS 1
43
char *buf = g_malloc0(size);
55
+#define MIB_RMON_T_BC_PKT 2
44
56
+#define MIB_RMON_T_MC_PKT 3
45
iov_to_buf(iov, iovcnt, 0, buf, size);
57
+#define MIB_RMON_T_CRC_ALIGN 4
46
- pkt = packet_new(buf, size, 0);
58
+#define MIB_RMON_T_UNDERSIZE 5
59
+#define MIB_RMON_T_OVERSIZE 6
60
+#define MIB_RMON_T_FRAG 7
61
+#define MIB_RMON_T_JAB 8
62
+#define MIB_RMON_T_COL 9
63
+#define MIB_RMON_T_P64 10
64
+#define MIB_RMON_T_P65TO127 11
65
+#define MIB_RMON_T_P128TO255 12
66
+#define MIB_RMON_T_P256TO511 13
67
+#define MIB_RMON_T_P512TO1023 14
68
+#define MIB_RMON_T_P1024TO2047 15
69
+#define MIB_RMON_T_P_GTE2048 16
70
+#define MIB_RMON_T_OCTETS 17
71
+#define MIB_IEEE_T_DROP 18
72
+#define MIB_IEEE_T_FRAME_OK 19
73
+#define MIB_IEEE_T_1COL 20
74
+#define MIB_IEEE_T_MCOL 21
75
+#define MIB_IEEE_T_DEF 22
76
+#define MIB_IEEE_T_LCOL 23
77
+#define MIB_IEEE_T_EXCOL 24
78
+#define MIB_IEEE_T_MACERR 25
79
+#define MIB_IEEE_T_CSERR 26
80
+#define MIB_IEEE_T_SQE 27
81
+#define MIB_IEEE_T_FDXFC 28
82
+#define MIB_IEEE_T_OCTETS_OK 29
83
+
47
+
84
+#define MIB_RMON_R_DROP 32
48
+ if (s->vnet_hdr) {
85
+#define MIB_RMON_R_PACKETS 33
49
+ vnet_hdr_len = nf->netdev->vnet_hdr_len;
86
+#define MIB_RMON_R_BC_PKT 34
50
+ }
87
+#define MIB_RMON_R_MC_PKT 35
88
+#define MIB_RMON_R_CRC_ALIGN 36
89
+#define MIB_RMON_R_UNDERSIZE 37
90
+#define MIB_RMON_R_OVERSIZE 38
91
+#define MIB_RMON_R_FRAG 39
92
+#define MIB_RMON_R_JAB 40
93
+#define MIB_RMON_R_RESVD_0 41
94
+#define MIB_RMON_R_P64 42
95
+#define MIB_RMON_R_P65TO127 43
96
+#define MIB_RMON_R_P128TO255 44
97
+#define MIB_RMON_R_P256TO511 45
98
+#define MIB_RMON_R_P512TO1023 46
99
+#define MIB_RMON_R_P1024TO2047 47
100
+#define MIB_RMON_R_P_GTE2048 48
101
+#define MIB_RMON_R_OCTETS 49
102
+#define MIB_IEEE_R_DROP 50
103
+#define MIB_IEEE_R_FRAME_OK 51
104
+#define MIB_IEEE_R_CRC 52
105
+#define MIB_IEEE_R_ALIGN 53
106
+#define MIB_IEEE_R_MACERR 54
107
+#define MIB_IEEE_R_FDXFC 55
108
+#define MIB_IEEE_R_OCTETS_OK 56
109
+
51
+
110
static void mcf_fec_read_bd(mcf_fec_bd *bd, uint32_t addr)
52
+ pkt = packet_new(buf, size, vnet_hdr_len);
111
{
53
g_free(buf);
112
cpu_physical_memory_read(addr, bd, sizeof(*bd));
54
113
@@ -XXX,XX +XXX,XX @@ static void mcf_fec_update(mcf_fec_state *s)
55
/*
114
s->irq_state = active;
56
@@ -XXX,XX +XXX,XX @@ static void colo_rewriter_setup(NetFilterState *nf, Error **errp)
57
s->incoming_queue = qemu_new_net_queue(qemu_netfilter_pass_to_next, nf);
115
}
58
}
116
59
117
+static void mcf_fec_tx_stats(mcf_fec_state *s, int size)
60
+static bool filter_rewriter_get_vnet_hdr(Object *obj, Error **errp)
118
+{
61
+{
119
+ s->mib[MIB_RMON_T_PACKETS]++;
62
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
120
+ s->mib[MIB_RMON_T_OCTETS] += size;
63
+
121
+ if (size < 64) {
64
+ return s->vnet_hdr;
122
+ s->mib[MIB_RMON_T_FRAG]++;
123
+ } else if (size == 64) {
124
+ s->mib[MIB_RMON_T_P64]++;
125
+ } else if (size < 128) {
126
+ s->mib[MIB_RMON_T_P65TO127]++;
127
+ } else if (size < 256) {
128
+ s->mib[MIB_RMON_T_P128TO255]++;
129
+ } else if (size < 512) {
130
+ s->mib[MIB_RMON_T_P256TO511]++;
131
+ } else if (size < 1024) {
132
+ s->mib[MIB_RMON_T_P512TO1023]++;
133
+ } else if (size < 2048) {
134
+ s->mib[MIB_RMON_T_P1024TO2047]++;
135
+ } else {
136
+ s->mib[MIB_RMON_T_P_GTE2048]++;
137
+ }
138
+ s->mib[MIB_IEEE_T_FRAME_OK]++;
139
+ s->mib[MIB_IEEE_T_OCTETS_OK] += size;
140
+}
65
+}
141
+
66
+
142
static void mcf_fec_do_tx(mcf_fec_state *s)
67
+static void filter_rewriter_set_vnet_hdr(Object *obj,
143
{
68
+ bool value,
144
uint32_t addr;
69
+ Error **errp)
145
@@ -XXX,XX +XXX,XX @@ static void mcf_fec_do_tx(mcf_fec_state *s)
146
/* Last buffer in frame. */
147
DPRINTF("Sending packet\n");
148
qemu_send_packet(qemu_get_queue(s->nic), frame, frame_size);
149
+ mcf_fec_tx_stats(s, frame_size);
150
ptr = frame;
151
frame_size = 0;
152
s->eir |= FEC_INT_TXF;
153
@@ -XXX,XX +XXX,XX @@ static uint64_t mcf_fec_read(void *opaque, hwaddr addr,
154
case 0x180: return s->erdsr;
155
case 0x184: return s->etdsr;
156
case 0x188: return s->emrbr;
157
+ case 0x200 ... 0x2e0: return s->mib[(addr & 0x1ff) / 4];
158
default:
159
hw_error("mcf_fec_read: Bad address 0x%x\n", (int)addr);
160
return 0;
161
@@ -XXX,XX +XXX,XX @@ static void mcf_fec_write(void *opaque, hwaddr addr,
162
case 0x188:
163
s->emrbr = value > 0 ? value & 0x7F0 : 0x7F0;
164
break;
165
+ case 0x200 ... 0x2e0:
166
+ s->mib[(addr & 0x1ff) / 4] = value;
167
+ break;
168
default:
169
hw_error("mcf_fec_write Bad address 0x%x\n", (int)addr);
170
}
171
mcf_fec_update(s);
172
}
173
174
+static void mcf_fec_rx_stats(mcf_fec_state *s, int size)
175
+{
70
+{
176
+ s->mib[MIB_RMON_R_PACKETS]++;
71
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
177
+ s->mib[MIB_RMON_R_OCTETS] += size;
72
+
178
+ if (size < 64) {
73
+ s->vnet_hdr = value;
179
+ s->mib[MIB_RMON_R_FRAG]++;
180
+ } else if (size == 64) {
181
+ s->mib[MIB_RMON_R_P64]++;
182
+ } else if (size < 128) {
183
+ s->mib[MIB_RMON_R_P65TO127]++;
184
+ } else if (size < 256) {
185
+ s->mib[MIB_RMON_R_P128TO255]++;
186
+ } else if (size < 512) {
187
+ s->mib[MIB_RMON_R_P256TO511]++;
188
+ } else if (size < 1024) {
189
+ s->mib[MIB_RMON_R_P512TO1023]++;
190
+ } else if (size < 2048) {
191
+ s->mib[MIB_RMON_R_P1024TO2047]++;
192
+ } else {
193
+ s->mib[MIB_RMON_R_P_GTE2048]++;
194
+ }
195
+ s->mib[MIB_IEEE_R_FRAME_OK]++;
196
+ s->mib[MIB_IEEE_R_OCTETS_OK] += size;
197
+}
74
+}
198
+
75
+
199
static int mcf_fec_have_receive_space(mcf_fec_state *s, size_t want)
76
+static void filter_rewriter_init(Object *obj)
77
+{
78
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
79
+
80
+ s->vnet_hdr = false;
81
+ object_property_add_bool(obj, "vnet_hdr_support",
82
+ filter_rewriter_get_vnet_hdr,
83
+ filter_rewriter_set_vnet_hdr, NULL);
84
+}
85
+
86
static void colo_rewriter_class_init(ObjectClass *oc, void *data)
200
{
87
{
201
mcf_fec_bd bd;
88
NetFilterClass *nfc = NETFILTER_CLASS(oc);
202
@@ -XXX,XX +XXX,XX @@ static ssize_t mcf_fec_receive(NetClientState *nc, const uint8_t *buf, size_t si
89
@@ -XXX,XX +XXX,XX @@ static const TypeInfo colo_rewriter_info = {
203
}
90
.name = TYPE_FILTER_REWRITER,
204
}
91
.parent = TYPE_NETFILTER,
205
s->rx_descriptor = addr;
92
.class_init = colo_rewriter_class_init,
206
+ mcf_fec_rx_stats(s, retsize);
93
+ .instance_init = filter_rewriter_init,
207
mcf_fec_enable_rx(s);
94
.instance_size = sizeof(RewriterState),
208
mcf_fec_update(s);
95
};
209
return retsize;
96
97
diff --git a/qemu-options.hx b/qemu-options.hx
98
index XXXXXXX..XXXXXXX 100644
99
--- a/qemu-options.hx
100
+++ b/qemu-options.hx
101
@@ -XXX,XX +XXX,XX @@ Create a filter-redirector we need to differ outdev id from indev id, id can not
102
be the same. we can just use indev or outdev, but at least one of indev or outdev
103
need to be specified.
104
105
-@item -object filter-rewriter,id=@var{id},netdev=@var{netdevid}[,queue=@var{all|rx|tx}]
106
+@item -object filter-rewriter,id=@var{id},netdev=@var{netdevid},queue=@var{all|rx|tx},[vnet_hdr_support]
107
108
Filter-rewriter is a part of COLO project.It will rewrite tcp packet to
109
secondary from primary to keep secondary tcp connection,and rewrite
110
tcp packet to primary from secondary make tcp packet can be handled by
111
-client.
112
+client.if it has the vnet_hdr_support flag, we can parse packet with vnet header.
113
114
usage:
115
colo secondary:
210
--
116
--
211
2.7.4
117
2.7.4
212
118
213
119
diff view generated by jsdifflib
New patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
2
3
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
4
Signed-off-by: Jason Wang <jasowang@redhat.com>
5
---
6
docs/colo-proxy.txt | 26 ++++++++++++++++++++++++++
7
1 file changed, 26 insertions(+)
8
9
diff --git a/docs/colo-proxy.txt b/docs/colo-proxy.txt
10
index XXXXXXX..XXXXXXX 100644
11
--- a/docs/colo-proxy.txt
12
+++ b/docs/colo-proxy.txt
13
@@ -XXX,XX +XXX,XX @@ Secondary(ip:3.3.3.8):
14
-chardev socket,id=red1,host=3.3.3.3,port=9004
15
-object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0
16
-object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1
17
+-object filter-rewriter,id=f3,netdev=hn0,queue=all
18
+
19
+If you want to use virtio-net-pci or other driver with vnet_header:
20
+
21
+Primary(ip:3.3.3.3):
22
+-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
23
+-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
24
+-chardev socket,id=mirror0,host=3.3.3.3,port=9003,server,nowait
25
+-chardev socket,id=compare1,host=3.3.3.3,port=9004,server,nowait
26
+-chardev socket,id=compare0,host=3.3.3.3,port=9001,server,nowait
27
+-chardev socket,id=compare0-0,host=3.3.3.3,port=9001
28
+-chardev socket,id=compare_out,host=3.3.3.3,port=9005,server,nowait
29
+-chardev socket,id=compare_out0,host=3.3.3.3,port=9005
30
+-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0,vnet_hdr_support
31
+-object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out,vnet_hdr_support
32
+-object filter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0,vnet_hdr_support
33
+-object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,vnet_hdr_support
34
+
35
+Secondary(ip:3.3.3.8):
36
+-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,down script=/etc/qemu-ifdown
37
+-device e1000,netdev=hn0,mac=52:a4:00:12:78:66
38
+-chardev socket,id=red0,host=3.3.3.3,port=9003
39
+-chardev socket,id=red1,host=3.3.3.3,port=9004
40
+-object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0,vnet_hdr_support
41
+-object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1,vnet_hdr_support
42
+-object filter-rewriter,id=f3,netdev=hn0,queue=all,vnet_hdr_support
43
44
Note:
45
a.COLO-proxy must work with COLO-frame and Block-replication.
46
--
47
2.7.4
48
49
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Michal Privoznik <mprivozn@redhat.com>
2
2
3
MSI-X has been disabled by the time the e1000e device is unrealized, hence
3
We have a function that checks if given number is power of two.
4
msix_uninit is never called. This causes the object to be leaked, which
4
We should prefer it instead of expanding the check on our own.
5
shows up as a RAMBlock with empty name when attempting migration.
6
5
7
Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
6
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
8
Cc: Jason Wang <jasowang@redhat.com>
9
Cc: qemu-stable@nongnu.org
10
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
11
Tested-by: Laurent Vivier <lvivier@redhat.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
13
---
8
---
14
hw/net/e1000e.c | 2 +-
9
hw/net/virtio-net.c | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
10
1 file changed, 1 insertion(+), 1 deletion(-)
16
11
17
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/net/e1000e.c
14
--- a/hw/net/virtio-net.c
20
+++ b/hw/net/e1000e.c
15
+++ b/hw/net/virtio-net.c
21
@@ -XXX,XX +XXX,XX @@ e1000e_init_msix(E1000EState *s)
16
@@ -XXX,XX +XXX,XX @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
22
static void
17
*/
23
e1000e_cleanup_msix(E1000EState *s)
18
if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE ||
24
{
19
n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE ||
25
- if (msix_enabled(PCI_DEVICE(s))) {
20
- (n->net_conf.rx_queue_size & (n->net_conf.rx_queue_size - 1))) {
26
+ if (msix_present(PCI_DEVICE(s))) {
21
+ !is_power_of_2(n->net_conf.rx_queue_size)) {
27
e1000e_unuse_msix_vectors(s, E1000E_MSIX_VEC_NUM);
22
error_setg(errp, "Invalid rx_queue_size (= %" PRIu16 "), "
28
msix_uninit(PCI_DEVICE(s), &s->msix, &s->msix);
23
"must be a power of 2 between %d and %d.",
29
}
24
n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE,
30
--
25
--
31
2.7.4
26
2.7.4
32
27
33
28
diff view generated by jsdifflib
New patch
1
Spec said offloads should be le64, so use virtio_ldq_p() to guarantee
2
valid endian.
1
3
4
Fixes: 644c98587d4c ("virtio-net: dynamic network offloads configuration")
5
Cc: qemu-stable@nongnu.org
6
Cc: Dmitry Fleytman <dfleytma@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
hw/net/virtio-net.c | 2 ++
10
1 file changed, 2 insertions(+)
11
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/virtio-net.c
15
+++ b/hw/net/virtio-net.c
16
@@ -XXX,XX +XXX,XX @@ static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd,
17
if (cmd == VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET) {
18
uint64_t supported_offloads;
19
20
+ offloads = virtio_ldq_p(vdev, &offloads);
21
+
22
if (!n->has_vnet_hdr) {
23
return VIRTIO_NET_ERR;
24
}
25
--
26
2.7.4
27
28
diff view generated by jsdifflib