mirror of https://github.com/xemu-project/xemu.git
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;
|
NetClientDriver type;
|
||||||
size_t size;
|
size_t size;
|
||||||
NetReceive *receive;
|
NetReceive *receive;
|
||||||
NetReceive *receive_raw;
|
|
||||||
NetReceiveIOV *receive_iov;
|
NetReceiveIOV *receive_iov;
|
||||||
NetCanReceive *can_receive;
|
NetCanReceive *can_receive;
|
||||||
NetStart *start;
|
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);
|
offset = iov_to_buf(iov, iovcnt, 0, buf, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
|
ret = nc->info->receive(nc, buffer, offset);
|
||||||
ret = nc->info->receive_raw(nc, buffer, offset);
|
|
||||||
} else {
|
|
||||||
ret = nc->info->receive(nc, buffer, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -806,6 +802,8 @@ static ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
||||||
MemReentrancyGuard *owned_reentrancy_guard;
|
MemReentrancyGuard *owned_reentrancy_guard;
|
||||||
NetClientState *nc = opaque;
|
NetClientState *nc = opaque;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct virtio_net_hdr_v1_hash vnet_hdr = { };
|
||||||
|
g_autofree struct iovec *iov_copy = NULL;
|
||||||
|
|
||||||
|
|
||||||
if (nc->link_down) {
|
if (nc->link_down) {
|
||||||
|
@ -824,7 +822,15 @@ static ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
||||||
owned_reentrancy_guard->engaged_in_io = true;
|
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);
|
ret = nc->info->receive_iov(nc, iov, iovcnt);
|
||||||
} else {
|
} else {
|
||||||
ret = nc_sendv_compat(nc, iov, iovcnt, flags);
|
ret = nc_sendv_compat(nc, iov, iovcnt, flags);
|
||||||
|
|
|
@ -360,7 +360,6 @@ static NetClientInfo net_tap_info = {
|
||||||
.type = NET_CLIENT_DRIVER_TAP,
|
.type = NET_CLIENT_DRIVER_TAP,
|
||||||
.size = sizeof(TAPState),
|
.size = sizeof(TAPState),
|
||||||
.receive = tap_receive,
|
.receive = tap_receive,
|
||||||
.receive_raw = tap_receive_raw,
|
|
||||||
.receive_iov = tap_receive_iov,
|
.receive_iov = tap_receive_iov,
|
||||||
.poll = tap_poll,
|
.poll = tap_poll,
|
||||||
.cleanup = tap_cleanup,
|
.cleanup = tap_cleanup,
|
||||||
|
|
Loading…
Reference in New Issue