mirror of https://github.com/xemu-project/xemu.git
virtio-net: Do not write hashes to peer buffer
The peer buffer is qualified with const and not meant to be modified. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
13d40aa88b
commit
a4c960eedc
|
@ -1830,16 +1830,9 @@ static uint8_t virtio_net_get_hash_type(bool hasip4,
|
||||||
return 0xff;
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_set_packet_hash(const uint8_t *buf, uint8_t report,
|
|
||||||
uint32_t hash)
|
|
||||||
{
|
|
||||||
struct virtio_net_hdr_v1_hash *hdr = (void *)buf;
|
|
||||||
hdr->hash_value = hash;
|
|
||||||
hdr->hash_report = report;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
|
static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
|
||||||
size_t size)
|
size_t size,
|
||||||
|
struct virtio_net_hdr_v1_hash *hdr)
|
||||||
{
|
{
|
||||||
VirtIONet *n = qemu_get_nic_opaque(nc);
|
VirtIONet *n = qemu_get_nic_opaque(nc);
|
||||||
unsigned int index = nc->queue_index, new_index = index;
|
unsigned int index = nc->queue_index, new_index = index;
|
||||||
|
@ -1870,7 +1863,8 @@ static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
|
||||||
n->rss_data.hash_types);
|
n->rss_data.hash_types);
|
||||||
if (net_hash_type > NetPktRssIpV6UdpEx) {
|
if (net_hash_type > NetPktRssIpV6UdpEx) {
|
||||||
if (n->rss_data.populate_hash) {
|
if (n->rss_data.populate_hash) {
|
||||||
virtio_set_packet_hash(buf, VIRTIO_NET_HASH_REPORT_NONE, 0);
|
hdr->hash_value = VIRTIO_NET_HASH_REPORT_NONE;
|
||||||
|
hdr->hash_report = 0;
|
||||||
}
|
}
|
||||||
return n->rss_data.redirect ? n->rss_data.default_queue : -1;
|
return n->rss_data.redirect ? n->rss_data.default_queue : -1;
|
||||||
}
|
}
|
||||||
|
@ -1878,7 +1872,8 @@ static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
|
||||||
hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key);
|
hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key);
|
||||||
|
|
||||||
if (n->rss_data.populate_hash) {
|
if (n->rss_data.populate_hash) {
|
||||||
virtio_set_packet_hash(buf, reports[net_hash_type], hash);
|
hdr->hash_value = hash;
|
||||||
|
hdr->hash_report = reports[net_hash_type];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n->rss_data.redirect) {
|
if (n->rss_data.redirect) {
|
||||||
|
@ -1898,7 +1893,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
|
||||||
VirtQueueElement *elems[VIRTQUEUE_MAX_SIZE];
|
VirtQueueElement *elems[VIRTQUEUE_MAX_SIZE];
|
||||||
size_t lens[VIRTQUEUE_MAX_SIZE];
|
size_t lens[VIRTQUEUE_MAX_SIZE];
|
||||||
struct iovec mhdr_sg[VIRTQUEUE_MAX_SIZE];
|
struct iovec mhdr_sg[VIRTQUEUE_MAX_SIZE];
|
||||||
struct virtio_net_hdr_mrg_rxbuf mhdr;
|
struct virtio_net_hdr_v1_hash extra_hdr;
|
||||||
unsigned mhdr_cnt = 0;
|
unsigned mhdr_cnt = 0;
|
||||||
size_t offset, i, guest_offset, j;
|
size_t offset, i, guest_offset, j;
|
||||||
ssize_t err;
|
ssize_t err;
|
||||||
|
@ -1908,7 +1903,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) {
|
if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) {
|
||||||
int index = virtio_net_process_rss(nc, buf, size);
|
int index = virtio_net_process_rss(nc, buf, size, &extra_hdr);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
NetClientState *nc2 = qemu_get_subqueue(n->nic, index);
|
NetClientState *nc2 = qemu_get_subqueue(n->nic, index);
|
||||||
return virtio_net_receive_rcu(nc2, buf, size, true);
|
return virtio_net_receive_rcu(nc2, buf, size, true);
|
||||||
|
@ -1968,15 +1963,17 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
|
||||||
if (n->mergeable_rx_bufs) {
|
if (n->mergeable_rx_bufs) {
|
||||||
mhdr_cnt = iov_copy(mhdr_sg, ARRAY_SIZE(mhdr_sg),
|
mhdr_cnt = iov_copy(mhdr_sg, ARRAY_SIZE(mhdr_sg),
|
||||||
sg, elem->in_num,
|
sg, elem->in_num,
|
||||||
offsetof(typeof(mhdr), num_buffers),
|
offsetof(typeof(extra_hdr), hdr.num_buffers),
|
||||||
sizeof(mhdr.num_buffers));
|
sizeof(extra_hdr.hdr.num_buffers));
|
||||||
}
|
}
|
||||||
|
|
||||||
receive_header(n, sg, elem->in_num, buf, size);
|
receive_header(n, sg, elem->in_num, buf, size);
|
||||||
if (n->rss_data.populate_hash) {
|
if (n->rss_data.populate_hash) {
|
||||||
offset = sizeof(mhdr);
|
offset = offsetof(typeof(extra_hdr), hash_value);
|
||||||
iov_from_buf(sg, elem->in_num, offset,
|
iov_from_buf(sg, elem->in_num, offset,
|
||||||
buf + offset, n->host_hdr_len - sizeof(mhdr));
|
(char *)&extra_hdr + offset,
|
||||||
|
sizeof(extra_hdr.hash_value) +
|
||||||
|
sizeof(extra_hdr.hash_report));
|
||||||
}
|
}
|
||||||
offset = n->host_hdr_len;
|
offset = n->host_hdr_len;
|
||||||
total += n->guest_hdr_len;
|
total += n->guest_hdr_len;
|
||||||
|
@ -2006,10 +2003,11 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mhdr_cnt) {
|
if (mhdr_cnt) {
|
||||||
virtio_stw_p(vdev, &mhdr.num_buffers, i);
|
virtio_stw_p(vdev, &extra_hdr.hdr.num_buffers, i);
|
||||||
iov_from_buf(mhdr_sg, mhdr_cnt,
|
iov_from_buf(mhdr_sg, mhdr_cnt,
|
||||||
0,
|
0,
|
||||||
&mhdr.num_buffers, sizeof mhdr.num_buffers);
|
&extra_hdr.hdr.num_buffers,
|
||||||
|
sizeof extra_hdr.hdr.num_buffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < i; j++) {
|
for (j = 0; j < i; j++) {
|
||||||
|
|
Loading…
Reference in New Issue