net: determine if packets can be sent before net queue deliver packets
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
parent
86a77c3858
commit
691a4f3a95
|
@ -176,8 +176,8 @@ ssize_t qemu_net_queue_send(NetQueue *queue,
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
if (queue->delivering) {
|
if (queue->delivering || !qemu_can_send_packet(sender)) {
|
||||||
return qemu_net_queue_append(queue, sender, flags, data, size, NULL);
|
return qemu_net_queue_append(queue, sender, flags, data, size, sent_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qemu_net_queue_deliver(queue, sender, flags, data, size);
|
ret = qemu_net_queue_deliver(queue, sender, flags, data, size);
|
||||||
|
@ -200,8 +200,9 @@ ssize_t qemu_net_queue_send_iov(NetQueue *queue,
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
if (queue->delivering) {
|
if (queue->delivering || !qemu_can_send_packet(sender)) {
|
||||||
return qemu_net_queue_append_iov(queue, sender, flags, iov, iovcnt, NULL);
|
return qemu_net_queue_append_iov(queue, sender, flags,
|
||||||
|
iov, iovcnt, sent_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qemu_net_queue_deliver_iov(queue, sender, flags, iov, iovcnt);
|
ret = qemu_net_queue_deliver_iov(queue, sender, flags, iov, iovcnt);
|
||||||
|
|
|
@ -97,13 +97,6 @@ static void slirp_smb_cleanup(SlirpState *s);
|
||||||
static inline void slirp_smb_cleanup(SlirpState *s) { }
|
static inline void slirp_smb_cleanup(SlirpState *s) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int slirp_can_output(void *opaque)
|
|
||||||
{
|
|
||||||
SlirpState *s = opaque;
|
|
||||||
|
|
||||||
return qemu_can_send_packet(&s->nc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
|
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
|
||||||
{
|
{
|
||||||
SlirpState *s = opaque;
|
SlirpState *s = opaque;
|
||||||
|
|
|
@ -177,11 +177,6 @@ void if_start(Slirp *slirp)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (ifm_next) {
|
while (ifm_next) {
|
||||||
/* check if we can really output */
|
|
||||||
if (!slirp_can_output(slirp->opaque)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifm = ifm_next;
|
ifm = ifm_next;
|
||||||
from_batchq = next_from_batchq;
|
from_batchq = next_from_batchq;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds,
|
||||||
void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
|
void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
|
||||||
|
|
||||||
/* you must provide the following functions: */
|
/* you must provide the following functions: */
|
||||||
int slirp_can_output(void *opaque);
|
|
||||||
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
|
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
|
||||||
|
|
||||||
int slirp_add_hostfwd(Slirp *slirp, int is_udp,
|
int slirp_add_hostfwd(Slirp *slirp, int is_udp,
|
||||||
|
|
Loading…
Reference in a new issue