net/socket: Drop net_socket_can_send

This callback is called by main loop before polling s->fd, if it returns
false, the fd will not be polled in this iteration.

This is redundant with checks inside read callback. After this patch,
the data will be sent to peer when it arrives. If the device can't
receive, it will be queued to incoming_queue, and when the device status
changes, this queue will be flushed.

If the peer is not ready, disable the read poll until send completes.

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 1433400324-7358-6-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
stable-2.4
Fam Zheng 2015-06-04 14:45:16 +08:00 committed by Stefan Hajnoczi
parent e8dd1d9c39
commit 6e99c631f1
1 changed files with 19 additions and 12 deletions

View File

@ -51,18 +51,9 @@ typedef struct NetSocketState {
static void net_socket_accept(void *opaque);
static void net_socket_writable(void *opaque);
/* Only read packets from socket when peer can receive them */
static int net_socket_can_send(void *opaque)
{
NetSocketState *s = opaque;
return qemu_can_send_packet(&s->nc);
}
static void net_socket_update_fd_handler(NetSocketState *s)
{
qemu_set_fd_handler2(s->fd,
s->read_poll ? net_socket_can_send : NULL,
qemu_set_fd_handler2(s->fd, NULL,
s->read_poll ? s->send_fn : NULL,
s->write_poll ? net_socket_writable : NULL,
s);
@ -142,6 +133,15 @@ static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf,
return ret;
}
static void net_socket_send_completed(NetClientState *nc, ssize_t len)
{
NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
if (!s->read_poll) {
net_socket_read_poll(s, true);
}
}
static void net_socket_send(void *opaque)
{
NetSocketState *s = opaque;
@ -211,9 +211,13 @@ static void net_socket_send(void *opaque)
buf += l;
size -= l;
if (s->index >= s->packet_len) {
qemu_send_packet(&s->nc, s->buf, s->packet_len);
s->index = 0;
s->state = 0;
if (qemu_send_packet_async(&s->nc, s->buf, size,
net_socket_send_completed) == 0) {
net_socket_read_poll(s, false);
break;
}
}
break;
}
@ -234,7 +238,10 @@ static void net_socket_send_dgram(void *opaque)
net_socket_write_poll(s, false);
return;
}
qemu_send_packet(&s->nc, s->buf, size);
if (qemu_send_packet_async(&s->nc, s->buf, size,
net_socket_send_completed) == 0) {
net_socket_read_poll(s, false);
}
}
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr *localaddr)