aboutsummaryrefslogtreecommitdiff
path: root/slirp/slirp.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2019-01-17 15:43:54 +0400
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2019-02-07 15:49:08 +0200
commit625a526b3298ce593983923b4d10fa582555f26d (patch)
tree23a61e6bd768759314f416b5674e776d5c1868c5 /slirp/slirp.c
parentd7df0b41dc38327388c3f19fdf4246793d4a1e4b (diff)
slirp: improve send_packet() callback
Use a more descriptive name for the callback. Reuse the SlirpWriteCb type. Wrap it to check that all data has been written. Return a ssize_t for potential error handling and data-loss reporting. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'slirp/slirp.c')
-rw-r--r--slirp/slirp.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 3304c83001..2bc53e3e12 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -800,7 +800,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
rah->ar_sip = ah->ar_tip;
memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
rah->ar_tip = ah->ar_sip;
- slirp->cb->output(slirp->opaque, arp_reply, sizeof(arp_reply));
+ slirp_send_packet_all(slirp, arp_reply, sizeof(arp_reply));
}
break;
case ARPOP_REPLY:
@@ -900,7 +900,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
/* target IP */
rah->ar_tip = iph->ip_dst.s_addr;
slirp->client_ipaddr = iph->ip_dst;
- slirp->cb->output(slirp->opaque, arp_req, sizeof(arp_req));
+ slirp_send_packet_all(slirp, arp_req, sizeof(arp_req));
ifm->resolution_requested = true;
/* Expire request and drop outgoing packet after 1 second */
@@ -985,7 +985,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
eh->h_dest[0], eh->h_dest[1], eh->h_dest[2],
eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]);
memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len);
- slirp->cb->output(slirp->opaque, buf, ifm->m_len + ETH_HLEN);
+ slirp_send_packet_all(slirp, buf, ifm->m_len + ETH_HLEN);
return 1;
}
@@ -1152,3 +1152,15 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port,
if (ret > 0)
tcp_output(sototcpcb(so));
}
+
+void slirp_send_packet_all(Slirp *slirp, const void *buf, size_t len)
+{
+ ssize_t ret = slirp->cb->send_packet(buf, len, slirp->opaque);
+
+ if (ret < 0) {
+ g_critical("Failed to send packet, ret: %ld", (long) ret);
+ } else if (ret < len) {
+ DEBUG_ERROR("send_packet() didn't send all data: %ld < %lu",
+ (long) ret, (unsigned long) len);
+ }
+}