mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-18 05:28:36 -07:00
net: add return value to packet receive handler
This allows us to handle queue full conditions rather than dropping the packet on the floor. Signed-off-by: Mark McLoughlin <markmc@redhat.com>
This commit is contained in:
parent
e3f5ec2b5e
commit
4f1c942b7f
18 changed files with 126 additions and 95 deletions
54
net.c
54
net.c
|
|
@ -593,13 +593,14 @@ int slirp_is_inited(void)
|
|||
return slirp_inited;
|
||||
}
|
||||
|
||||
static void slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
#ifdef DEBUG_SLIRP
|
||||
printf("slirp input:\n");
|
||||
hex_dump(stdout, buf, size);
|
||||
#endif
|
||||
slirp_input(buf, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
static int slirp_in_use;
|
||||
|
|
@ -945,17 +946,16 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
|
|||
return len;
|
||||
}
|
||||
|
||||
static void 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;
|
||||
int ret;
|
||||
for(;;) {
|
||||
ret = write(s->fd, buf, size);
|
||||
if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ssize_t len;
|
||||
|
||||
do {
|
||||
len = write(s->fd, buf, size);
|
||||
} while (len == -1 && (errno == EINTR || errno == EAGAIN));
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static int tap_can_send(void *opaque)
|
||||
|
|
@ -1311,17 +1311,16 @@ static void vde_to_qemu(void *opaque)
|
|||
}
|
||||
}
|
||||
|
||||
static void vde_receive(VLANClientState *vc, const uint8_t *buf, int size)
|
||||
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
VDEState *s = vc->opaque;
|
||||
int ret;
|
||||
for(;;) {
|
||||
ret = vde_send(s->vde, (const char *)buf, size, 0);
|
||||
if (ret < 0 && errno == EINTR) {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ssize ret;
|
||||
|
||||
do {
|
||||
ret = vde_send(s->vde, (const char *)buf, size, 0);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vde_cleanup(VLANClientState *vc)
|
||||
|
|
@ -1380,21 +1379,22 @@ typedef struct NetSocketListenState {
|
|||
} NetSocketListenState;
|
||||
|
||||
/* XXX: we consider we can send the whole packet without blocking */
|
||||
static void net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
NetSocketState *s = vc->opaque;
|
||||
uint32_t len;
|
||||
len = htonl(size);
|
||||
|
||||
send_all(s->fd, (const uint8_t *)&len, sizeof(len));
|
||||
send_all(s->fd, buf, size);
|
||||
return send_all(s->fd, buf, size);
|
||||
}
|
||||
|
||||
static void net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
NetSocketState *s = vc->opaque;
|
||||
sendto(s->fd, buf, size, 0,
|
||||
(struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
|
||||
|
||||
return sendto(s->fd, buf, size, 0,
|
||||
(struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
|
||||
}
|
||||
|
||||
static void net_socket_send(void *opaque)
|
||||
|
|
@ -1831,7 +1831,7 @@ struct pcap_sf_pkthdr {
|
|||
uint32_t len;
|
||||
};
|
||||
|
||||
static void dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
||||
{
|
||||
DumpState *s = vc->opaque;
|
||||
struct pcap_sf_pkthdr hdr;
|
||||
|
|
@ -1840,7 +1840,7 @@ static void dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|||
|
||||
/* Early return in case of previous error. */
|
||||
if (s->fd < 0) {
|
||||
return;
|
||||
return size;
|
||||
}
|
||||
|
||||
ts = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec);
|
||||
|
|
@ -1856,6 +1856,8 @@ static void dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|||
close(s->fd);
|
||||
s->fd = -1;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static void net_dump_cleanup(VLANClientState *vc)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue