提交 2596774a 编写于 作者: M Mark McLoughlin 提交者: Anthony Liguori

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: NMark McLoughlin <markmc@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 b04c4134
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册