|
@@ -529,6 +529,17 @@ int qemu_set_vnet_be(NetClientState *nc, bool is_be)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+int qemu_can_receive_packet(NetClientState *nc)
|
|
|
+{
|
|
|
+ if (nc->receive_disabled) {
|
|
|
+ return 0;
|
|
|
+ } else if (nc->info->can_receive &&
|
|
|
+ !nc->info->can_receive(nc)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
int qemu_can_send_packet(NetClientState *sender)
|
|
|
{
|
|
|
int vm_running = runstate_is_running();
|
|
@@ -541,13 +552,7 @@ int qemu_can_send_packet(NetClientState *sender)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- if (sender->peer->receive_disabled) {
|
|
|
- return 0;
|
|
|
- } else if (sender->peer->info->can_receive &&
|
|
|
- !sender->peer->info->can_receive(sender->peer)) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return 1;
|
|
|
+ return qemu_can_receive_packet(sender->peer);
|
|
|
}
|
|
|
|
|
|
static ssize_t filter_receive_iov(NetClientState *nc,
|
|
@@ -680,6 +685,25 @@ ssize_t qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size)
|
|
|
return qemu_send_packet_async(nc, buf, size, NULL);
|
|
|
}
|
|
|
|
|
|
+ssize_t qemu_receive_packet(NetClientState *nc, const uint8_t *buf, int size)
|
|
|
+{
|
|
|
+ if (!qemu_can_receive_packet(nc)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return qemu_net_queue_receive(nc->incoming_queue, buf, size);
|
|
|
+}
|
|
|
+
|
|
|
+ssize_t qemu_receive_packet_iov(NetClientState *nc, const struct iovec *iov,
|
|
|
+ int iovcnt)
|
|
|
+{
|
|
|
+ if (!qemu_can_receive_packet(nc)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return qemu_net_queue_receive_iov(nc->incoming_queue, iov, iovcnt);
|
|
|
+}
|
|
|
+
|
|
|
ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size)
|
|
|
{
|
|
|
return qemu_send_packet_async_with_flags(nc, QEMU_NET_PACKET_FLAG_RAW,
|