1
The following changes since commit 6632f6ff96f0537fc34cdc00c760656fc62e23c5:
1
The following changes since commit 99d6b11b5b44d7dd64f4cb1973184e40a4a174f8:
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 tag 'pull-target-arm-20220922' of https://git.linaro.org/people/pmaydell/qemu-arm into staging (2022-09-26 13:38:26 -0400)
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 bf769f742c3624952f125b303878a77ea870c156:
10
10
11
virtio-net: fix offload ctrl endian (2017-07-17 20:13:56 +0800)
11
virtio: del net client if net_init_tap_one failed (2022-09-27 15:14:37 +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
Ding Hui (1):
17
e1000e: set RX desc status with DD flag in a separate operation
17
18
18
----------------------------------------------------------------
19
Eugenio Pérez (6):
19
Jason Wang (1):
20
vdpa: Make VhostVDPAState cvq_cmd_in_buffer control ack type
20
virtio-net: fix offload ctrl endian
21
vdpa: extract vhost_vdpa_net_load_mac from vhost_vdpa_net_load
22
vdpa: Add vhost_vdpa_net_load_mq
23
vdpa: validate MQ CVQ commands
24
virtio-net: Update virtio-net curr_queue_pairs in vdpa backends
25
vdpa: Allow MQ feature in SVQ
21
26
22
Michal Privoznik (1):
27
lu zhipeng (1):
23
virtion-net: Prefer is_power_of_2()
28
virtio: del net client if net_init_tap_one failed
24
29
25
Zhang Chen (12):
30
hw/net/e1000e_core.c | 53 ++++++++++++++++++++++-
26
net: Add vnet_hdr_len arguments in NetClientState
31
hw/net/virtio-net.c | 17 +++-----
27
net/net.c: Add vnet_hdr support in SocketReadState
32
net/tap.c | 18 +++++---
28
net/filter-mirror.c: Introduce parameter for filter_send()
33
net/vhost-vdpa.c | 119 +++++++++++++++++++++++++++++++++++++--------------
29
net/filter-mirror.c: Make filter mirror support vnet support.
34
4 files changed, 157 insertions(+), 50 deletions(-)
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
38
35
39
docs/colo-proxy.txt | 26 ++++++++++++++++
36
Ding Hui (1):
40
hw/net/virtio-net.c | 4 ++-
37
e1000e: set RX desc status with DD flag in a separate operation
41
include/net/net.h | 10 ++++--
38
42
net/colo-compare.c | 84 ++++++++++++++++++++++++++++++++++++++++++---------
39
Eugenio Pérez (6):
43
net/colo.c | 9 +++---
40
vdpa: Make VhostVDPAState cvq_cmd_in_buffer control ack type
44
net/colo.h | 4 ++-
41
vdpa: extract vhost_vdpa_net_load_mac from vhost_vdpa_net_load
45
net/filter-mirror.c | 75 +++++++++++++++++++++++++++++++++++++++++----
42
vdpa: Add vhost_vdpa_net_load_mq
46
net/filter-rewriter.c | 37 ++++++++++++++++++++++-
43
vdpa: validate MQ CVQ commands
47
net/net.c | 37 ++++++++++++++++++++---
44
virtio-net: Update virtio-net curr_queue_pairs in vdpa backends
48
net/socket.c | 8 ++---
45
vdpa: Allow MQ feature in SVQ
49
qemu-options.hx | 19 ++++++------
46
50
11 files changed, 265 insertions(+), 48 deletions(-)
47
lu zhipeng (1):
48
virtio: del net client if net_init_tap_one failed
49
50
hw/net/e1000e_core.c | 53 ++++++++++++++++++++++-
51
hw/net/virtio-net.c | 17 +++-----
52
net/tap.c | 18 +++++---
53
net/vhost-vdpa.c | 119 +++++++++++++++++++++++++++++++++++++--------------
54
4 files changed, 157 insertions(+), 50 deletions(-)
55
56
--
57
2.7.4
51
58
52
59
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Ding Hui <dinghui@sangfor.com.cn>
2
2
3
We add the vnet_hdr_support option for colo-compare, default is disabled.
3
Like commit 034d00d48581 ("e1000: set RX descriptor status in
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
4
a separate operation"), there is also same issue in e1000e, which
5
You can use it for example:
5
would cause lost packets or stop sending packets to VM with DPDK.
6
-object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,vnet_hdr_support
7
6
8
COLO-compare can get vnet header length from filter,
7
Do similar fix in e1000e.
9
Add vnet_hdr_len to struct packet and output packet with
10
the vnet_hdr_len.
11
8
12
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
9
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/402
10
Signed-off-by: Ding Hui <dinghui@sangfor.com.cn>
13
Signed-off-by: Jason Wang <jasowang@redhat.com>
11
Signed-off-by: Jason Wang <jasowang@redhat.com>
14
---
12
---
15
net/colo-compare.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++-------
13
hw/net/e1000e_core.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-
16
qemu-options.hx | 4 ++--
14
1 file changed, 52 insertions(+), 1 deletion(-)
17
2 files changed, 55 insertions(+), 9 deletions(-)
18
15
19
diff --git a/net/colo-compare.c b/net/colo-compare.c
16
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/net/colo-compare.c
18
--- a/hw/net/e1000e_core.c
22
+++ b/net/colo-compare.c
19
+++ b/hw/net/e1000e_core.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct CompareState {
20
@@ -XXX,XX +XXX,XX @@ struct NetRxPkt *pkt, const E1000E_RSSInfo *rss_info,
24
CharBackend chr_out;
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)
40
{
41
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
42
}
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
}
21
}
66
22
}
67
+ if (s->vnet_hdr) {
23
68
+ /*
24
+static inline void
69
+ * We send vnet header len make other module(like filter-redirector)
25
+e1000e_pci_dma_write_rx_desc(E1000ECore *core, dma_addr_t addr,
70
+ * know how to parse net packet correctly.
26
+ uint8_t *desc, dma_addr_t len)
71
+ */
27
+{
72
+ len = htonl(vnet_hdr_len);
28
+ PCIDevice *dev = core->owner;
73
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
29
+
74
+ if (ret != sizeof(len)) {
30
+ if (e1000e_rx_use_legacy_descriptor(core)) {
75
+ goto err;
31
+ struct e1000_rx_desc *d = (struct e1000_rx_desc *) desc;
32
+ size_t offset = offsetof(struct e1000_rx_desc, status);
33
+ uint8_t status = d->status;
34
+
35
+ d->status &= ~E1000_RXD_STAT_DD;
36
+ pci_dma_write(dev, addr, desc, len);
37
+
38
+ if (status & E1000_RXD_STAT_DD) {
39
+ d->status = status;
40
+ pci_dma_write(dev, addr + offset, &status, sizeof(status));
41
+ }
42
+ } else {
43
+ if (core->mac[RCTL] & E1000_RCTL_DTYP_PS) {
44
+ union e1000_rx_desc_packet_split *d =
45
+ (union e1000_rx_desc_packet_split *) desc;
46
+ size_t offset = offsetof(union e1000_rx_desc_packet_split,
47
+ wb.middle.status_error);
48
+ uint32_t status = d->wb.middle.status_error;
49
+
50
+ d->wb.middle.status_error &= ~E1000_RXD_STAT_DD;
51
+ pci_dma_write(dev, addr, desc, len);
52
+
53
+ if (status & E1000_RXD_STAT_DD) {
54
+ d->wb.middle.status_error = status;
55
+ pci_dma_write(dev, addr + offset, &status, sizeof(status));
56
+ }
57
+ } else {
58
+ union e1000_rx_desc_extended *d =
59
+ (union e1000_rx_desc_extended *) desc;
60
+ size_t offset = offsetof(union e1000_rx_desc_extended,
61
+ wb.upper.status_error);
62
+ uint32_t status = d->wb.upper.status_error;
63
+
64
+ d->wb.upper.status_error &= ~E1000_RXD_STAT_DD;
65
+ pci_dma_write(dev, addr, desc, len);
66
+
67
+ if (status & E1000_RXD_STAT_DD) {
68
+ d->wb.upper.status_error = status;
69
+ pci_dma_write(dev, addr + offset, &status, sizeof(status));
70
+ }
76
+ }
71
+ }
77
+ }
72
+ }
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
}
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
+}
73
+}
92
+
74
+
93
+static void compare_set_vnet_hdr(Object *obj,
75
typedef struct e1000e_ba_state_st {
94
+ bool value,
76
uint16_t written[MAX_PS_BUFFERS];
95
+ Error **errp)
77
uint8_t cur_idx;
96
+{
78
@@ -XXX,XX +XXX,XX @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
97
+ CompareState *s = COLO_COMPARE(obj);
79
98
+
80
e1000e_write_rx_descr(core, desc, is_last ? core->rx_pkt : NULL,
99
+ s->vnet_hdr = value;
81
rss_info, do_ps ? ps_hdr_len : 0, &bastate.written);
100
+}
82
- pci_dma_write(d, base, &desc, core->rx_desc_len);
101
+
83
+ e1000e_pci_dma_write_rx_desc(core, base, desc, core->rx_desc_len);
102
static void compare_pri_rs_finalize(SocketReadState *pri_rs)
84
103
{
85
e1000e_ring_advance(core, rxi,
104
CompareState *s = container_of(pri_rs, CompareState, pri_rs);
86
core->rx_desc_len / E1000_MIN_RX_DESC_LEN);
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.
178
179
--
87
--
180
2.7.4
88
2.7.4
181
182
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
This patch change the compare_chr_send() parameter from CharBackend to CompareState,
3
This allows to simplify the code. Rename to status while we're at it.
4
we can get more information like vnet_hdr(We use it to support packet with vnet_header).
5
4
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
5
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
7
---
9
net/colo-compare.c | 14 +++++++-------
8
net/vhost-vdpa.c | 23 ++++++++++++-----------
10
1 file changed, 7 insertions(+), 7 deletions(-)
9
1 file changed, 12 insertions(+), 11 deletions(-)
11
10
12
diff --git a/net/colo-compare.c b/net/colo-compare.c
11
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/net/colo-compare.c
13
--- a/net/vhost-vdpa.c
15
+++ b/net/colo-compare.c
14
+++ b/net/vhost-vdpa.c
16
@@ -XXX,XX +XXX,XX @@ enum {
15
@@ -XXX,XX +XXX,XX @@ typedef struct VhostVDPAState {
17
SECONDARY_IN,
16
VHostNetState *vhost_net;
18
};
17
19
18
/* Control commands shadow buffers */
20
-static int compare_chr_send(CharBackend *out,
19
- void *cvq_cmd_out_buffer, *cvq_cmd_in_buffer;
21
+static int compare_chr_send(CompareState *s,
20
+ void *cvq_cmd_out_buffer;
22
const uint8_t *buf,
21
+ virtio_net_ctrl_ack *status;
23
uint32_t size);
22
+
24
23
bool started;
25
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
24
} VhostVDPAState;
26
}
25
27
26
@@ -XXX,XX +XXX,XX @@ static void vhost_vdpa_cleanup(NetClientState *nc)
28
if (result) {
27
struct vhost_dev *dev = &s->vhost_net->dev;
29
- ret = compare_chr_send(&s->chr_out, pkt->data, pkt->size);
28
30
+ ret = compare_chr_send(s, pkt->data, pkt->size);
29
qemu_vfree(s->cvq_cmd_out_buffer);
31
if (ret < 0) {
30
- qemu_vfree(s->cvq_cmd_in_buffer);
32
error_report("colo_send_primary_packet failed");
31
+ qemu_vfree(s->status);
33
}
32
if (dev->vq_index + dev->nvqs == dev->vq_index_end) {
34
@@ -XXX,XX +XXX,XX @@ static void colo_compare_connection(void *opaque, void *user_data)
33
g_clear_pointer(&s->vhost_vdpa.iova_tree, vhost_iova_tree_delete);
34
}
35
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_cvq_start(NetClientState *nc)
36
return r;
37
}
38
39
- r = vhost_vdpa_cvq_map_buf(&s->vhost_vdpa, s->cvq_cmd_in_buffer,
40
+ r = vhost_vdpa_cvq_map_buf(&s->vhost_vdpa, s->status,
41
vhost_vdpa_net_cvq_cmd_page_len(), true);
42
if (unlikely(r < 0)) {
43
vhost_vdpa_cvq_unmap_buf(&s->vhost_vdpa, s->cvq_cmd_out_buffer);
44
@@ -XXX,XX +XXX,XX @@ static void vhost_vdpa_net_cvq_stop(NetClientState *nc)
45
46
if (s->vhost_vdpa.shadow_vqs_enabled) {
47
vhost_vdpa_cvq_unmap_buf(&s->vhost_vdpa, s->cvq_cmd_out_buffer);
48
- vhost_vdpa_cvq_unmap_buf(&s->vhost_vdpa, s->cvq_cmd_in_buffer);
49
+ vhost_vdpa_cvq_unmap_buf(&s->vhost_vdpa, s->status);
35
}
50
}
36
}
51
}
37
52
38
-static int compare_chr_send(CharBackend *out,
53
@@ -XXX,XX +XXX,XX @@ static ssize_t vhost_vdpa_net_cvq_add(VhostVDPAState *s, size_t out_len,
39
+static int compare_chr_send(CompareState *s,
54
.iov_len = out_len,
40
const uint8_t *buf,
55
};
41
uint32_t size)
56
const struct iovec in = {
42
{
57
- .iov_base = s->cvq_cmd_in_buffer,
43
@@ -XXX,XX +XXX,XX @@ static int compare_chr_send(CharBackend *out,
58
+ .iov_base = s->status,
44
return 0;
59
.iov_len = sizeof(virtio_net_ctrl_ack),
60
};
61
VhostShadowVirtqueue *svq = g_ptr_array_index(s->vhost_vdpa.shadow_vqs, 0);
62
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_load(NetClientState *nc)
63
return dev_written;
64
}
65
66
- return *((virtio_net_ctrl_ack *)s->cvq_cmd_in_buffer) != VIRTIO_NET_OK;
67
+ return *s->status != VIRTIO_NET_OK;
45
}
68
}
46
69
47
- ret = qemu_chr_fe_write_all(out, (uint8_t *)&len, sizeof(len));
70
return 0;
48
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
71
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_handle_ctrl_avail(VhostShadowVirtqueue *svq,
49
if (ret != sizeof(len)) {
72
goto out;
50
goto err;
51
}
73
}
52
74
53
- ret = qemu_chr_fe_write_all(out, (uint8_t *)buf, size);
75
- memcpy(&status, s->cvq_cmd_in_buffer, sizeof(status));
54
+ ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
76
- if (status != VIRTIO_NET_OK) {
55
if (ret != size) {
77
+ if (*s->status != VIRTIO_NET_OK) {
56
goto err;
78
return VIRTIO_NET_ERR;
57
}
79
}
58
@@ -XXX,XX +XXX,XX @@ static void compare_pri_rs_finalize(SocketReadState *pri_rs)
80
59
81
@@ -XXX,XX +XXX,XX @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
60
if (packet_enqueue(s, PRIMARY_IN)) {
82
s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(),
61
trace_colo_compare_main("primary: unsupported packet in");
83
vhost_vdpa_net_cvq_cmd_page_len());
62
- compare_chr_send(&s->chr_out, pri_rs->buf, pri_rs->packet_len);
84
memset(s->cvq_cmd_out_buffer, 0, vhost_vdpa_net_cvq_cmd_page_len());
63
+ compare_chr_send(s, pri_rs->buf, pri_rs->packet_len);
85
- s->cvq_cmd_in_buffer = qemu_memalign(qemu_real_host_page_size(),
64
} else {
86
- vhost_vdpa_net_cvq_cmd_page_len());
65
/* compare connection */
87
- memset(s->cvq_cmd_in_buffer, 0, vhost_vdpa_net_cvq_cmd_page_len());
66
g_queue_foreach(&s->conn_list, colo_compare_connection, s);
88
+ s->status = qemu_memalign(qemu_real_host_page_size(),
67
@@ -XXX,XX +XXX,XX @@ static void colo_flush_packets(void *opaque, void *user_data)
89
+ vhost_vdpa_net_cvq_cmd_page_len());
68
90
+ memset(s->status, 0, vhost_vdpa_net_cvq_cmd_page_len());
69
while (!g_queue_is_empty(&conn->primary_list)) {
91
70
pkt = g_queue_pop_head(&conn->primary_list);
92
s->vhost_vdpa.shadow_vq_ops = &vhost_vdpa_net_svq_ops;
71
- compare_chr_send(&s->chr_out, pkt->data, pkt->size);
93
s->vhost_vdpa.shadow_vq_ops_opaque = s;
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
--
94
--
77
2.7.4
95
2.7.4
78
96
79
97
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
We add a flag to decide whether net_fill_rstate() need read
3
Since there may be many commands we need to issue to load the NIC
4
the vnet_hdr_len or not.
4
state, let's split them in individual functions
5
5
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
7
Suggested-by: Jason Wang <jasowang@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
---
8
---
10
include/net/net.h | 9 +++++++--
9
net/vhost-vdpa.c | 62 ++++++++++++++++++++++++++++++++++++--------------------
11
net/colo-compare.c | 4 ++--
10
1 file changed, 40 insertions(+), 22 deletions(-)
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
11
17
diff --git a/include/net/net.h b/include/net/net.h
12
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/include/net/net.h
14
--- a/net/vhost-vdpa.c
20
+++ b/include/net/net.h
15
+++ b/net/vhost-vdpa.c
21
@@ -XXX,XX +XXX,XX @@ typedef struct NICState {
16
@@ -XXX,XX +XXX,XX @@ static ssize_t vhost_vdpa_net_cvq_add(VhostVDPAState *s, size_t out_len,
22
} NICState;
17
return vhost_svq_poll(svq);
23
18
}
24
struct SocketReadState {
19
25
- int state; /* 0 = getting length, 1 = getting data */
20
+static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
26
+ /* 0 = getting length, 1 = getting vnet header length, 2 = getting data */
21
+ uint8_t cmd, const void *data,
27
+ int state;
22
+ size_t data_size)
28
+ /* This flag decide whether to read the vnet_hdr_len field */
23
+{
29
+ bool vnet_hdr;
24
+ const struct virtio_net_ctrl_hdr ctrl = {
30
uint32_t index;
25
+ .class = class,
31
uint32_t packet_len;
26
+ .cmd = cmd,
32
+ uint32_t vnet_hdr_len;
27
+ };
33
uint8_t buf[NET_BUFSIZE];
28
+
34
SocketReadStateFinalize *finalize;
29
+ assert(data_size < vhost_vdpa_net_cvq_cmd_page_len() - sizeof(ctrl));
35
};
30
+
36
@@ -XXX,XX +XXX,XX @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
31
+ memcpy(s->cvq_cmd_out_buffer, &ctrl, sizeof(ctrl));
37
void print_net_client(Monitor *mon, NetClientState *nc);
32
+ memcpy(s->cvq_cmd_out_buffer + sizeof(ctrl), data, data_size);
38
void hmp_info_network(Monitor *mon, const QDict *qdict);
33
+
39
void net_socket_rs_init(SocketReadState *rs,
34
+ return vhost_vdpa_net_cvq_add(s, sizeof(ctrl) + data_size,
40
- SocketReadStateFinalize *finalize);
35
+ sizeof(virtio_net_ctrl_ack));
41
+ SocketReadStateFinalize *finalize,
36
+}
42
+ bool vnet_hdr);
37
+
43
38
+static int vhost_vdpa_net_load_mac(VhostVDPAState *s, const VirtIONet *n)
44
/* NIC info */
39
+{
45
40
+ uint64_t features = n->parent_obj.guest_features;
46
diff --git a/net/colo-compare.c b/net/colo-compare.c
41
+ if (features & BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR)) {
47
index XXXXXXX..XXXXXXX 100644
42
+ ssize_t dev_written = vhost_vdpa_net_load_cmd(s, VIRTIO_NET_CTRL_MAC,
48
--- a/net/colo-compare.c
43
+ VIRTIO_NET_CTRL_MAC_ADDR_SET,
49
+++ b/net/colo-compare.c
44
+ n->mac, sizeof(n->mac));
50
@@ -XXX,XX +XXX,XX @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
45
+ if (unlikely(dev_written < 0)) {
51
return;
46
+ return dev_written;
47
+ }
48
+
49
+ return *s->status != VIRTIO_NET_OK;
50
+ }
51
+
52
+ return 0;
53
+}
54
+
55
static int vhost_vdpa_net_load(NetClientState *nc)
56
{
57
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
58
- const struct vhost_vdpa *v = &s->vhost_vdpa;
59
+ struct vhost_vdpa *v = &s->vhost_vdpa;
60
const VirtIONet *n;
61
- uint64_t features;
62
+ int r;
63
64
assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_VDPA);
65
66
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_load(NetClientState *nc)
52
}
67
}
53
68
54
- net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize);
69
n = VIRTIO_NET(v->dev->vdev);
55
- net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize);
70
- features = n->parent_obj.guest_features;
56
+ net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
71
- if (features & BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR)) {
57
+ net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
72
- const struct virtio_net_ctrl_hdr ctrl = {
58
73
- .class = VIRTIO_NET_CTRL_MAC,
59
g_queue_init(&s->conn_list);
74
- .cmd = VIRTIO_NET_CTRL_MAC_ADDR_SET,
60
75
- };
61
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
76
- char *cursor = s->cvq_cmd_out_buffer;
62
index XXXXXXX..XXXXXXX 100644
77
- ssize_t dev_written;
63
--- a/net/filter-mirror.c
78
-
64
+++ b/net/filter-mirror.c
79
- memcpy(cursor, &ctrl, sizeof(ctrl));
65
@@ -XXX,XX +XXX,XX @@ static void filter_redirector_setup(NetFilterState *nf, Error **errp)
80
- cursor += sizeof(ctrl);
66
}
81
- memcpy(cursor, n->mac, sizeof(n->mac));
82
-
83
- dev_written = vhost_vdpa_net_cvq_add(s, sizeof(ctrl) + sizeof(n->mac),
84
- sizeof(virtio_net_ctrl_ack));
85
- if (unlikely(dev_written < 0)) {
86
- return dev_written;
87
- }
88
-
89
- return *s->status != VIRTIO_NET_OK;
90
+ r = vhost_vdpa_net_load_mac(s, n);
91
+ if (unlikely(r < 0)) {
92
+ return r;
67
}
93
}
68
94
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;
95
return 0;
182
--
96
--
183
2.7.4
97
2.7.4
184
98
185
99
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
We add the vnet_hdr_support option for filter-rewriter, default is disabled.
3
Same way as with the MAC, restore the expected number of queues at
4
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
4
device's start.
5
You can use it for example:
6
-object filter-rewriter,id=rew0,netdev=hn0,queue=all,vnet_hdr_support
7
5
8
We get the vnet_hdr_len from NetClientState that make us
6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
9
parse net packet correctly.
10
11
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
13
---
8
---
14
net/filter-rewriter.c | 37 ++++++++++++++++++++++++++++++++++++-
9
net/vhost-vdpa.c | 26 ++++++++++++++++++++++++++
15
qemu-options.hx | 4 ++--
10
1 file changed, 26 insertions(+)
16
2 files changed, 38 insertions(+), 3 deletions(-)
17
11
18
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
12
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
19
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
20
--- a/net/filter-rewriter.c
14
--- a/net/vhost-vdpa.c
21
+++ b/net/filter-rewriter.c
15
+++ b/net/vhost-vdpa.c
22
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_load_mac(VhostVDPAState *s, const VirtIONet *n)
23
#include "qemu-common.h"
17
return 0;
24
#include "qapi/error.h"
18
}
25
#include "qapi/qmp/qerror.h"
19
26
+#include "qemu/error-report.h"
20
+static int vhost_vdpa_net_load_mq(VhostVDPAState *s,
27
#include "qapi-visit.h"
21
+ const VirtIONet *n)
28
#include "qom/object.h"
22
+{
29
#include "qemu/main-loop.h"
23
+ struct virtio_net_ctrl_mq mq;
30
@@ -XXX,XX +XXX,XX @@ typedef struct RewriterState {
24
+ uint64_t features = n->parent_obj.guest_features;
31
NetQueue *incoming_queue;
25
+ ssize_t dev_written;
32
/* hashtable to save connection */
33
GHashTable *connection_track_table;
34
+ bool vnet_hdr;
35
} RewriterState;
36
37
static void filter_rewriter_flush(NetFilterState *nf)
38
@@ -XXX,XX +XXX,XX @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf,
39
ConnectionKey key;
40
Packet *pkt;
41
ssize_t size = iov_size(iov, iovcnt);
42
+ ssize_t vnet_hdr_len = 0;
43
char *buf = g_malloc0(size);
44
45
iov_to_buf(iov, iovcnt, 0, buf, size);
46
- pkt = packet_new(buf, size, 0);
47
+
26
+
48
+ if (s->vnet_hdr) {
27
+ if (!(features & BIT_ULL(VIRTIO_NET_F_MQ))) {
49
+ vnet_hdr_len = nf->netdev->vnet_hdr_len;
28
+ return 0;
50
+ }
29
+ }
51
+
30
+
52
+ pkt = packet_new(buf, size, vnet_hdr_len);
31
+ mq.virtqueue_pairs = cpu_to_le16(n->curr_queue_pairs);
53
g_free(buf);
32
+ dev_written = vhost_vdpa_net_load_cmd(s, VIRTIO_NET_CTRL_MQ,
54
33
+ VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET, &mq,
55
/*
34
+ sizeof(mq));
56
@@ -XXX,XX +XXX,XX @@ static void colo_rewriter_setup(NetFilterState *nf, Error **errp)
35
+ if (unlikely(dev_written < 0)) {
57
s->incoming_queue = qemu_new_net_queue(qemu_netfilter_pass_to_next, nf);
36
+ return dev_written;
58
}
37
+ }
59
60
+static bool filter_rewriter_get_vnet_hdr(Object *obj, Error **errp)
61
+{
62
+ RewriterState *s = FILTER_COLO_REWRITER(obj);
63
+
38
+
64
+ return s->vnet_hdr;
39
+ return *s->status != VIRTIO_NET_OK;
65
+}
40
+}
66
+
41
+
67
+static void filter_rewriter_set_vnet_hdr(Object *obj,
42
static int vhost_vdpa_net_load(NetClientState *nc)
68
+ bool value,
69
+ Error **errp)
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
{
43
{
88
NetFilterClass *nfc = NETFILTER_CLASS(oc);
44
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
89
@@ -XXX,XX +XXX,XX @@ static const TypeInfo colo_rewriter_info = {
45
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_net_load(NetClientState *nc)
90
.name = TYPE_FILTER_REWRITER,
46
if (unlikely(r < 0)) {
91
.parent = TYPE_NETFILTER,
47
return r;
92
.class_init = colo_rewriter_class_init,
48
}
93
+ .instance_init = filter_rewriter_init,
49
+ r = vhost_vdpa_net_load_mq(s, n);
94
.instance_size = sizeof(RewriterState),
50
+ if (unlikely(r)) {
95
};
51
+ return r;
96
52
+ }
97
diff --git a/qemu-options.hx b/qemu-options.hx
53
98
index XXXXXXX..XXXXXXX 100644
54
return 0;
99
--- a/qemu-options.hx
55
}
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:
116
--
56
--
117
2.7.4
57
2.7.4
118
58
119
59
diff view generated by jsdifflib
1
Spec said offloads should be le64, so use virtio_ldq_p() to guarantee
1
From: Eugenio Pérez <eperezma@redhat.com>
2
valid endian.
3
2
4
Fixes: 644c98587d4c ("virtio-net: dynamic network offloads configuration")
3
So we are sure we can update the device model properly before sending to
5
Cc: qemu-stable@nongnu.org
4
the device.
6
Cc: Dmitry Fleytman <dfleytma@redhat.com>
5
6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
8
---
9
hw/net/virtio-net.c | 2 ++
9
net/vhost-vdpa.c | 9 +++++++++
10
1 file changed, 2 insertions(+)
10
1 file changed, 9 insertions(+)
11
11
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
12
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
13
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/virtio-net.c
14
--- a/net/vhost-vdpa.c
15
+++ b/hw/net/virtio-net.c
15
+++ b/net/vhost-vdpa.c
16
@@ -XXX,XX +XXX,XX @@ static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd,
16
@@ -XXX,XX +XXX,XX @@ static bool vhost_vdpa_net_cvq_validate_cmd(const void *out_buf, size_t len)
17
if (cmd == VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET) {
17
__func__, ctrl.cmd);
18
uint64_t supported_offloads;
18
};
19
19
break;
20
+ offloads = virtio_ldq_p(vdev, &offloads);
20
+ case VIRTIO_NET_CTRL_MQ:
21
+
21
+ switch (ctrl.cmd) {
22
if (!n->has_vnet_hdr) {
22
+ case VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET:
23
return VIRTIO_NET_ERR;
23
+ return true;
24
}
24
+ default:
25
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid mq cmd %u\n",
26
+ __func__, ctrl.cmd);
27
+ };
28
+ break;
29
default:
30
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid control class %u\n",
31
__func__, ctrl.class);
25
--
32
--
26
2.7.4
33
2.7.4
27
34
28
35
diff view generated by jsdifflib
1
From: Michal Privoznik <mprivozn@redhat.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
We have a function that checks if given number is power of two.
3
It was returned as error before. Instead of it, simply update the
4
We should prefer it instead of expanding the check on our own.
4
corresponding field so qemu can send it in the migration data.
5
5
6
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
6
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
7
Acked-by: Si-Wei Liu <si-wei.liu@oracle.com>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
---
9
hw/net/virtio-net.c | 2 +-
10
hw/net/virtio-net.c | 17 ++++++-----------
10
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 6 insertions(+), 11 deletions(-)
11
12
12
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
13
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/virtio-net.c
15
--- a/hw/net/virtio-net.c
15
+++ b/hw/net/virtio-net.c
16
+++ b/hw/net/virtio-net.c
16
@@ -XXX,XX +XXX,XX @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@ static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd,
17
*/
18
return VIRTIO_NET_ERR;
18
if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE ||
19
}
19
n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE ||
20
20
- (n->net_conf.rx_queue_size & (n->net_conf.rx_queue_size - 1))) {
21
- /* Avoid changing the number of queue_pairs for vdpa device in
21
+ !is_power_of_2(n->net_conf.rx_queue_size)) {
22
- * userspace handler. A future fix is needed to handle the mq
22
error_setg(errp, "Invalid rx_queue_size (= %" PRIu16 "), "
23
- * change in userspace handler with vhost-vdpa. Let's disable
23
"must be a power of 2 between %d and %d.",
24
- * the mq handling from userspace for now and only allow get
24
n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE,
25
- * done through the kernel. Ripples may be seen when falling
26
- * back to userspace, but without doing it qemu process would
27
- * crash on a recursive entry to virtio_net_set_status().
28
- */
29
+ n->curr_queue_pairs = queue_pairs;
30
if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
31
- return VIRTIO_NET_ERR;
32
+ /*
33
+ * Avoid updating the backend for a vdpa device: We're only interested
34
+ * in updating the device model queues.
35
+ */
36
+ return VIRTIO_NET_OK;
37
}
38
-
39
- n->curr_queue_pairs = queue_pairs;
40
/* stop the backend before changing the number of queue_pairs to avoid handling a
41
* disabled queue */
42
virtio_net_set_status(vdev, vdev->status);
25
--
43
--
26
2.7.4
44
2.7.4
27
45
28
46
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
3
Finally enable SVQ with MQ feature.
4
5
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
4
Signed-off-by: Jason Wang <jasowang@redhat.com>
6
Signed-off-by: Jason Wang <jasowang@redhat.com>
5
---
7
---
6
docs/colo-proxy.txt | 26 ++++++++++++++++++++++++++
8
net/vhost-vdpa.c | 1 +
7
1 file changed, 26 insertions(+)
9
1 file changed, 1 insertion(+)
8
10
9
diff --git a/docs/colo-proxy.txt b/docs/colo-proxy.txt
11
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
10
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
11
--- a/docs/colo-proxy.txt
13
--- a/net/vhost-vdpa.c
12
+++ b/docs/colo-proxy.txt
14
+++ b/net/vhost-vdpa.c
13
@@ -XXX,XX +XXX,XX @@ Secondary(ip:3.3.3.8):
15
@@ -XXX,XX +XXX,XX @@ static const uint64_t vdpa_svq_device_features =
14
-chardev socket,id=red1,host=3.3.3.3,port=9004
16
BIT_ULL(VIRTIO_NET_F_MRG_RXBUF) |
15
-object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0
17
BIT_ULL(VIRTIO_NET_F_STATUS) |
16
-object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1
18
BIT_ULL(VIRTIO_NET_F_CTRL_VQ) |
17
+-object filter-rewriter,id=f3,netdev=hn0,queue=all
19
+ BIT_ULL(VIRTIO_NET_F_MQ) |
18
+
20
BIT_ULL(VIRTIO_F_ANY_LAYOUT) |
19
+If you want to use virtio-net-pci or other driver with vnet_header:
21
BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR) |
20
+
22
BIT_ULL(VIRTIO_NET_F_RSC_EXT) |
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
--
23
--
47
2.7.4
24
2.7.4
48
25
49
26
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: lu zhipeng <luzhipeng@cestc.cn>
2
2
3
Add vnet_hdr_len arguments in NetClientState
3
If the net tap initializes successful, but failed during
4
that make other module get real vnet_hdr_len easily.
4
network card hot-plugging, the net-tap will remains,
5
so cleanup.
5
6
6
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
7
Signed-off-by: lu zhipeng <luzhipeng@cestc.cn>
7
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
8
---
9
---
9
include/net/net.h | 1 +
10
net/tap.c | 18 ++++++++++++------
10
net/net.c | 1 +
11
1 file changed, 12 insertions(+), 6 deletions(-)
11
2 files changed, 2 insertions(+)
12
12
13
diff --git a/include/net/net.h b/include/net/net.h
13
diff --git a/net/tap.c b/net/tap.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/net/net.h
15
--- a/net/tap.c
16
+++ b/include/net/net.h
16
+++ b/net/tap.c
17
@@ -XXX,XX +XXX,XX @@ struct NetClientState {
17
@@ -XXX,XX +XXX,XX @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
18
unsigned int queue_index;
18
tap_set_sndbuf(s->fd, tap, &err);
19
unsigned rxfilter_notify_enabled:1;
19
if (err) {
20
int vring_enable;
20
error_propagate(errp, err);
21
+ int vnet_hdr_len;
21
- return;
22
QTAILQ_HEAD(NetFilterHead, NetFilterState) filters;
22
+ goto failed;
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
}
23
}
32
24
33
+ nc->vnet_hdr_len = len;
25
if (tap->has_fd || tap->has_fds) {
34
nc->info->set_vnet_hdr_len(nc, len);
26
@@ -XXX,XX +XXX,XX @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
27
} else {
28
warn_report_err(err);
29
}
30
- return;
31
+ goto failed;
32
}
33
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
34
error_setg_errno(errp, errno, "%s: Can't use file descriptor %d",
35
name, fd);
36
- return;
37
+ goto failed;
38
}
39
} else {
40
vhostfd = open("/dev/vhost-net", O_RDWR);
41
@@ -XXX,XX +XXX,XX @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
42
warn_report("tap: open vhost char device failed: %s",
43
strerror(errno));
44
}
45
- return;
46
+ goto failed;
47
}
48
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
49
error_setg_errno(errp, errno, "Failed to set FD nonblocking");
50
- return;
51
+ goto failed;
52
}
53
}
54
options.opaque = (void *)(uintptr_t)vhostfd;
55
@@ -XXX,XX +XXX,XX @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
56
} else {
57
warn_report(VHOST_NET_INIT_FAILED);
58
}
59
- return;
60
+ goto failed;
61
}
62
} else if (vhostfdname) {
63
error_setg(errp, "vhostfd(s)= is not valid without vhost");
64
+ goto failed;
65
}
66
+
67
+ return;
68
+
69
+failed:
70
+ qemu_del_net_client(&s->nc);
35
}
71
}
36
72
73
static int get_fds(char *str, char *fds[], int max)
37
--
74
--
38
2.7.4
75
2.7.4
39
40
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
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
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
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