1
The following changes since commit 6632f6ff96f0537fc34cdc00c760656fc62e23c5:
1
The following changes since commit 4ffa88c99c54d2a30f79e3dbecec50b023eff1c8:
2
2
3
Merge remote-tracking branch 'remotes/famz/tags/block-and-testing-pull-request' into staging (2017-07-17 11:46:36 +0100)
3
Merge remote-tracking branch 'remotes/berrange/tags/pull-qcrypto-2017-11-08-1' into staging (2017-11-10 16:01:35 +0000)
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 189ae6bb5ce1f5a322f8691d00fe942ba43dd601:
9
for you to fetch changes up to bb160b571fe469b03228d4502c75a18045978a74:
10
10
11
virtio-net: fix offload ctrl endian (2017-07-17 20:13:56 +0800)
11
net/socket: fix coverity issue (2017-11-13 18:05:12 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
14
15
- fix virtio-net ctrl offload endian
15
----------------------------------------------------------------
16
- vnet header support for variou COLO netfilters and compare thread
16
Jens Freimann (2):
17
net: fix check for number of parameters to -netdev socket
18
net/socket: fix coverity issue
17
19
18
----------------------------------------------------------------
20
Mao Zhongyi (4):
19
Jason Wang (1):
21
colo-compare: Insert packet into the suitable position of packet queue directly
20
virtio-net: fix offload ctrl endian
22
colo-compare: compare the packet in a specified Connection
23
colo-compare: Fix comments
24
colo: Consolidate the duplicate code chunk into a routine
21
25
22
Michal Privoznik (1):
26
Mike Nawrocki (2):
23
virtion-net: Prefer is_power_of_2()
27
Fix eepro100 simple transmission mode
28
Add new PCI ID for i82559a
24
29
25
Zhang Chen (12):
30
hw/net/eepro100.c | 31 +++++++++++++-------------
26
net: Add vnet_hdr_len arguments in NetClientState
31
include/hw/compat.h | 4 ++++
27
net/net.c: Add vnet_hdr support in SocketReadState
32
include/hw/pci/pci.h | 1 +
28
net/filter-mirror.c: Introduce parameter for filter_send()
33
net/colo-compare.c | 61 ++++++++++++++++++++++++++++++----------------------
29
net/filter-mirror.c: Make filter mirror support vnet support.
34
net/colo.c | 18 +++++++++-------
30
net/filter-mirror.c: Add new option to enable vnet support for filter-redirector
35
net/colo.h | 1 +
31
net/colo.c: Make vnet_hdr_len as packet property
36
net/socket.c | 6 +++---
32
net/colo-compare.c: Introduce parameter for compare_chr_send()
37
qemu-options.hx | 2 +-
33
net/colo-compare.c: Make colo-compare support vnet_hdr_len
38
8 files changed, 71 insertions(+), 53 deletions(-)
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
38
39
docs/colo-proxy.txt | 26 ++++++++++++++++
40
hw/net/virtio-net.c | 4 ++-
41
include/net/net.h | 10 ++++--
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(-)
51
39
52
40
diff view generated by jsdifflib
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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
1
Spec said offloads should be le64, so use virtio_ldq_p() to guarantee
1
From: Jens Freimann <jfreimann@redhat.com>
2
valid endian.
3
2
4
Fixes: 644c98587d4c ("virtio-net: dynamic network offloads configuration")
3
Since commit 0f8c289ad "net: fix -netdev socket,fd= for UDP sockets"
4
we allow more than one parameter for -netdev socket. But now
5
we run into an assert when no parameter at all is specified
6
7
> qemu-system-x86_64 -netdev socket
8
socket.c:729: net_init_socket: Assertion `sock->has_udp' failed.
9
10
Fix this by reverting the change of the if condition done in 0f8c289ad.
11
12
Cc: Jason Wang <jasowang@redhat.com>
5
Cc: qemu-stable@nongnu.org
13
Cc: qemu-stable@nongnu.org
6
Cc: Dmitry Fleytman <dfleytma@redhat.com>
14
Fixes: 0f8c289ad539feb5135c545bea947b310a893f4b
15
Reported-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
16
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
17
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
18
---
9
hw/net/virtio-net.c | 2 ++
19
net/socket.c | 4 ++--
10
1 file changed, 2 insertions(+)
20
1 file changed, 2 insertions(+), 2 deletions(-)
11
21
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
22
diff --git a/net/socket.c b/net/socket.c
13
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/virtio-net.c
24
--- a/net/socket.c
15
+++ b/hw/net/virtio-net.c
25
+++ b/net/socket.c
16
@@ -XXX,XX +XXX,XX @@ static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd,
26
@@ -XXX,XX +XXX,XX @@ int net_init_socket(const Netdev *netdev, const char *name,
17
if (cmd == VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET) {
27
assert(netdev->type == NET_CLIENT_DRIVER_SOCKET);
18
uint64_t supported_offloads;
28
sock = &netdev->u.socket;
19
29
20
+ offloads = virtio_ldq_p(vdev, &offloads);
30
- if (sock->has_listen + sock->has_connect + sock->has_mcast +
21
+
31
- sock->has_udp > 1) {
22
if (!n->has_vnet_hdr) {
32
+ if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast +
23
return VIRTIO_NET_ERR;
33
+ sock->has_udp != 1) {
24
}
34
error_setg(errp, "exactly one of listen=, connect=, mcast= or udp="
35
" is required");
36
return -1;
25
--
37
--
26
2.7.4
38
2.7.4
27
39
28
40
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
2
2
3
COLO-Proxy just focus on packet payload, so we skip vnet header.
3
Currently, a packet from pri_dev or sec_dev is fristly pushed at the
4
tail of the primary or secondary packet queue then sorted by the tcp
5
sequence number.
4
6
5
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Now, this patch use g_queue_insert_sorted to insert the packet directly
8
into the suitable position to avoid ordering all packets each time when
9
a new packet is comming, thereby increasing efficiency.
10
11
In addition, consolidate the code that add a packet to the list of
12
Connection (primary or secondary) into a separate routine colo_insert_packet()
13
since the same chunk of code is called from two place.
14
15
Cc: Zhang Chen <zhangckid@gmail.com>
16
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>
17
Cc: Jason Wang <jasowang@redhat.com>
18
Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
19
Signed-off-by: Zhang Chen <zhangckid@gmail.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
20
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
---
21
---
8
net/colo-compare.c | 8 ++++++--
22
net/colo-compare.c | 40 ++++++++++++++++++++++------------------
9
1 file changed, 6 insertions(+), 2 deletions(-)
23
1 file changed, 22 insertions(+), 18 deletions(-)
10
24
11
diff --git a/net/colo-compare.c b/net/colo-compare.c
25
diff --git a/net/colo-compare.c b/net/colo-compare.c
12
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
13
--- a/net/colo-compare.c
27
--- a/net/colo-compare.c
14
+++ b/net/colo-compare.c
28
+++ b/net/colo-compare.c
15
@@ -XXX,XX +XXX,XX @@ static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
29
@@ -XXX,XX +XXX,XX @@ static gint seq_sorter(Packet *a, Packet *b, gpointer data)
16
sec_ip_src, sec_ip_dst);
30
}
31
32
/*
33
+ * Return 1 on success, if return 0 means the
34
+ * packet will be dropped
35
+ */
36
+static int colo_insert_packet(GQueue *queue, Packet *pkt)
37
+{
38
+ if (g_queue_get_length(queue) <= MAX_QUEUE_SIZE) {
39
+ if (pkt->ip->ip_p == IPPROTO_TCP) {
40
+ g_queue_insert_sorted(queue,
41
+ pkt,
42
+ (GCompareDataFunc)seq_sorter,
43
+ NULL);
44
+ } else {
45
+ g_queue_push_tail(queue, pkt);
46
+ }
47
+ return 1;
48
+ }
49
+ return 0;
50
+}
51
+
52
+/*
53
* Return 0 on success, if return -1 means the pkt
54
* is unsupported(arp and ipv6) and will be sent later
55
*/
56
@@ -XXX,XX +XXX,XX @@ static int packet_enqueue(CompareState *s, int mode)
17
}
57
}
18
58
19
+ offset = ppkt->vnet_hdr_len + offset;
59
if (mode == PRIMARY_IN) {
20
+
60
- if (g_queue_get_length(&conn->primary_list) <=
21
if (ppkt->size == spkt->size) {
61
- MAX_QUEUE_SIZE) {
22
- return memcmp(ppkt->data + offset, spkt->data + offset,
62
- g_queue_push_tail(&conn->primary_list, pkt);
23
+ return memcmp(ppkt->data + offset,
63
- if (conn->ip_proto == IPPROTO_TCP) {
24
+ spkt->data + offset,
64
- g_queue_sort(&conn->primary_list,
25
spkt->size - offset);
65
- (GCompareDataFunc)seq_sorter,
66
- NULL);
67
- }
68
- } else {
69
+ if (!colo_insert_packet(&conn->primary_list, pkt)) {
70
error_report("colo compare primary queue size too big,"
71
"drop packet");
72
}
26
} else {
73
} else {
27
trace_colo_compare_main("Net packet size are not the same");
74
- if (g_queue_get_length(&conn->secondary_list) <=
28
@@ -XXX,XX +XXX,XX @@ static int colo_packet_compare_tcp(Packet *spkt, Packet *ppkt)
75
- MAX_QUEUE_SIZE) {
29
*/
76
- g_queue_push_tail(&conn->secondary_list, pkt);
30
if (ptcp->th_off > 5) {
77
- if (conn->ip_proto == IPPROTO_TCP) {
31
ptrdiff_t tcp_offset;
78
- g_queue_sort(&conn->secondary_list,
32
+
79
- (GCompareDataFunc)seq_sorter,
33
tcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
80
- NULL);
34
- + (ptcp->th_off * 4);
81
- }
35
+ + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
82
- } else {
36
res = colo_packet_compare_common(ppkt, spkt, tcp_offset);
83
+ if (!colo_insert_packet(&conn->secondary_list, pkt)) {
37
} else if (ptcp->th_sum == stcp->th_sum) {
84
error_report("colo compare secondary queue size too big,"
38
res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN);
85
"drop packet");
86
}
39
--
87
--
40
2.7.4
88
2.7.4
41
89
42
90
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
2
2
3
We add the vnet_hdr_support option for colo-compare, default is disabled.
3
A package from pri_indev or sec_indev only belongs to a particular
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
4
Connection, so we only need to compare the package in the specified
5
You can use it for example:
5
Connection's primary_list and secondary_list, rather than for each
6
-object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,vnet_hdr_support
6
the whole Connection list to compare. This is time-consuming and
7
unnecessary.
7
8
8
COLO-compare can get vnet header length from filter,
9
Less checkpoint more efficiency.
9
Add vnet_hdr_len to struct packet and output packet with
10
the vnet_hdr_len.
11
10
12
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
11
Cc: Zhang Chen <zhangckid@gmail.com>
12
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>
13
Cc: Jason Wang <jasowang@redhat.com>
14
Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
13
Signed-off-by: Jason Wang <jasowang@redhat.com>
15
Signed-off-by: Jason Wang <jasowang@redhat.com>
14
---
16
---
15
net/colo-compare.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++-------
17
net/colo-compare.c | 13 ++++++++-----
16
qemu-options.hx | 4 ++--
18
1 file changed, 8 insertions(+), 5 deletions(-)
17
2 files changed, 55 insertions(+), 9 deletions(-)
18
19
19
diff --git a/net/colo-compare.c b/net/colo-compare.c
20
diff --git a/net/colo-compare.c b/net/colo-compare.c
20
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
21
--- a/net/colo-compare.c
22
--- a/net/colo-compare.c
22
+++ b/net/colo-compare.c
23
+++ b/net/colo-compare.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct CompareState {
24
@@ -XXX,XX +XXX,XX @@ static int colo_insert_packet(GQueue *queue, Packet *pkt)
24
CharBackend chr_out;
25
* Return 0 on success, if return -1 means the pkt
25
SocketReadState pri_rs;
26
* is unsupported(arp and ipv6) and will be sent later
26
SocketReadState sec_rs;
27
*/
27
+ bool vnet_hdr;
28
-static int packet_enqueue(CompareState *s, int mode)
28
29
+static int packet_enqueue(CompareState *s, int mode, Connection **con)
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)
40
{
30
{
41
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
31
ConnectionKey key;
32
Packet *pkt = NULL;
33
@@ -XXX,XX +XXX,XX @@ static int packet_enqueue(CompareState *s, int mode)
34
"drop packet");
42
}
35
}
43
44
if (result) {
45
- ret = compare_chr_send(s, pkt->data, pkt->size);
46
+ ret = compare_chr_send(s,
47
+ pkt->data,
48
+ pkt->size,
49
+ pkt->vnet_hdr_len);
50
if (ret < 0) {
51
error_report("colo_send_primary_packet failed");
52
}
53
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
54
55
static int compare_chr_send(CompareState *s,
56
const uint8_t *buf,
57
- uint32_t size)
58
+ uint32_t size,
59
+ uint32_t vnet_hdr_len)
60
{
61
int ret = 0;
62
uint32_t len = htonl(size);
63
@@ -XXX,XX +XXX,XX @@ static int compare_chr_send(CompareState *s,
64
goto err;
65
}
36
}
66
37
+ con = &conn;
67
+ if (s->vnet_hdr) {
38
68
+ /*
39
return 0;
69
+ * We send vnet header len make other module(like filter-redirector)
70
+ * know how to parse net packet correctly.
71
+ */
72
+ len = htonl(vnet_hdr_len);
73
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
74
+ if (ret != sizeof(len)) {
75
+ goto err;
76
+ }
77
+ }
78
+
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);
84
}
40
}
85
41
@@ -XXX,XX +XXX,XX @@ static void compare_set_vnet_hdr(Object *obj,
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)
42
static void compare_pri_rs_finalize(SocketReadState *pri_rs)
103
{
43
{
104
CompareState *s = container_of(pri_rs, CompareState, pri_rs);
44
CompareState *s = container_of(pri_rs, CompareState, pri_rs);
105
45
+ Connection *conn = NULL;
106
if (packet_enqueue(s, PRIMARY_IN)) {
46
47
- if (packet_enqueue(s, PRIMARY_IN)) {
48
+ if (packet_enqueue(s, PRIMARY_IN, &conn)) {
107
trace_colo_compare_main("primary: unsupported packet in");
49
trace_colo_compare_main("primary: unsupported packet in");
108
- compare_chr_send(s, pri_rs->buf, pri_rs->packet_len);
50
compare_chr_send(s,
109
+ compare_chr_send(s,
51
pri_rs->buf,
110
+ pri_rs->buf,
52
@@ -XXX,XX +XXX,XX @@ static void compare_pri_rs_finalize(SocketReadState *pri_rs)
111
+ pri_rs->packet_len,
53
pri_rs->vnet_hdr_len);
112
+ pri_rs->vnet_hdr_len);
113
} else {
54
} else {
114
/* compare connection */
55
/* compare connection */
115
g_queue_foreach(&s->conn_list, colo_compare_connection, s);
56
- g_queue_foreach(&s->conn_list, colo_compare_connection, s);
116
@@ -XXX,XX +XXX,XX @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
57
+ colo_compare_connection(conn, s);
117
return;
118
}
58
}
119
59
}
120
- net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
60
121
- net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
61
static void compare_sec_rs_finalize(SocketReadState *sec_rs)
122
+ net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, s->vnet_hdr);
62
{
123
+ net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, s->vnet_hdr);
63
CompareState *s = container_of(sec_rs, CompareState, sec_rs);
124
64
+ Connection *conn = NULL;
125
g_queue_init(&s->conn_list);
65
126
66
- if (packet_enqueue(s, SECONDARY_IN)) {
127
@@ -XXX,XX +XXX,XX @@ static void colo_flush_packets(void *opaque, void *user_data)
67
+ if (packet_enqueue(s, SECONDARY_IN, &conn)) {
128
68
trace_colo_compare_main("secondary: unsupported packet in");
129
while (!g_queue_is_empty(&conn->primary_list)) {
69
} else {
130
pkt = g_queue_pop_head(&conn->primary_list);
70
/* compare connection */
131
- compare_chr_send(s, pkt->data, pkt->size);
71
- g_queue_foreach(&s->conn_list, colo_compare_connection, s);
132
+ compare_chr_send(s,
72
+ colo_compare_connection(conn, s);
133
+ pkt->data,
134
+ pkt->size,
135
+ pkt->vnet_hdr_len);
136
packet_destroy(pkt, NULL);
137
}
73
}
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
}
74
}
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.
178
75
179
--
76
--
180
2.7.4
77
2.7.4
181
78
182
79
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
2
2
3
This patch change the compare_chr_send() parameter from CharBackend to CompareState,
3
Cc: Zhang Chen <zhangckid@gmail.com>
4
we can get more information like vnet_hdr(We use it to support packet with vnet_header).
4
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>
5
5
Cc: Jason Wang <jasowang@redhat.com>
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
6
Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
7
Signed-off-by: Zhang Chen <zhangckid@gmail.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
---
9
net/colo-compare.c | 14 +++++++-------
10
net/colo-compare.c | 8 +++++---
10
1 file changed, 7 insertions(+), 7 deletions(-)
11
1 file changed, 5 insertions(+), 3 deletions(-)
11
12
12
diff --git a/net/colo-compare.c b/net/colo-compare.c
13
diff --git a/net/colo-compare.c b/net/colo-compare.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/net/colo-compare.c
15
--- a/net/colo-compare.c
15
+++ b/net/colo-compare.c
16
+++ b/net/colo-compare.c
16
@@ -XXX,XX +XXX,XX @@ enum {
17
@@ -XXX,XX +XXX,XX @@ static void colo_old_packet_check(void *opaque)
17
SECONDARY_IN,
18
18
};
19
/*
19
20
* Called from the compare thread on the primary
20
-static int compare_chr_send(CharBackend *out,
21
- * for compare connection
21
+static int compare_chr_send(CompareState *s,
22
+ * for compare packet with secondary list of the
22
const uint8_t *buf,
23
+ * specified connection when a new packet was
23
uint32_t size);
24
+ * queued to it.
24
25
*/
25
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
26
static void colo_compare_connection(void *opaque, void *user_data)
26
}
27
{
27
28
@@ -XXX,XX +XXX,XX @@ static void compare_pri_rs_finalize(SocketReadState *pri_rs)
28
if (result) {
29
pri_rs->packet_len,
29
- ret = compare_chr_send(&s->chr_out, pkt->data, pkt->size);
30
pri_rs->vnet_hdr_len);
30
+ ret = compare_chr_send(s, pkt->data, pkt->size);
31
} else {
31
if (ret < 0) {
32
- /* compare connection */
32
error_report("colo_send_primary_packet failed");
33
+ /* compare packet in the specified connection */
33
}
34
colo_compare_connection(conn, s);
34
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
35
}
35
}
36
}
36
}
37
37
@@ -XXX,XX +XXX,XX @@ static void compare_sec_rs_finalize(SocketReadState *sec_rs)
38
-static int compare_chr_send(CharBackend *out,
38
if (packet_enqueue(s, SECONDARY_IN, &conn)) {
39
+static int compare_chr_send(CompareState *s,
39
trace_colo_compare_main("secondary: unsupported packet in");
40
const uint8_t *buf,
40
} else {
41
uint32_t size)
41
- /* compare connection */
42
{
42
+ /* compare packet in the specified connection */
43
@@ -XXX,XX +XXX,XX @@ static int compare_chr_send(CharBackend *out,
43
colo_compare_connection(conn, s);
44
return 0;
45
}
44
}
46
45
}
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
--
46
--
77
2.7.4
47
2.7.4
78
48
79
49
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
2
2
3
We can use this property flush and send packet with vnet_hdr_len.
3
Consolidate the code that extract the ip address(src,dst) and
4
port number(src,dst) of the packet into a separate routine
5
extract_ip_and_port() since the same chunk of code is called
6
from two place.
4
7
5
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
8
Cc: Zhang Chen <zhangckid@gmail.com>
9
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>
10
Cc: Jason Wang <jasowang@redhat.com>
11
Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
---
13
---
8
net/colo-compare.c | 8 ++++++--
14
net/colo.c | 18 ++++++++++--------
9
net/colo.c | 3 ++-
15
net/colo.h | 1 +
10
net/colo.h | 4 +++-
16
2 files changed, 11 insertions(+), 8 deletions(-)
11
net/filter-rewriter.c | 2 +-
12
4 files changed, 12 insertions(+), 5 deletions(-)
13
17
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
18
diff --git a/net/colo.c b/net/colo.c
35
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
36
--- a/net/colo.c
20
--- a/net/colo.c
37
+++ b/net/colo.c
21
+++ b/net/colo.c
38
@@ -XXX,XX +XXX,XX @@ void connection_destroy(void *opaque)
22
@@ -XXX,XX +XXX,XX @@ int parse_packet_early(Packet *pkt)
39
g_slice_free(Connection, conn);
23
return 0;
40
}
24
}
41
25
42
-Packet *packet_new(const void *data, int size)
26
+void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key, Packet *pkt)
43
+Packet *packet_new(const void *data, int size, int vnet_hdr_len)
27
+{
28
+ key->src = pkt->ip->ip_src;
29
+ key->dst = pkt->ip->ip_dst;
30
+ key->src_port = ntohs(tmp_ports >> 16);
31
+ key->dst_port = ntohs(tmp_ports & 0xffff);
32
+}
33
+
34
void fill_connection_key(Packet *pkt, ConnectionKey *key)
44
{
35
{
45
Packet *pkt = g_slice_new(Packet);
36
uint32_t tmp_ports;
46
37
@@ -XXX,XX +XXX,XX @@ void fill_connection_key(Packet *pkt, ConnectionKey *key)
47
pkt->data = g_memdup(data, size);
38
case IPPROTO_SCTP:
48
pkt->size = size;
39
case IPPROTO_UDPLITE:
49
pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST);
40
tmp_ports = *(uint32_t *)(pkt->transport_header);
50
+ pkt->vnet_hdr_len = vnet_hdr_len;
41
- key->src = pkt->ip->ip_src;
51
42
- key->dst = pkt->ip->ip_dst;
52
return pkt;
43
- key->src_port = ntohs(tmp_ports & 0xffff);
53
}
44
- key->dst_port = ntohs(tmp_ports >> 16);
45
+ extract_ip_and_port(tmp_ports, key, pkt);
46
break;
47
case IPPROTO_AH:
48
tmp_ports = *(uint32_t *)(pkt->transport_header + 4);
49
- key->src = pkt->ip->ip_src;
50
- key->dst = pkt->ip->ip_dst;
51
- key->src_port = ntohs(tmp_ports & 0xffff);
52
- key->dst_port = ntohs(tmp_ports >> 16);
53
+ extract_ip_and_port(tmp_ports, key, pkt);
54
break;
55
default:
56
break;
54
diff --git a/net/colo.h b/net/colo.h
57
diff --git a/net/colo.h b/net/colo.h
55
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
56
--- a/net/colo.h
59
--- a/net/colo.h
57
+++ b/net/colo.h
60
+++ b/net/colo.h
58
@@ -XXX,XX +XXX,XX @@ typedef struct Packet {
61
@@ -XXX,XX +XXX,XX @@ typedef struct Connection {
59
int size;
62
uint32_t connection_key_hash(const void *opaque);
60
/* Time of packet creation, in wall clock ms */
63
int connection_key_equal(const void *opaque1, const void *opaque2);
61
int64_t creation_ms;
64
int parse_packet_early(Packet *pkt);
62
+ /* Get vnet_hdr_len from filter */
65
+void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key, Packet *pkt);
63
+ uint32_t vnet_hdr_len;
66
void fill_connection_key(Packet *pkt, ConnectionKey *key);
64
} Packet;
67
void reverse_connection_key(ConnectionKey *key);
65
68
Connection *connection_new(ConnectionKey *key);
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
--
69
--
90
2.7.4
70
2.7.4
91
71
92
72
diff view generated by jsdifflib
1
From: Michal Privoznik <mprivozn@redhat.com>
1
From: Mike Nawrocki <michael.nawrocki@gtri.gatech.edu>
2
2
3
We have a function that checks if given number is power of two.
3
The simple transmission mode was treating the area immediately after the
4
We should prefer it instead of expanding the check on our own.
4
transmit command block (TCB) as if it were a transmit buffer descriptor,
5
when in reality it is simply the packet data. This change simply copies
6
the data following the TCB into the packet buffer.
5
7
6
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
8
Signed-off-by: Mike Nawrocki <michael.nawrocki@gtri.gatech.edu>
9
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
10
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
11
---
9
hw/net/virtio-net.c | 2 +-
12
hw/net/eepro100.c | 18 +++---------------
10
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 3 insertions(+), 15 deletions(-)
11
14
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
15
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/virtio-net.c
17
--- a/hw/net/eepro100.c
15
+++ b/hw/net/virtio-net.c
18
+++ b/hw/net/eepro100.c
16
@@ -XXX,XX +XXX,XX @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ static void tx_command(EEPRO100State *s)
17
*/
20
}
18
if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE ||
21
assert(tcb_bytes <= sizeof(buf));
19
n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE ||
22
while (size < tcb_bytes) {
20
- (n->net_conf.rx_queue_size & (n->net_conf.rx_queue_size - 1))) {
23
- uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev, tbd_address);
21
+ !is_power_of_2(n->net_conf.rx_queue_size)) {
24
- uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev, tbd_address + 4);
22
error_setg(errp, "Invalid rx_queue_size (= %" PRIu16 "), "
25
-#if 0
23
"must be a power of 2 between %d and %d.",
26
- uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6);
24
n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE,
27
-#endif
28
- if (tx_buffer_size == 0) {
29
- /* Prevent an endless loop. */
30
- logout("loop in %s:%u\n", __FILE__, __LINE__);
31
- break;
32
- }
33
- tbd_address += 8;
34
TRACE(RXTX, logout
35
("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
36
- tx_buffer_address, tx_buffer_size));
37
- tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
38
- pci_dma_read(&s->dev, tx_buffer_address, &buf[size], tx_buffer_size);
39
- size += tx_buffer_size;
40
+ tbd_address, tcb_bytes));
41
+ pci_dma_read(&s->dev, tbd_address, &buf[size], tcb_bytes);
42
+ size += tcb_bytes;
43
}
44
if (tbd_array == 0xffffffff) {
45
/* Simplified mode. Was already handled by code above. */
25
--
46
--
26
2.7.4
47
2.7.4
27
48
28
49
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Mike Nawrocki <michael.nawrocki@gtri.gatech.edu>
2
2
3
We add the vnet_hdr_support option for filter-rewriter, default is disabled.
3
Adds a new PCI ID for the i82559a (0x8086 0x1030) interface. The
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
4
"x-use-alt-device-id" property controls whether this new ID is to be
5
You can use it for example:
5
used, and is true by default, and set to false in a compat entry.
6
-object filter-rewriter,id=rew0,netdev=hn0,queue=all,vnet_hdr_support
7
6
8
We get the vnet_hdr_len from NetClientState that make us
7
Signed-off-by: Mike Nawrocki <michael.nawrocki@gtri.gatech.edu>
9
parse net packet correctly.
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
10
11
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
Signed-off-by: Jason Wang <jasowang@redhat.com>
13
---
10
---
14
net/filter-rewriter.c | 37 ++++++++++++++++++++++++++++++++++++-
11
hw/net/eepro100.c | 13 +++++++++++++
15
qemu-options.hx | 4 ++--
12
include/hw/compat.h | 4 ++++
16
2 files changed, 38 insertions(+), 3 deletions(-)
13
include/hw/pci/pci.h | 1 +
14
qemu-options.hx | 2 +-
15
4 files changed, 19 insertions(+), 1 deletion(-)
17
16
18
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
17
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
19
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
20
--- a/net/filter-rewriter.c
19
--- a/hw/net/eepro100.c
21
+++ b/net/filter-rewriter.c
20
+++ b/hw/net/eepro100.c
22
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ typedef struct {
23
#include "qemu-common.h"
22
const char *name;
24
#include "qapi/error.h"
23
const char *desc;
25
#include "qapi/qmp/qerror.h"
24
uint16_t device_id;
26
+#include "qemu/error-report.h"
25
+ uint16_t alt_device_id;
27
#include "qapi-visit.h"
26
uint8_t revision;
28
#include "qom/object.h"
27
uint16_t subsystem_vendor_id;
29
#include "qemu/main-loop.h"
28
uint16_t subsystem_id;
30
@@ -XXX,XX +XXX,XX @@ typedef struct RewriterState {
29
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
NetQueue *incoming_queue;
30
/* Quasi static device properties (no need to save them). */
32
/* hashtable to save connection */
31
uint16_t stats_size;
33
GHashTable *connection_track_table;
32
bool has_extended_tcb_support;
34
+ bool vnet_hdr;
33
+ bool use_alt_device_id;
35
} RewriterState;
34
} EEPRO100State;
36
35
37
static void filter_rewriter_flush(NetFilterState *nf)
36
/* Word indices in EEPROM. */
38
@@ -XXX,XX +XXX,XX @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf,
37
@@ -XXX,XX +XXX,XX @@ static void e100_nic_realize(PCIDevice *pci_dev, Error **errp)
39
ConnectionKey key;
38
40
Packet *pkt;
39
TRACE(OTHER, logout("\n"));
41
ssize_t size = iov_size(iov, iovcnt);
40
42
+ ssize_t vnet_hdr_len = 0;
41
+ /* By default, the i82559a adapter uses the legacy PCI ID (for the
43
char *buf = g_malloc0(size);
42
+ * i82557). This allows the PCI ID to be changed to the alternate
44
43
+ * i82559 ID if needed.
45
iov_to_buf(iov, iovcnt, 0, buf, size);
44
+ */
46
- pkt = packet_new(buf, size, 0);
45
+ if (s->use_alt_device_id && strcmp(info->name, "i82559a") == 0) {
47
+
46
+ pci_config_set_device_id(s->dev.config, info->alt_device_id);
48
+ if (s->vnet_hdr) {
49
+ vnet_hdr_len = nf->netdev->vnet_hdr_len;
50
+ }
47
+ }
51
+
48
+
52
+ pkt = packet_new(buf, size, vnet_hdr_len);
49
s->device = info->device;
53
g_free(buf);
50
54
51
e100_pci_reset(s, &local_err);
55
/*
52
@@ -XXX,XX +XXX,XX @@ static E100PCIDeviceInfo e100_devices[] = {
56
@@ -XXX,XX +XXX,XX @@ static void colo_rewriter_setup(NetFilterState *nf, Error **errp)
53
.desc = "Intel i82559A Ethernet",
57
s->incoming_queue = qemu_new_net_queue(qemu_netfilter_pass_to_next, nf);
54
.device = i82559A,
58
}
55
.device_id = PCI_DEVICE_ID_INTEL_82557,
59
56
+ .alt_device_id = PCI_DEVICE_ID_INTEL_82559,
60
+static bool filter_rewriter_get_vnet_hdr(Object *obj, Error **errp)
57
.revision = 0x06,
61
+{
58
.stats_size = 80,
62
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
59
.has_extended_tcb_support = true,
63
+
60
@@ -XXX,XX +XXX,XX @@ static E100PCIDeviceInfo *eepro100_get_class(EEPRO100State *s)
64
+ return s->vnet_hdr;
61
65
+}
62
static Property e100_properties[] = {
66
+
63
DEFINE_NIC_PROPERTIES(EEPRO100State, conf),
67
+static void filter_rewriter_set_vnet_hdr(Object *obj,
64
+ DEFINE_PROP_BOOL("x-use-alt-device-id", EEPRO100State, use_alt_device_id,
68
+ bool value,
65
+ true),
69
+ Error **errp)
66
DEFINE_PROP_END_OF_LIST(),
70
+{
71
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
72
+
73
+ s->vnet_hdr = value;
74
+}
75
+
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)
87
{
88
NetFilterClass *nfc = NETFILTER_CLASS(oc);
89
@@ -XXX,XX +XXX,XX @@ static const TypeInfo colo_rewriter_info = {
90
.name = TYPE_FILTER_REWRITER,
91
.parent = TYPE_NETFILTER,
92
.class_init = colo_rewriter_class_init,
93
+ .instance_init = filter_rewriter_init,
94
.instance_size = sizeof(RewriterState),
95
};
67
};
96
68
69
diff --git a/include/hw/compat.h b/include/hw/compat.h
70
index XXXXXXX..XXXXXXX 100644
71
--- a/include/hw/compat.h
72
+++ b/include/hw/compat.h
73
@@ -XXX,XX +XXX,XX @@
74
.driver = "virtio-tablet-device",\
75
.property = "wheel-axis",\
76
.value = "false",\
77
+ },{\
78
+ .driver = "i82559a",\
79
+ .property = "x-use-alt-device-id",\
80
+ .value = "false",\
81
},
82
83
#define HW_COMPAT_2_9 \
84
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
85
index XXXXXXX..XXXXXXX 100644
86
--- a/include/hw/pci/pci.h
87
+++ b/include/hw/pci/pci.h
88
@@ -XXX,XX +XXX,XX @@ extern bool pci_available;
89
/* Intel (0x8086) */
90
#define PCI_DEVICE_ID_INTEL_82551IT 0x1209
91
#define PCI_DEVICE_ID_INTEL_82557 0x1229
92
+#define PCI_DEVICE_ID_INTEL_82559 0x1030
93
#define PCI_DEVICE_ID_INTEL_82801IR 0x2922
94
95
/* Red Hat / Qumranet (for QEMU) -- see pci-ids.txt */
97
diff --git a/qemu-options.hx b/qemu-options.hx
96
diff --git a/qemu-options.hx b/qemu-options.hx
98
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
99
--- a/qemu-options.hx
98
--- a/qemu-options.hx
100
+++ b/qemu-options.hx
99
+++ 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
100
@@ -XXX,XX +XXX,XX @@ that the card should have; this option currently only affects virtio cards; set
102
be the same. we can just use indev or outdev, but at least one of indev or outdev
101
@var{v} = 0 to disable MSI-X. If no @option{-net} option is specified, a single
103
need to be specified.
102
NIC is created. QEMU can emulate several different models of network card.
104
103
Valid values for @var{type} are
105
-@item -object filter-rewriter,id=@var{id},netdev=@var{netdevid}[,queue=@var{all|rx|tx}]
104
-@code{virtio}, @code{i82551}, @code{i82557b}, @code{i82559er},
106
+@item -object filter-rewriter,id=@var{id},netdev=@var{netdevid},queue=@var{all|rx|tx},[vnet_hdr_support]
105
+@code{virtio}, @code{i82551}, @code{i82557b}, @code{i82559a}, @code{i82559er},
107
106
@code{ne2k_pci}, @code{ne2k_isa}, @code{pcnet}, @code{rtl8139},
108
Filter-rewriter is a part of COLO project.It will rewrite tcp packet to
107
@code{e1000}, @code{smc91c111}, @code{lance} and @code{mcf_fec}.
109
secondary from primary to keep secondary tcp connection,and rewrite
108
Not all devices are supported on all targets. Use @code{-net nic,model=help}
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:
116
--
109
--
117
2.7.4
110
2.7.4
118
111
119
112
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Jens Freimann <jfreimann@redhat.com>
2
2
3
We add a flag to decide whether net_fill_rstate() need read
3
This fixes coverity issue CID1005339.
4
the vnet_hdr_len or not.
5
4
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
5
Make sure that saddr is not used uninitialized if the
7
Suggested-by: Jason Wang <jasowang@redhat.com>
6
mcast parameter is NULL.
7
8
Cc: qemu-stable@nongnu.org
9
Reported-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
11
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
---
12
---
10
include/net/net.h | 9 +++++++--
13
net/socket.c | 2 +-
11
net/colo-compare.c | 4 ++--
14
1 file changed, 1 insertion(+), 1 deletion(-)
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
15
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
16
diff --git a/net/socket.c b/net/socket.c
143
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
144
--- a/net/socket.c
18
--- a/net/socket.c
145
+++ b/net/socket.c
19
+++ 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,
20
@@ -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);
21
net_socket_read_poll(s, true);
162
22
163
/* mcast: save bound address as dst */
23
/* mcast: save bound address as dst */
164
@@ -XXX,XX +XXX,XX @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
24
- if (is_connected) {
165
25
+ if (is_connected && mcast != NULL) {
166
s->fd = fd;
26
s->dgram_dst = saddr;
167
s->listen_fd = -1;
27
snprintf(nc->info_str, sizeof(nc->info_str),
168
- net_socket_rs_init(&s->rs, net_socket_rs_finalize);
28
"socket: fd=%d (cloned mcast=%s:%d)",
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
--
29
--
183
2.7.4
30
2.7.4
184
31
185
32
diff view generated by jsdifflib
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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
Deleted patch
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
2
1
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