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);
|
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;
|
TAPState *s = vc->opaque;
|
||||||
struct iovec iov[2];
|
struct iovec iov[2];
|
||||||
int iovcnt = 0;
|
int iovcnt = 0;
|
||||||
struct virtio_net_hdr hdr = { 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_base = &hdr;
|
||||||
iov[iovcnt].iov_len = sizeof(hdr);
|
iov[iovcnt].iov_len = sizeof(hdr);
|
||||||
iovcnt++;
|
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);
|
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)
|
static int tap_can_send(void *opaque)
|
||||||
{
|
{
|
||||||
TAPState *s = opaque;
|
TAPState *s = opaque;
|
||||||
@ -1555,8 +1570,8 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
|
|||||||
s->using_vnet_hdr = 0;
|
s->using_vnet_hdr = 0;
|
||||||
s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
|
s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
|
||||||
vlan, NULL, model, name, NULL,
|
vlan, NULL, model, name, NULL,
|
||||||
tap_receive, NULL, tap_receive_iov,
|
tap_receive, tap_receive_raw,
|
||||||
tap_cleanup, s);
|
tap_receive_iov, tap_cleanup, s);
|
||||||
tap_read_poll(s, 1);
|
tap_read_poll(s, 1);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user