net: Remove receive_raw()
While netmap implements virtio-net header, it does not implement
receive_raw(). Instead of implementing receive_raw for netmap, add
virtio-net headers in the common code and use receive_iov()/receive()
instead. This also fixes the buffer size for the virtio-net header.
Fixes: fbbdbddec0
("tap: allow extended virtio header with hash info")
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
a67753710d
commit
b9ad513e18
@ -72,7 +72,6 @@ typedef struct NetClientInfo {
|
||||
NetClientDriver type;
|
||||
size_t size;
|
||||
NetReceive *receive;
|
||||
NetReceive *receive_raw;
|
||||
NetReceiveIOV *receive_iov;
|
||||
NetCanReceive *can_receive;
|
||||
NetStart *start;
|
||||
|
18
net/net.c
18
net/net.c
@ -787,11 +787,7 @@ static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
|
||||
offset = iov_to_buf(iov, iovcnt, 0, buf, offset);
|
||||
}
|
||||
|
||||
if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
|
||||
ret = nc->info->receive_raw(nc, buffer, offset);
|
||||
} else {
|
||||
ret = nc->info->receive(nc, buffer, offset);
|
||||
}
|
||||
ret = nc->info->receive(nc, buffer, offset);
|
||||
|
||||
g_free(buf);
|
||||
return ret;
|
||||
@ -806,6 +802,8 @@ static ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
||||
MemReentrancyGuard *owned_reentrancy_guard;
|
||||
NetClientState *nc = opaque;
|
||||
int ret;
|
||||
struct virtio_net_hdr_v1_hash vnet_hdr = { };
|
||||
g_autofree struct iovec *iov_copy = NULL;
|
||||
|
||||
|
||||
if (nc->link_down) {
|
||||
@ -824,7 +822,15 @@ static ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
||||
owned_reentrancy_guard->engaged_in_io = true;
|
||||
}
|
||||
|
||||
if (nc->info->receive_iov && !(flags & QEMU_NET_PACKET_FLAG_RAW)) {
|
||||
if ((flags & QEMU_NET_PACKET_FLAG_RAW) && nc->vnet_hdr_len) {
|
||||
iov_copy = g_new(struct iovec, iovcnt + 1);
|
||||
iov_copy[0].iov_base = &vnet_hdr;
|
||||
iov_copy[0].iov_len = nc->vnet_hdr_len;
|
||||
memcpy(&iov_copy[1], iov, iovcnt * sizeof(*iov));
|
||||
iov = iov_copy;
|
||||
}
|
||||
|
||||
if (nc->info->receive_iov) {
|
||||
ret = nc->info->receive_iov(nc, iov, iovcnt);
|
||||
} else {
|
||||
ret = nc_sendv_compat(nc, iov, iovcnt, flags);
|
||||
|
Loading…
Reference in New Issue
Block a user