提交 38c75be3 编写于 作者: M Mark McLoughlin 提交者: Anthony Liguori

net: make tap_receive() re-use tap_receive_iov() code

In future we will want to prepend a virtio_net header if the NIC didn't
supply one but IFF_VNET_HDR is enabled on the interface. This is most
easily achived by using writev() in all cases.
Signed-off-by: NMark McLoughlin <markmc@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 76682299
...@@ -1306,10 +1306,8 @@ static void tap_writable(void *opaque) ...@@ -1306,10 +1306,8 @@ static void tap_writable(void *opaque)
qemu_flush_queued_packets(s->vc); qemu_flush_queued_packets(s->vc);
} }
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov, static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt)
int iovcnt)
{ {
TAPState *s = vc->opaque;
ssize_t len; ssize_t len;
do { do {
...@@ -1324,16 +1322,25 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov, ...@@ -1324,16 +1322,25 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
return len; return len;
} }
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
int iovcnt)
{
TAPState *s = vc->opaque;
return tap_write_packet(s, iov, iovcnt);
}
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size) static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
{ {
TAPState *s = vc->opaque; TAPState *s = vc->opaque;
ssize_t len; struct iovec iov[1];
int iovcnt = 0;
do { iov[iovcnt].iov_base = (char *)buf;
len = write(s->fd, buf, size); iov[iovcnt].iov_len = size;
} while (len == -1 && (errno == EINTR || errno == EAGAIN)); iovcnt++;
return len; return tap_write_packet(s, iov, iovcnt);
} }
static int tap_can_send(void *opaque) static int tap_can_send(void *opaque)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册