|
@@ -599,36 +599,6 @@ static ssize_t filter_receive(NetClientState *nc,
|
|
return filter_receive_iov(nc, direction, sender, flags, &iov, 1, sent_cb);
|
|
return filter_receive_iov(nc, direction, sender, flags, &iov, 1, sent_cb);
|
|
}
|
|
}
|
|
|
|
|
|
-ssize_t qemu_deliver_packet(NetClientState *sender,
|
|
|
|
- unsigned flags,
|
|
|
|
- const uint8_t *data,
|
|
|
|
- size_t size,
|
|
|
|
- void *opaque)
|
|
|
|
-{
|
|
|
|
- NetClientState *nc = opaque;
|
|
|
|
- ssize_t ret;
|
|
|
|
-
|
|
|
|
- if (nc->link_down) {
|
|
|
|
- return size;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (nc->receive_disabled) {
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
|
|
|
|
- ret = nc->info->receive_raw(nc, data, size);
|
|
|
|
- } else {
|
|
|
|
- ret = nc->info->receive(nc, data, size);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (ret == 0) {
|
|
|
|
- nc->receive_disabled = 1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void qemu_purge_queued_packets(NetClientState *nc)
|
|
void qemu_purge_queued_packets(NetClientState *nc)
|
|
{
|
|
{
|
|
if (!nc->peer) {
|
|
if (!nc->peer) {
|
|
@@ -719,14 +689,25 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size)
|
|
}
|
|
}
|
|
|
|
|
|
static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
|
|
static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
|
|
- int iovcnt)
|
|
|
|
|
|
+ int iovcnt, unsigned flags)
|
|
{
|
|
{
|
|
- uint8_t buffer[NET_BUFSIZE];
|
|
|
|
|
|
+ uint8_t buf[NET_BUFSIZE];
|
|
|
|
+ uint8_t *buffer;
|
|
size_t offset;
|
|
size_t offset;
|
|
|
|
|
|
- offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer));
|
|
|
|
|
|
+ if (iovcnt == 1) {
|
|
|
|
+ buffer = iov[0].iov_base;
|
|
|
|
+ offset = iov[0].iov_len;
|
|
|
|
+ } else {
|
|
|
|
+ buffer = buf;
|
|
|
|
+ offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer));
|
|
|
|
+ }
|
|
|
|
|
|
- return nc->info->receive(nc, buffer, offset);
|
|
|
|
|
|
+ if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
|
|
|
|
+ return nc->info->receive_raw(nc, buffer, offset);
|
|
|
|
+ } else {
|
|
|
|
+ return nc->info->receive(nc, buffer, offset);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
|
ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
|
@@ -749,7 +730,7 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
|
|
if (nc->info->receive_iov) {
|
|
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);
|
|
|
|
|
|
+ ret = nc_sendv_compat(nc, iov, iovcnt, flags);
|
|
}
|
|
}
|
|
|
|
|
|
if (ret == 0) {
|
|
if (ret == 0) {
|