mirror of https://gitee.com/openkylin/qemu.git
net: implement tap support for receive_raw()
tap_receive_raw() always prepends a vnet header if IFF_VNET_HDR is enabled. tap_receive() only prepends when the a header is required but the NIC doesn't supply one. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
b04c4134d6
commit
2596774ad2
23
net.c
23
net.c
|
@ -1392,14 +1392,14 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
|
|||
return tap_write_packet(s, iovp, iovcnt);
|
||||
}
|
||||
|
||||
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
TAPState *s = vc->opaque;
|
||||
struct iovec iov[2];
|
||||
int iovcnt = 0;
|
||||
struct virtio_net_hdr hdr = { 0, };
|
||||
|
||||
if (s->has_vnet_hdr && !s->using_vnet_hdr) {
|
||||
if (s->has_vnet_hdr) {
|
||||
iov[iovcnt].iov_base = &hdr;
|
||||
iov[iovcnt].iov_len = sizeof(hdr);
|
||||
iovcnt++;
|
||||
|
@ -1412,6 +1412,21 @@ static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|||
return tap_write_packet(s, iov, iovcnt);
|
||||
}
|
||||
|
||||
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
TAPState *s = vc->opaque;
|
||||
struct iovec iov[1];
|
||||
|
||||
if (s->has_vnet_hdr && !s->using_vnet_hdr) {
|
||||
return tap_receive_raw(vc, buf, size);
|
||||
}
|
||||
|
||||
iov[0].iov_base = (char *)buf;
|
||||
iov[0].iov_len = size;
|
||||
|
||||
return tap_write_packet(s, iov, 1);
|
||||
}
|
||||
|
||||
static int tap_can_send(void *opaque)
|
||||
{
|
||||
TAPState *s = opaque;
|
||||
|
@ -1555,8 +1570,8 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
|
|||
s->using_vnet_hdr = 0;
|
||||
s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
|
||||
vlan, NULL, model, name, NULL,
|
||||
tap_receive, NULL, tap_receive_iov,
|
||||
tap_cleanup, s);
|
||||
tap_receive, tap_receive_raw,
|
||||
tap_receive_iov, tap_cleanup, s);
|
||||
tap_read_poll(s, 1);
|
||||
return s;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue