From 463af5349a787160642f023dad10eaf0cb419fb7 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Mon, 18 May 2009 12:55:27 +0100 Subject: net: add fd_readv() handler to qemu_new_vlan_client() args This, apparently, is the style we prefer - all VLANClientState should be an argument to qemu_new_vlan_client(). Signed-off-by: Mark McLoughlin --- hw/stellaris_enet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hw/stellaris_enet.c') diff --git a/hw/stellaris_enet.c b/hw/stellaris_enet.c index 36fabd3260..8b7df099f0 100644 --- a/hw/stellaris_enet.c +++ b/hw/stellaris_enet.c @@ -405,8 +405,8 @@ static void stellaris_enet_init(SysBusDevice *dev) qdev_get_macaddr(&dev->qdev, s->macaddr); s->vc = qdev_get_vlan_client(&dev->qdev, - stellaris_enet_receive, stellaris_enet_can_receive, + stellaris_enet_receive, NULL, stellaris_enet_cleanup, s); qemu_format_nic_info_str(s->vc, s->macaddr); -- cgit 1.4.1 From cda9046ba7dbba45f3016e5d60caffa2d72960fa Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Mon, 18 May 2009 13:13:16 +0100 Subject: net: re-name vc->fd_read() to vc->receive() VLANClientState's fd_read() handler doesn't read from file descriptors, it adds a buffer to the client's receive queue. Re-name the handlers to make things a little less confusing. Signed-off-by: Mark McLoughlin --- hw/dp8393x.c | 4 ++-- hw/e1000.c | 6 +++--- hw/eepro100.c | 2 +- hw/etraxfs_eth.c | 2 +- hw/mcf_fec.c | 2 +- hw/mipsnet.c | 2 +- hw/musicpal.c | 2 +- hw/ne2000.c | 2 +- hw/pcnet.c | 2 +- hw/qdev.c | 10 +++++----- hw/rtl8139.c | 2 +- hw/smc91c111.c | 2 +- hw/stellaris_enet.c | 2 +- hw/usb-net.c | 2 +- hw/virtio-net.c | 2 +- hw/xen_nic.c | 6 +++--- net.c | 36 ++++++++++++++++++------------------ net.h | 23 ++++++++++++----------- savevm.c | 2 +- tap-win32.c | 2 +- 20 files changed, 57 insertions(+), 56 deletions(-) (limited to 'hw/stellaris_enet.c') diff --git a/hw/dp8393x.c b/hw/dp8393x.c index 9257167b1f..1b48d9684e 100644 --- a/hw/dp8393x.c +++ b/hw/dp8393x.c @@ -409,7 +409,7 @@ static void do_transmit_packets(dp8393xState *s) s->regs[SONIC_TCR] |= SONIC_TCR_CRSL; if (s->vc->fd_can_read(s)) { s->loopback_packet = 1; - s->vc->fd_read(s, s->tx_buffer, tx_len); + s->vc->receive(s, s->tx_buffer, tx_len); } } else { /* Transmit packet */ @@ -725,7 +725,7 @@ static int receive_filter(dp8393xState *s, const uint8_t * buf, int size) return -1; } -static void nic_receive(void *opaque, const uint8_t * buf, int size) +static void nic_receive(void *opaque, const uint8_t * buf, size_t size) { uint16_t data[10]; dp8393xState *s = opaque; diff --git a/hw/e1000.c b/hw/e1000.c index 01ee57f031..20544d2943 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -600,7 +600,7 @@ e1000_can_receive(void *opaque) } static void -e1000_receive(void *opaque, const uint8_t *buf, int size) +e1000_receive(void *opaque, const uint8_t *buf, size_t size) { E1000State *s = opaque; struct e1000_rx_desc desc; @@ -614,8 +614,8 @@ e1000_receive(void *opaque, const uint8_t *buf, int size) return; if (size > s->rxbuf_size) { - DBGOUT(RX, "packet too large for buffers (%d > %d)\n", size, - s->rxbuf_size); + DBGOUT(RX, "packet too large for buffers (%lu > %d)\n", + (unsigned long)size, s->rxbuf_size); return; } diff --git a/hw/eepro100.c b/hw/eepro100.c index 5450b83f36..39e8fccfbc 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1441,7 +1441,7 @@ static int nic_can_receive(void *opaque) //~ return !eepro100_buffer_full(s); } -static void nic_receive(void *opaque, const uint8_t * buf, int size) +static void nic_receive(void *opaque, const uint8_t * buf, size_t size) { /* TODO: * - Magic packets should set bit 30 in power management driver register. diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c index bb612840c1..2446f0dcb9 100644 --- a/hw/etraxfs_eth.c +++ b/hw/etraxfs_eth.c @@ -501,7 +501,7 @@ static int eth_can_receive(void *opaque) return 1; } -static void eth_receive(void *opaque, const uint8_t *buf, int size) +static void eth_receive(void *opaque, const uint8_t *buf, size_t size) { unsigned char sa_bcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; struct fs_eth *eth = opaque; diff --git a/hw/mcf_fec.c b/hw/mcf_fec.c index 86b3aafa6a..0b0f17ade6 100644 --- a/hw/mcf_fec.c +++ b/hw/mcf_fec.c @@ -353,7 +353,7 @@ static int mcf_fec_can_receive(void *opaque) return s->rx_enabled; } -static void mcf_fec_receive(void *opaque, const uint8_t *buf, int size) +static void mcf_fec_receive(void *opaque, const uint8_t *buf, size_t size) { mcf_fec_state *s = (mcf_fec_state *)opaque; mcf_fec_bd bd; diff --git a/hw/mipsnet.c b/hw/mipsnet.c index 82a8c935a1..a22f49aabc 100644 --- a/hw/mipsnet.c +++ b/hw/mipsnet.c @@ -75,7 +75,7 @@ static int mipsnet_can_receive(void *opaque) return !mipsnet_buffer_full(s); } -static void mipsnet_receive(void *opaque, const uint8_t *buf, int size) +static void mipsnet_receive(void *opaque, const uint8_t *buf, size_t size) { MIPSnetState *s = opaque; diff --git a/hw/musicpal.c b/hw/musicpal.c index fcefa6e32e..b7810ca7be 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -562,7 +562,7 @@ static int eth_can_receive(void *opaque) return 1; } -static void eth_receive(void *opaque, const uint8_t *buf, int size) +static void eth_receive(void *opaque, const uint8_t *buf, size_t size) { mv88w8618_eth_state *s = opaque; uint32_t desc_addr; diff --git a/hw/ne2000.c b/hw/ne2000.c index aea66b784f..502c8ae664 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -224,7 +224,7 @@ static int ne2000_can_receive(void *opaque) #define MIN_BUF_SIZE 60 -static void ne2000_receive(void *opaque, const uint8_t *buf, int size) +static void ne2000_receive(void *opaque, const uint8_t *buf, size_t size) { NE2000State *s = opaque; uint8_t *p; diff --git a/hw/pcnet.c b/hw/pcnet.c index 5eba467253..4defc437b3 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1076,7 +1076,7 @@ static int pcnet_can_receive(void *opaque) #define MIN_BUF_SIZE 60 -static void pcnet_receive(void *opaque, const uint8_t *buf, int size) +static void pcnet_receive(void *opaque, const uint8_t *buf, size_t size) { PCNetState *s = opaque; int is_padr = 0, is_bcast = 0, is_ladr = 0; diff --git a/hw/qdev.c b/hw/qdev.c index 90b42532a5..bab351c12f 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -258,16 +258,16 @@ void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) } VLANClientState *qdev_get_vlan_client(DeviceState *dev, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, - IOReadvHandler *fd_readv, + NetCanReceive *can_receive, + NetReceive *receive, + NetReceiveIOV *receive_iov, NetCleanup *cleanup, void *opaque) { NICInfo *nd = dev->nd; assert(nd); - return qemu_new_vlan_client(nd->vlan, nd->model, nd->name, fd_can_read, - fd_read, fd_readv, cleanup, opaque); + return qemu_new_vlan_client(nd->vlan, nd->model, nd->name, can_receive, + receive, receive_iov, cleanup, opaque); } diff --git a/hw/rtl8139.c b/hw/rtl8139.c index ab68bda8bf..14119d476e 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1158,7 +1158,7 @@ static void rtl8139_do_receive(void *opaque, const uint8_t *buf, int size, int d } } -static void rtl8139_receive(void *opaque, const uint8_t *buf, int size) +static void rtl8139_receive(void *opaque, const uint8_t *buf, size_t size) { rtl8139_do_receive(opaque, buf, size, 1); } diff --git a/hw/smc91c111.c b/hw/smc91c111.c index b20d535ee1..6d1fbb32c2 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -602,7 +602,7 @@ static int smc91c111_can_receive(void *opaque) return 1; } -static void smc91c111_receive(void *opaque, const uint8_t *buf, int size) +static void smc91c111_receive(void *opaque, const uint8_t *buf, size_t size) { smc91c111_state *s = (smc91c111_state *)opaque; int status; diff --git a/hw/stellaris_enet.c b/hw/stellaris_enet.c index 8b7df099f0..3ee9a8832c 100644 --- a/hw/stellaris_enet.c +++ b/hw/stellaris_enet.c @@ -78,7 +78,7 @@ static void stellaris_enet_update(stellaris_enet_state *s) } /* TODO: Implement MAC address filtering. */ -static void stellaris_enet_receive(void *opaque, const uint8_t *buf, int size) +static void stellaris_enet_receive(void *opaque, const uint8_t *buf, size_t size) { stellaris_enet_state *s = (stellaris_enet_state *)opaque; int n; diff --git a/hw/usb-net.c b/hw/usb-net.c index fda0aa5857..693e9767d2 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1369,7 +1369,7 @@ static int usb_net_handle_data(USBDevice *dev, USBPacket *p) return ret; } -static void usbnet_receive(void *opaque, const uint8_t *buf, int size) +static void usbnet_receive(void *opaque, const uint8_t *buf, size_t size) { USBNetState *s = opaque; struct rndis_packet_msg_type *msg; diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 561330825e..3ca93f5872 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -361,7 +361,7 @@ static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) return 0; } -static void virtio_net_receive(void *opaque, const uint8_t *buf, int size) +static void virtio_net_receive(void *opaque, const uint8_t *buf, size_t size) { VirtIONet *n = opaque; struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL; diff --git a/hw/xen_nic.c b/hw/xen_nic.c index 350556e990..0643e57877 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -243,7 +243,7 @@ static int net_rx_ok(void *opaque) return 1; } -static void net_rx_packet(void *opaque, const uint8_t *buf, int size) +static void net_rx_packet(void *opaque, const uint8_t *buf, size_t size) { struct XenNetDev *netdev = opaque; netif_rx_request_t rxreq; @@ -262,8 +262,8 @@ static void net_rx_packet(void *opaque, const uint8_t *buf, int size) return; } if (size > XC_PAGE_SIZE - NET_IP_ALIGN) { - xen_be_printf(&netdev->xendev, 0, "packet too big (%d > %ld)", - size, XC_PAGE_SIZE - NET_IP_ALIGN); + xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", + (unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); return; } diff --git a/net.c b/net.c index cc8cee3f1c..515745d83a 100644 --- a/net.c +++ b/net.c @@ -332,9 +332,9 @@ static char *assign_name(VLANClientState *vc1, const char *model) VLANClientState *qemu_new_vlan_client(VLANState *vlan, const char *model, const char *name, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, - IOReadvHandler *fd_readv, + NetCanReceive *can_receive, + NetReceive *receive, + NetReceiveIOV *receive_iov, NetCleanup *cleanup, void *opaque) { @@ -345,9 +345,9 @@ VLANClientState *qemu_new_vlan_client(VLANState *vlan, vc->name = strdup(name); else vc->name = assign_name(vc, model); - vc->fd_can_read = fd_can_read; - vc->fd_read = fd_read; - vc->fd_readv = fd_readv; + vc->can_receive = can_receive; + vc->receive = receive; + vc->receive_iov = receive_iov; vc->cleanup = cleanup; vc->opaque = opaque; vc->vlan = vlan; @@ -401,8 +401,8 @@ int qemu_can_send_packet(VLANClientState *sender) continue; } - /* no fd_can_read() handler, they can always receive */ - if (!vc->fd_can_read || vc->fd_can_read(vc->opaque)) { + /* no can_receive() handler, they can always receive */ + if (!vc->can_receive || vc->can_receive(vc->opaque)) { return 1; } } @@ -416,7 +416,7 @@ qemu_deliver_packet(VLANClientState *sender, const uint8_t *buf, int size) for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) { if (vc != sender && !vc->link_down) { - vc->fd_read(vc->opaque, buf, size); + vc->receive(vc->opaque, buf, size); } } } @@ -467,7 +467,7 @@ static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov, offset += len; } - vc->fd_read(vc->opaque, buffer, offset); + vc->receive(vc->opaque, buffer, offset); return offset; } @@ -519,9 +519,9 @@ ssize_t qemu_sendv_packet(VLANClientState *sender, const struct iovec *iov, } if (vc->link_down) { len = calc_iov_length(iov, iovcnt); - } else if (vc->fd_readv) { - len = vc->fd_readv(vc->opaque, iov, iovcnt); - } else if (vc->fd_read) { + } else if (vc->receive_iov) { + len = vc->receive_iov(vc->opaque, iov, iovcnt); + } else if (vc->receive) { len = vc_sendv_compat(vc, iov, iovcnt); } max_len = MAX(max_len, len); @@ -593,7 +593,7 @@ int slirp_is_inited(void) return slirp_inited; } -static void slirp_receive(void *opaque, const uint8_t *buf, int size) +static void slirp_receive(void *opaque, const uint8_t *buf, size_t size) { #ifdef DEBUG_SLIRP printf("slirp input:\n"); @@ -945,7 +945,7 @@ static ssize_t tap_receive_iov(void *opaque, const struct iovec *iov, return len; } -static void tap_receive(void *opaque, const uint8_t *buf, int size) +static void tap_receive(void *opaque, const uint8_t *buf, size_t size) { TAPState *s = opaque; int ret; @@ -1380,7 +1380,7 @@ typedef struct NetSocketListenState { } NetSocketListenState; /* XXX: we consider we can send the whole packet without blocking */ -static void net_socket_receive(void *opaque, const uint8_t *buf, int size) +static void net_socket_receive(void *opaque, const uint8_t *buf, size_t size) { NetSocketState *s = opaque; uint32_t len; @@ -1390,7 +1390,7 @@ static void net_socket_receive(void *opaque, const uint8_t *buf, int size) send_all(s->fd, buf, size); } -static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size) +static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, size_t size) { NetSocketState *s = opaque; sendto(s->fd, buf, size, 0, @@ -1831,7 +1831,7 @@ struct pcap_sf_pkthdr { uint32_t len; }; -static void dump_receive(void *opaque, const uint8_t *buf, int size) +static void dump_receive(void *opaque, const uint8_t *buf, size_t size) { DumpState *s = opaque; struct pcap_sf_pkthdr hdr; diff --git a/net.h b/net.h index ab445aa2ec..4d204e06e6 100644 --- a/net.h +++ b/net.h @@ -5,19 +5,20 @@ /* VLANs support */ -typedef ssize_t (IOReadvHandler)(void *, const struct iovec *, int); - typedef struct VLANClientState VLANClientState; +typedef int (NetCanReceive)(void *); +typedef void (NetReceive)(void *, const uint8_t *, size_t); +typedef ssize_t (NetReceiveIOV)(void *, const struct iovec *, int); typedef void (NetCleanup) (VLANClientState *); typedef void (LinkStatusChanged)(VLANClientState *); struct VLANClientState { - IOReadHandler *fd_read; - IOReadvHandler *fd_readv; + NetReceive *receive; + NetReceiveIOV *receive_iov; /* Packets may still be sent if this returns zero. It's used to rate-limit the slirp code. */ - IOCanRWHandler *fd_can_read; + NetCanReceive *can_receive; NetCleanup *cleanup; LinkStatusChanged *link_status_changed; int link_down; @@ -51,9 +52,9 @@ VLANState *qemu_find_vlan(int id); VLANClientState *qemu_new_vlan_client(VLANState *vlan, const char *model, const char *name, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, - IOReadvHandler *fd_readv, + NetCanReceive *can_receive, + NetReceive *receive, + NetReceiveIOV *receive_iov, NetCleanup *cleanup, void *opaque); void qemu_del_vlan_client(VLANClientState *vc); @@ -130,9 +131,9 @@ void net_host_device_remove(Monitor *mon, int vlan_id, const char *device); void qdev_get_macaddr(DeviceState *dev, uint8_t *macaddr); VLANClientState *qdev_get_vlan_client(DeviceState *dev, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, - IOReadvHandler *fd_readv, + NetCanReceive *can_receive, + NetReceive *receive, + NetReceiveIOV *receive_iov, NetCleanup *cleanup, void *opaque); diff --git a/savevm.c b/savevm.c index 248aea3edf..6da5e73a96 100644 --- a/savevm.c +++ b/savevm.c @@ -131,7 +131,7 @@ static void qemu_announce_self_once(void *opaque) len = announce_self_create(buf, nd_table[i].macaddr); vlan = nd_table[i].vlan; for(vc = vlan->first_client; vc != NULL; vc = vc->next) { - vc->fd_read(vc->opaque, buf, len); + vc->receive(vc->opaque, buf, len); } } if (count--) { diff --git a/tap-win32.c b/tap-win32.c index 008158da16..ccf7e45e55 100644 --- a/tap-win32.c +++ b/tap-win32.c @@ -650,7 +650,7 @@ static void tap_cleanup(VLANClientState *vc) qemu_free(s); } -static void tap_receive(void *opaque, const uint8_t *buf, int size) +static void tap_receive(void *opaque, const uint8_t *buf, size_t size) { TAPState *s = opaque; -- cgit 1.4.1 From e3f5ec2b5e92706e3b807059f79b1fb5d936e567 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Mon, 18 May 2009 13:33:03 +0100 Subject: net: pass VLANClientState* as first arg to receive handlers Give static type checking a chance to catch errors. Signed-off-by: Mark McLoughlin --- hw/dp8393x.c | 12 ++++++------ hw/e1000.c | 8 ++++---- hw/eepro100.c | 8 ++++---- hw/etraxfs_eth.c | 6 +++--- hw/mcf_fec.c | 8 ++++---- hw/mipsnet.c | 10 +++++----- hw/musicpal.c | 6 +++--- hw/ne2000.c | 8 ++++---- hw/pcnet.c | 10 +++++----- hw/rtl8139.c | 14 +++++++------- hw/smc91c111.c | 8 ++++---- hw/stellaris_enet.c | 12 ++++++------ hw/usb-net.c | 8 ++++---- hw/virtio-net.c | 8 ++++---- hw/xen_nic.c | 8 ++++---- net.c | 36 ++++++++++++++++++------------------ net.h | 6 +++--- savevm.c | 2 +- tap-win32.c | 2 +- 19 files changed, 90 insertions(+), 90 deletions(-) (limited to 'hw/stellaris_enet.c') diff --git a/hw/dp8393x.c b/hw/dp8393x.c index 1b48d9684e..de399837b9 100644 --- a/hw/dp8393x.c +++ b/hw/dp8393x.c @@ -407,9 +407,9 @@ static void do_transmit_packets(dp8393xState *s) if (s->regs[SONIC_RCR] & (SONIC_RCR_LB1 | SONIC_RCR_LB0)) { /* Loopback */ s->regs[SONIC_TCR] |= SONIC_TCR_CRSL; - if (s->vc->fd_can_read(s)) { + if (s->vc->can_receive(s->vc)) { s->loopback_packet = 1; - s->vc->receive(s, s->tx_buffer, tx_len); + s->vc->receive(s->vc, s->tx_buffer, tx_len); } } else { /* Transmit packet */ @@ -676,9 +676,9 @@ static CPUWriteMemoryFunc *dp8393x_write[3] = { dp8393x_writel, }; -static int nic_can_receive(void *opaque) +static int nic_can_receive(VLANClientState *vc) { - dp8393xState *s = opaque; + dp8393xState *s = vc->opaque; if (!(s->regs[SONIC_CR] & SONIC_CR_RXEN)) return 0; @@ -725,10 +725,10 @@ static int receive_filter(dp8393xState *s, const uint8_t * buf, int size) return -1; } -static void nic_receive(void *opaque, const uint8_t * buf, size_t size) +static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) { uint16_t data[10]; - dp8393xState *s = opaque; + dp8393xState *s = vc->opaque; int packet_type; uint32_t available, address; int width, rx_len = size; diff --git a/hw/e1000.c b/hw/e1000.c index 20544d2943..6d3eb313ec 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -592,17 +592,17 @@ e1000_set_link_status(VLANClientState *vc) } static int -e1000_can_receive(void *opaque) +e1000_can_receive(VLANClientState *vc) { - E1000State *s = opaque; + E1000State *s = vc->opaque; return (s->mac_reg[RCTL] & E1000_RCTL_EN); } static void -e1000_receive(void *opaque, const uint8_t *buf, size_t size) +e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - E1000State *s = opaque; + E1000State *s = vc->opaque; struct e1000_rx_desc desc; target_phys_addr_t base; unsigned int n, rdt; diff --git a/hw/eepro100.c b/hw/eepro100.c index 39e8fccfbc..3300fbe9ea 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1433,21 +1433,21 @@ static void pci_mmio_map(PCIDevice * pci_dev, int region_num, } } -static int nic_can_receive(void *opaque) +static int nic_can_receive(VLANClientState *vc) { - EEPRO100State *s = opaque; + EEPRO100State *s = vc->opaque; logout("%p\n", s); return get_ru_state(s) == ru_ready; //~ return !eepro100_buffer_full(s); } -static void nic_receive(void *opaque, const uint8_t * buf, size_t size) +static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) { /* TODO: * - Magic packets should set bit 30 in power management driver register. * - Interesting packets should set bit 29 in power management driver register. */ - EEPRO100State *s = opaque; + EEPRO100State *s = vc->opaque; uint16_t rfd_status = 0xa000; static const uint8_t broadcast_macaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c index 2446f0dcb9..78af76b9bb 100644 --- a/hw/etraxfs_eth.c +++ b/hw/etraxfs_eth.c @@ -496,15 +496,15 @@ static int eth_match_groupaddr(struct fs_eth *eth, const unsigned char *sa) return match; } -static int eth_can_receive(void *opaque) +static int eth_can_receive(VLANClientState *vc) { return 1; } -static void eth_receive(void *opaque, const uint8_t *buf, size_t size) +static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { unsigned char sa_bcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - struct fs_eth *eth = opaque; + struct fs_eth *eth = vc->opaque; int use_ma0 = eth->regs[RW_REC_CTRL] & 1; int use_ma1 = eth->regs[RW_REC_CTRL] & 2; int r_bcast = eth->regs[RW_REC_CTRL] & 8; diff --git a/hw/mcf_fec.c b/hw/mcf_fec.c index 0b0f17ade6..d2534d05fb 100644 --- a/hw/mcf_fec.c +++ b/hw/mcf_fec.c @@ -347,15 +347,15 @@ static void mcf_fec_write(void *opaque, target_phys_addr_t addr, uint32_t value) mcf_fec_update(s); } -static int mcf_fec_can_receive(void *opaque) +static int mcf_fec_can_receive(VLANClientState *vc) { - mcf_fec_state *s = (mcf_fec_state *)opaque; + mcf_fec_state *s = vc->opaque; return s->rx_enabled; } -static void mcf_fec_receive(void *opaque, const uint8_t *buf, size_t size) +static void mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - mcf_fec_state *s = (mcf_fec_state *)opaque; + mcf_fec_state *s = vc->opaque; mcf_fec_bd bd; uint32_t flags = 0; uint32_t addr; diff --git a/hw/mipsnet.c b/hw/mipsnet.c index a22f49aabc..e9128cbb34 100644 --- a/hw/mipsnet.c +++ b/hw/mipsnet.c @@ -66,23 +66,23 @@ static int mipsnet_buffer_full(MIPSnetState *s) return 0; } -static int mipsnet_can_receive(void *opaque) +static int mipsnet_can_receive(VLANClientState *vc) { - MIPSnetState *s = opaque; + MIPSnetState *s = vc->opaque; if (s->busy) return 0; return !mipsnet_buffer_full(s); } -static void mipsnet_receive(void *opaque, const uint8_t *buf, size_t size) +static void mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - MIPSnetState *s = opaque; + MIPSnetState *s = vc->opaque; #ifdef DEBUG_MIPSNET_RECEIVE printf("mipsnet: receiving len=%d\n", size); #endif - if (!mipsnet_can_receive(opaque)) + if (!mipsnet_can_receive(vc)) return; s->busy = 1; diff --git a/hw/musicpal.c b/hw/musicpal.c index b7810ca7be..844edb8f37 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -557,14 +557,14 @@ static void eth_rx_desc_get(uint32_t addr, mv88w8618_rx_desc *desc) le32_to_cpus(&desc->next); } -static int eth_can_receive(void *opaque) +static int eth_can_receive(VLANClientState *vc) { return 1; } -static void eth_receive(void *opaque, const uint8_t *buf, size_t size) +static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - mv88w8618_eth_state *s = opaque; + mv88w8618_eth_state *s = vc->opaque; uint32_t desc_addr; mv88w8618_rx_desc desc; int i; diff --git a/hw/ne2000.c b/hw/ne2000.c index 502c8ae664..c0fc34c4b2 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -213,9 +213,9 @@ static int ne2000_buffer_full(NE2000State *s) return 0; } -static int ne2000_can_receive(void *opaque) +static int ne2000_can_receive(VLANClientState *vc) { - NE2000State *s = opaque; + NE2000State *s = vc->opaque; if (s->cmd & E8390_STOP) return 1; @@ -224,9 +224,9 @@ static int ne2000_can_receive(void *opaque) #define MIN_BUF_SIZE 60 -static void ne2000_receive(void *opaque, const uint8_t *buf, size_t size) +static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - NE2000State *s = opaque; + NE2000State *s = vc->opaque; uint8_t *p; unsigned int total_len, next, avail, len, index, mcast_idx; uint8_t buf1[60]; diff --git a/hw/pcnet.c b/hw/pcnet.c index 4defc437b3..a8297df2af 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1062,9 +1062,9 @@ static int pcnet_tdte_poll(PCNetState *s) return !!(CSR_CXST(s) & 0x8000); } -static int pcnet_can_receive(void *opaque) +static int pcnet_can_receive(VLANClientState *vc) { - PCNetState *s = opaque; + PCNetState *s = vc->opaque; if (CSR_STOP(s) || CSR_SPND(s)) return 0; @@ -1076,9 +1076,9 @@ static int pcnet_can_receive(void *opaque) #define MIN_BUF_SIZE 60 -static void pcnet_receive(void *opaque, const uint8_t *buf, size_t size) +static void pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - PCNetState *s = opaque; + PCNetState *s = vc->opaque; int is_padr = 0, is_bcast = 0, is_ladr = 0; uint8_t buf1[60]; int remaining; @@ -1302,7 +1302,7 @@ static void pcnet_transmit(PCNetState *s) if (BCR_SWSTYLE(s) == 1) add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS); s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC; - pcnet_receive(s, s->buffer, s->xmit_pos); + pcnet_receive(s->vc, s->buffer, s->xmit_pos); s->looptest = 0; } else if (s->vc) diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 14119d476e..8626d5e6b8 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -790,9 +790,9 @@ static inline target_phys_addr_t rtl8139_addr64(uint32_t low, uint32_t high) #endif } -static int rtl8139_can_receive(void *opaque) +static int rtl8139_can_receive(VLANClientState *vc) { - RTL8139State *s = opaque; + RTL8139State *s = vc->opaque; int avail; /* Receive (drop) packets if card is disabled. */ @@ -812,9 +812,9 @@ static int rtl8139_can_receive(void *opaque) } } -static void rtl8139_do_receive(void *opaque, const uint8_t *buf, int size, int do_interrupt) +static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size, int do_interrupt) { - RTL8139State *s = opaque; + RTL8139State *s = vc->opaque; uint32_t packet_header = 0; @@ -1158,9 +1158,9 @@ static void rtl8139_do_receive(void *opaque, const uint8_t *buf, int size, int d } } -static void rtl8139_receive(void *opaque, const uint8_t *buf, size_t size) +static void rtl8139_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - rtl8139_do_receive(opaque, buf, size, 1); + rtl8139_do_receive(vc, buf, size, 1); } static void rtl8139_reset_rxring(RTL8139State *s, uint32_t bufferSize) @@ -1757,7 +1757,7 @@ static void rtl8139_transfer_frame(RTL8139State *s, const uint8_t *buf, int size if (TxLoopBack == (s->TxConfig & TxLoopBack)) { DEBUG_PRINT(("RTL8139: +++ transmit loopback mode\n")); - rtl8139_do_receive(s, buf, size, do_interrupt); + rtl8139_do_receive(s->vc, buf, size, do_interrupt); } else { diff --git a/hw/smc91c111.c b/hw/smc91c111.c index 6d1fbb32c2..383f0b7daa 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -591,9 +591,9 @@ static uint32_t smc91c111_readl(void *opaque, target_phys_addr_t offset) return val; } -static int smc91c111_can_receive(void *opaque) +static int smc91c111_can_receive(VLANClientState *vc) { - smc91c111_state *s = (smc91c111_state *)opaque; + smc91c111_state *s = vc->opaque; if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) return 1; @@ -602,9 +602,9 @@ static int smc91c111_can_receive(void *opaque) return 1; } -static void smc91c111_receive(void *opaque, const uint8_t *buf, size_t size) +static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - smc91c111_state *s = (smc91c111_state *)opaque; + smc91c111_state *s = vc->opaque; int status; int packetsize; uint32_t crc; diff --git a/hw/stellaris_enet.c b/hw/stellaris_enet.c index 3ee9a8832c..7f308290da 100644 --- a/hw/stellaris_enet.c +++ b/hw/stellaris_enet.c @@ -78,9 +78,9 @@ static void stellaris_enet_update(stellaris_enet_state *s) } /* TODO: Implement MAC address filtering. */ -static void stellaris_enet_receive(void *opaque, const uint8_t *buf, size_t size) +static void stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - stellaris_enet_state *s = (stellaris_enet_state *)opaque; + stellaris_enet_state *s = vc->opaque; int n; uint8_t *p; uint32_t crc; @@ -118,9 +118,9 @@ static void stellaris_enet_receive(void *opaque, const uint8_t *buf, size_t size stellaris_enet_update(s); } -static int stellaris_enet_can_receive(void *opaque) +static int stellaris_enet_can_receive(VLANClientState *vc) { - stellaris_enet_state *s = (stellaris_enet_state *)opaque; + stellaris_enet_state *s = vc->opaque; if ((s->rctl & SE_RCTL_RXEN) == 0) return 1; @@ -128,9 +128,9 @@ static int stellaris_enet_can_receive(void *opaque) return (s->np < 31); } -static uint32_t stellaris_enet_read(void *opaque, target_phys_addr_t offset) +static uint32_t stellaris_enet_read(VLANClientState *vc, target_phys_addr_t offset) { - stellaris_enet_state *s = (stellaris_enet_state *)opaque; + stellaris_enet_state *s = vc->opaque; uint32_t val; switch (offset) { diff --git a/hw/usb-net.c b/hw/usb-net.c index 693e9767d2..d8d5e773f5 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1369,9 +1369,9 @@ static int usb_net_handle_data(USBDevice *dev, USBPacket *p) return ret; } -static void usbnet_receive(void *opaque, const uint8_t *buf, size_t size) +static void usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - USBNetState *s = opaque; + USBNetState *s = vc->opaque; struct rndis_packet_msg_type *msg; if (s->rndis) { @@ -1405,9 +1405,9 @@ static void usbnet_receive(void *opaque, const uint8_t *buf, size_t size) s->in_ptr = 0; } -static int usbnet_can_receive(void *opaque) +static int usbnet_can_receive(VLANClientState *vc) { - USBNetState *s = opaque; + USBNetState *s = vc->opaque; if (s->rndis && !s->rndis_state == RNDIS_DATA_INITIALIZED) return 1; diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 3ca93f5872..1ffebac222 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -288,9 +288,9 @@ static int do_virtio_net_can_receive(VirtIONet *n, int bufsize) return 1; } -static int virtio_net_can_receive(void *opaque) +static int virtio_net_can_receive(VLANClientState *vc) { - VirtIONet *n = opaque; + VirtIONet *n = vc->opaque; return do_virtio_net_can_receive(n, VIRTIO_NET_MAX_BUFSIZE); } @@ -361,9 +361,9 @@ static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) return 0; } -static void virtio_net_receive(void *opaque, const uint8_t *buf, size_t size) +static void virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - VirtIONet *n = opaque; + VirtIONet *n = vc->opaque; struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL; size_t hdr_len, offset, i; diff --git a/hw/xen_nic.c b/hw/xen_nic.c index 0643e57877..173e87a8ff 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -223,9 +223,9 @@ static void net_rx_response(struct XenNetDev *netdev, #define NET_IP_ALIGN 2 -static int net_rx_ok(void *opaque) +static int net_rx_ok(VLANClientState *vc) { - struct XenNetDev *netdev = opaque; + struct XenNetDev *netdev = vc->opaque; RING_IDX rc, rp; if (netdev->xendev.be_state != XenbusStateConnected) @@ -243,9 +243,9 @@ static int net_rx_ok(void *opaque) return 1; } -static void net_rx_packet(void *opaque, const uint8_t *buf, size_t size) +static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) { - struct XenNetDev *netdev = opaque; + struct XenNetDev *netdev = vc->opaque; netif_rx_request_t rxreq; RING_IDX rc, rp; void *page; diff --git a/net.c b/net.c index 515745d83a..da79d99a12 100644 --- a/net.c +++ b/net.c @@ -402,7 +402,7 @@ int qemu_can_send_packet(VLANClientState *sender) } /* no can_receive() handler, they can always receive */ - if (!vc->can_receive || vc->can_receive(vc->opaque)) { + if (!vc->can_receive || vc->can_receive(vc)) { return 1; } } @@ -416,7 +416,7 @@ qemu_deliver_packet(VLANClientState *sender, const uint8_t *buf, int size) for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) { if (vc != sender && !vc->link_down) { - vc->receive(vc->opaque, buf, size); + vc->receive(vc, buf, size); } } } @@ -467,7 +467,7 @@ static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov, offset += len; } - vc->receive(vc->opaque, buffer, offset); + vc->receive(vc, buffer, offset); return offset; } @@ -520,7 +520,7 @@ ssize_t qemu_sendv_packet(VLANClientState *sender, const struct iovec *iov, if (vc->link_down) { len = calc_iov_length(iov, iovcnt); } else if (vc->receive_iov) { - len = vc->receive_iov(vc->opaque, iov, iovcnt); + len = vc->receive_iov(vc, iov, iovcnt); } else if (vc->receive) { len = vc_sendv_compat(vc, iov, iovcnt); } @@ -593,7 +593,7 @@ int slirp_is_inited(void) return slirp_inited; } -static void slirp_receive(void *opaque, const uint8_t *buf, size_t size) +static void slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { #ifdef DEBUG_SLIRP printf("slirp input:\n"); @@ -932,10 +932,10 @@ typedef struct TAPState { static int launch_script(const char *setup_script, const char *ifname, int fd); -static ssize_t tap_receive_iov(void *opaque, const struct iovec *iov, +static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov, int iovcnt) { - TAPState *s = opaque; + TAPState *s = vc->opaque; ssize_t len; do { @@ -945,9 +945,9 @@ static ssize_t tap_receive_iov(void *opaque, const struct iovec *iov, return len; } -static void tap_receive(void *opaque, const uint8_t *buf, size_t size) +static void tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - TAPState *s = opaque; + TAPState *s = vc->opaque; int ret; for(;;) { ret = write(s->fd, buf, size); @@ -1311,9 +1311,9 @@ static void vde_to_qemu(void *opaque) } } -static void vde_from_qemu(void *opaque, const uint8_t *buf, int size) +static void vde_receive(VLANClientState *vc, const uint8_t *buf, int size) { - VDEState *s = opaque; + VDEState *s = vc->opaque; int ret; for(;;) { ret = vde_send(s->vde, (const char *)buf, size, 0); @@ -1352,7 +1352,7 @@ static int net_vde_init(VLANState *vlan, const char *model, free(s); return -1; } - s->vc = qemu_new_vlan_client(vlan, model, name, NULL, vde_from_qemu, + s->vc = qemu_new_vlan_client(vlan, model, name, NULL, vde_receive, NULL, vde_cleanup, s); qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s); snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d", @@ -1380,9 +1380,9 @@ typedef struct NetSocketListenState { } NetSocketListenState; /* XXX: we consider we can send the whole packet without blocking */ -static void net_socket_receive(void *opaque, const uint8_t *buf, size_t size) +static void net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - NetSocketState *s = opaque; + NetSocketState *s = vc->opaque; uint32_t len; len = htonl(size); @@ -1390,9 +1390,9 @@ static void net_socket_receive(void *opaque, const uint8_t *buf, size_t size) send_all(s->fd, buf, size); } -static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, size_t size) +static void net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size) { - NetSocketState *s = opaque; + NetSocketState *s = vc->opaque; sendto(s->fd, buf, size, 0, (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst)); } @@ -1831,9 +1831,9 @@ struct pcap_sf_pkthdr { uint32_t len; }; -static void dump_receive(void *opaque, const uint8_t *buf, size_t size) +static void dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - DumpState *s = opaque; + DumpState *s = vc->opaque; struct pcap_sf_pkthdr hdr; int64_t ts; int caplen; diff --git a/net.h b/net.h index 4d204e06e6..a28827c4a7 100644 --- a/net.h +++ b/net.h @@ -7,9 +7,9 @@ typedef struct VLANClientState VLANClientState; -typedef int (NetCanReceive)(void *); -typedef void (NetReceive)(void *, const uint8_t *, size_t); -typedef ssize_t (NetReceiveIOV)(void *, const struct iovec *, int); +typedef int (NetCanReceive)(VLANClientState *); +typedef void (NetReceive)(VLANClientState *, const uint8_t *, size_t); +typedef ssize_t (NetReceiveIOV)(VLANClientState *, const struct iovec *, int); typedef void (NetCleanup) (VLANClientState *); typedef void (LinkStatusChanged)(VLANClientState *); diff --git a/savevm.c b/savevm.c index 6da5e73a96..cae711762d 100644 --- a/savevm.c +++ b/savevm.c @@ -131,7 +131,7 @@ static void qemu_announce_self_once(void *opaque) len = announce_self_create(buf, nd_table[i].macaddr); vlan = nd_table[i].vlan; for(vc = vlan->first_client; vc != NULL; vc = vc->next) { - vc->receive(vc->opaque, buf, len); + vc->receive(vc, buf, len); } } if (count--) { diff --git a/tap-win32.c b/tap-win32.c index ccf7e45e55..ff1e1ed5f4 100644 --- a/tap-win32.c +++ b/tap-win32.c @@ -650,7 +650,7 @@ static void tap_cleanup(VLANClientState *vc) qemu_free(s); } -static void tap_receive(void *opaque, const uint8_t *buf, size_t size) +static void tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { TAPState *s = opaque; -- cgit 1.4.1 From 4f1c942b7fb29864ad86cb3af9076da38f38f74e Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Mon, 18 May 2009 13:40:55 +0100 Subject: 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 --- hw/dp8393x.c | 8 +++++--- hw/e1000.c | 14 ++++++++------ hw/eepro100.c | 15 ++++++++------- hw/etraxfs_eth.c | 8 +++++--- hw/mcf_fec.c | 3 ++- hw/mipsnet.c | 6 ++++-- hw/musicpal.c | 5 +++-- hw/ne2000.c | 15 +++++++++------ hw/pcnet.c | 7 +++++-- hw/rtl8139.c | 29 +++++++++++++++------------- hw/smc91c111.c | 10 ++++++---- hw/stellaris_enet.c | 8 +++++--- hw/usb-net.c | 9 +++++---- hw/virtio-net.c | 10 ++++++---- hw/xen_nic.c | 12 +++++++----- net.c | 54 +++++++++++++++++++++++++++-------------------------- net.h | 2 +- tap-win32.c | 6 +++--- 18 files changed, 126 insertions(+), 95 deletions(-) (limited to 'hw/stellaris_enet.c') diff --git a/hw/dp8393x.c b/hw/dp8393x.c index de399837b9..cff84aa0a1 100644 --- a/hw/dp8393x.c +++ b/hw/dp8393x.c @@ -725,7 +725,7 @@ static int receive_filter(dp8393xState *s, const uint8_t * buf, int size) return -1; } -static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) +static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) { uint16_t data[10]; dp8393xState *s = vc->opaque; @@ -742,7 +742,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) packet_type = receive_filter(s, buf, size); if (packet_type < 0) { DPRINTF("packet not for netcard\n"); - return; + return -1; } /* XXX: Check byte ordering */ @@ -755,7 +755,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) s->memory_rw(s->mem_opaque, address, (uint8_t*)data, size, 0); if (data[0 * width] & 0x1) { /* Still EOL ; stop reception */ - return; + return -1; } else { s->regs[SONIC_CRDA] = s->regs[SONIC_LLFA]; } @@ -833,6 +833,8 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) /* Done */ dp8393x_update_irq(s); + + return size; } static void nic_reset(void *opaque) diff --git a/hw/e1000.c b/hw/e1000.c index 6d3eb313ec..7f8f5b2ae4 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -599,7 +599,7 @@ e1000_can_receive(VLANClientState *vc) return (s->mac_reg[RCTL] & E1000_RCTL_EN); } -static void +static ssize_t e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { E1000State *s = vc->opaque; @@ -611,16 +611,16 @@ e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) uint8_t vlan_status = 0, vlan_offset = 0; if (!(s->mac_reg[RCTL] & E1000_RCTL_EN)) - return; + return -1; if (size > s->rxbuf_size) { DBGOUT(RX, "packet too large for buffers (%lu > %d)\n", (unsigned long)size, s->rxbuf_size); - return; + return -1; } if (!receive_filter(s, buf, size)) - return; + return size; if (vlan_enabled(s) && is_vlan_packet(s, buf)) { vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14))); @@ -635,7 +635,7 @@ e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) do { if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) { set_ics(s, 0, E1000_ICS_RXO); - return; + return -1; } base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] + sizeof(desc) * s->mac_reg[RDH]; @@ -659,7 +659,7 @@ e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n", rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]); set_ics(s, 0, E1000_ICS_RXO); - return; + return -1; } } while (desc.buffer_addr == 0); @@ -677,6 +677,8 @@ e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) n |= E1000_ICS_RXDMT0; set_ics(s, 0, n); + + return size; } static uint32_t diff --git a/hw/eepro100.c b/hw/eepro100.c index 3300fbe9ea..a6355dc754 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1441,7 +1441,7 @@ static int nic_can_receive(VLANClientState *vc) //~ return !eepro100_buffer_full(s); } -static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) +static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) { /* TODO: * - Magic packets should set bit 30 in power management driver register. @@ -1458,18 +1458,18 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) if (s->configuration[8] & 0x80) { /* CSMA is disabled. */ logout("%p received while CSMA is disabled\n", s); - return; + return -1; } else if (size < 64 && (s->configuration[7] & 1)) { /* Short frame and configuration byte 7/0 (discard short receive) set: * Short frame is discarded */ logout("%p received short frame (%d byte)\n", s, size); s->statistics.rx_short_frame_errors++; - //~ return; + //~ return -1; } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) { /* Long frame and configuration byte 18/3 (long receive ok) not set: * Long frames are discarded. */ logout("%p received long frame (%d byte), ignored\n", s, size); - return; + return -1; } else if (memcmp(buf, s->macaddr, 6) == 0) { // !!! /* Frame matches individual address. */ /* TODO: check configuration byte 15/4 (ignore U/L). */ @@ -1485,7 +1485,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) assert(!(s->configuration[21] & BIT(3))); int mcast_idx = compute_mcast_idx(buf); if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) { - return; + return size; } rfd_status |= 0x0002; } else if (s->configuration[15] & 1) { @@ -1495,7 +1495,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) } else { logout("%p received frame, ignored, len=%d,%s\n", s, size, nic_dump(buf, size)); - return; + return size; } if (get_ru_state(s) != ru_ready) { @@ -1503,7 +1503,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) logout("no ressources, state=%u\n", get_ru_state(s)); s->statistics.rx_resource_errors++; //~ assert(!"no ressources"); - return; + return -1; } //~ !!! //~ $3 = {status = 0x0, command = 0xc000, link = 0x2d220, rx_buf_addr = 0x207dc, count = 0x0, size = 0x5f8, packet = {0x0 }} @@ -1540,6 +1540,7 @@ static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) /* S bit is set. */ set_ru_state(s, ru_suspended); } + return size; } static int nic_load(QEMUFile * f, void *opaque, int version_id) diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c index 78af76b9bb..c7df44ee45 100644 --- a/hw/etraxfs_eth.c +++ b/hw/etraxfs_eth.c @@ -501,7 +501,7 @@ static int eth_can_receive(VLANClientState *vc) return 1; } -static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { unsigned char sa_bcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; struct fs_eth *eth = vc->opaque; @@ -510,7 +510,7 @@ static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) int r_bcast = eth->regs[RW_REC_CTRL] & 8; if (size < 12) - return; + return -1; D(printf("%x.%x.%x.%x.%x.%x ma=%d %d bc=%d\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], @@ -521,10 +521,12 @@ static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) && (!use_ma1 || memcmp(buf, eth->macaddr[1], 6)) && (!r_bcast || memcmp(buf, sa_bcast, 6)) && !eth_match_groupaddr(eth, buf)) - return; + return size; /* FIXME: Find another way to pass on the fake csum. */ etraxfs_dmac_input(eth->dma_in, (void *)buf, size + 4, 1); + + return size; } static int eth_tx_push(void *opaque, unsigned char *buf, int len) diff --git a/hw/mcf_fec.c b/hw/mcf_fec.c index d2534d05fb..179ec19e07 100644 --- a/hw/mcf_fec.c +++ b/hw/mcf_fec.c @@ -353,7 +353,7 @@ static int mcf_fec_can_receive(VLANClientState *vc) return s->rx_enabled; } -static void mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { mcf_fec_state *s = vc->opaque; mcf_fec_bd bd; @@ -426,6 +426,7 @@ static void mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size s->rx_descriptor = addr; mcf_fec_enable_rx(s); mcf_fec_update(s); + return size; } static CPUReadMemoryFunc *mcf_fec_readfn[] = { diff --git a/hw/mipsnet.c b/hw/mipsnet.c index e9128cbb34..803522949b 100644 --- a/hw/mipsnet.c +++ b/hw/mipsnet.c @@ -75,7 +75,7 @@ static int mipsnet_can_receive(VLANClientState *vc) return !mipsnet_buffer_full(s); } -static void mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { MIPSnetState *s = vc->opaque; @@ -83,7 +83,7 @@ static void mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size printf("mipsnet: receiving len=%d\n", size); #endif if (!mipsnet_can_receive(vc)) - return; + return -1; s->busy = 1; @@ -98,6 +98,8 @@ static void mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size /* Now we can signal we have received something. */ s->intctl |= MIPSNET_INTCTL_RXDONE; mipsnet_update_irq(s); + + return size; } static uint32_t mipsnet_ioport_read(void *opaque, uint32_t addr) diff --git a/hw/musicpal.c b/hw/musicpal.c index 844edb8f37..8c70a2bec8 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -562,7 +562,7 @@ static int eth_can_receive(VLANClientState *vc) return 1; } -static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { mv88w8618_eth_state *s = vc->opaque; uint32_t desc_addr; @@ -586,11 +586,12 @@ static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size) if (s->icr & s->imr) qemu_irq_raise(s->irq); eth_rx_desc_put(desc_addr, &desc); - return; + return size; } desc_addr = desc.next; } while (desc_addr != s->rx_queue[i]); } + return size; } static void eth_tx_desc_put(uint32_t addr, mv88w8618_tx_desc *desc) diff --git a/hw/ne2000.c b/hw/ne2000.c index c0fc34c4b2..f5ae9d7394 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -224,9 +224,10 @@ static int ne2000_can_receive(VLANClientState *vc) #define MIN_BUF_SIZE 60 -static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size_) { NE2000State *s = vc->opaque; + int size = size_; uint8_t *p; unsigned int total_len, next, avail, len, index, mcast_idx; uint8_t buf1[60]; @@ -238,7 +239,7 @@ static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) #endif if (s->cmd & E8390_STOP || ne2000_buffer_full(s)) - return; + return -1; /* XXX: check this */ if (s->rxcr & 0x10) { @@ -247,14 +248,14 @@ static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) if (!memcmp(buf, broadcast_macaddr, 6)) { /* broadcast address */ if (!(s->rxcr & 0x04)) - return; + return size; } else if (buf[0] & 0x01) { /* multicast */ if (!(s->rxcr & 0x08)) - return; + return size; mcast_idx = compute_mcast_idx(buf); if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) - return; + return size; } else if (s->mem[0] == buf[0] && s->mem[2] == buf[1] && s->mem[4] == buf[2] && @@ -263,7 +264,7 @@ static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) s->mem[10] == buf[5]) { /* match */ } else { - return; + return size; } } @@ -316,6 +317,8 @@ static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) /* now we can signal we have received something */ s->isr |= ENISR_RX; ne2000_update_irq(s); + + return size_; } static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val) diff --git a/hw/pcnet.c b/hw/pcnet.c index a8297df2af..b5793ff246 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1076,16 +1076,17 @@ static int pcnet_can_receive(VLANClientState *vc) #define MIN_BUF_SIZE 60 -static void pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size_) { PCNetState *s = vc->opaque; int is_padr = 0, is_bcast = 0, is_ladr = 0; uint8_t buf1[60]; int remaining; int crc_err = 0; + int size = size_; if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size) - return; + return -1; #ifdef PCNET_DEBUG printf("pcnet_receive size=%d\n", size); @@ -1252,6 +1253,8 @@ static void pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) pcnet_poll(s); pcnet_update_irq(s); + + return size_; } static void pcnet_transmit(PCNetState *s) diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 8626d5e6b8..c86b782e4c 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -812,9 +812,10 @@ static int rtl8139_can_receive(VLANClientState *vc) } } -static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size, int do_interrupt) +static ssize_t rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, size_t size_, int do_interrupt) { RTL8139State *s = vc->opaque; + int size = size_; uint32_t packet_header = 0; @@ -828,7 +829,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size if (!s->clock_enabled) { DEBUG_PRINT(("RTL8139: stopped ==========================\n")); - return; + return -1; } /* first check if receiver is enabled */ @@ -836,7 +837,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size if (!rtl8139_receiver_enabled(s)) { DEBUG_PRINT(("RTL8139: receiver disabled ================\n")); - return; + return -1; } /* XXX: check this */ @@ -854,7 +855,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size /* update tally counter */ ++s->tally_counters.RxERR; - return; + return size; } packet_header |= RxBroadcast; @@ -873,7 +874,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size /* update tally counter */ ++s->tally_counters.RxERR; - return; + return size; } int mcast_idx = compute_mcast_idx(buf); @@ -885,7 +886,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size /* update tally counter */ ++s->tally_counters.RxERR; - return; + return size; } packet_header |= RxMulticast; @@ -909,7 +910,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size /* update tally counter */ ++s->tally_counters.RxERR; - return; + return size; } packet_header |= RxPhysical; @@ -926,7 +927,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size /* update tally counter */ ++s->tally_counters.RxERR; - return; + return size; } } @@ -993,7 +994,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size ++s->tally_counters.MissPkt; rtl8139_update_irq(s); - return; + return size_; } uint32_t rx_space = rxdw0 & CP_RX_BUFFER_SIZE_MASK; @@ -1013,7 +1014,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size ++s->tally_counters.MissPkt; rtl8139_update_irq(s); - return; + return size_; } target_phys_addr_t rx_addr = rtl8139_addr64(rxbufLO, rxbufHI); @@ -1118,7 +1119,7 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size s->IntrStatus |= RxOverflow; ++s->RxMissed; rtl8139_update_irq(s); - return; + return size_; } packet_header |= RxStatusOK; @@ -1156,11 +1157,13 @@ static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size { rtl8139_update_irq(s); } + + return size_; } -static void rtl8139_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t rtl8139_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { - rtl8139_do_receive(vc, buf, size, 1); + return rtl8139_do_receive(vc, buf, size, 1); } static void rtl8139_reset_rxring(RTL8139State *s, uint32_t bufferSize) diff --git a/hw/smc91c111.c b/hw/smc91c111.c index 383f0b7daa..93a1fae0dc 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -602,7 +602,7 @@ static int smc91c111_can_receive(VLANClientState *vc) return 1; } -static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { smc91c111_state *s = vc->opaque; int status; @@ -612,7 +612,7 @@ static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t si uint8_t *p; if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) - return; + return -1; /* Short packets are padded with zeros. Receiving a packet < 64 bytes long is considered an error condition. */ if (size < 64) @@ -625,10 +625,10 @@ static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t si packetsize += 4; /* TODO: Flag overrun and receive errors. */ if (packetsize > 2048) - return; + return -1; packetnum = smc91c111_allocate_packet(s); if (packetnum == 0x80) - return; + return -1; s->rx_fifo[s->rx_fifo_len++] = packetnum; p = &s->data[packetnum][0]; @@ -676,6 +676,8 @@ static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t si /* TODO: Raise early RX interrupt? */ s->int_level |= INT_RCV; smc91c111_update(s); + + return size; } static CPUReadMemoryFunc *smc91c111_readfn[] = { diff --git a/hw/stellaris_enet.c b/hw/stellaris_enet.c index 7f308290da..f5b83e445c 100644 --- a/hw/stellaris_enet.c +++ b/hw/stellaris_enet.c @@ -78,7 +78,7 @@ static void stellaris_enet_update(stellaris_enet_state *s) } /* TODO: Implement MAC address filtering. */ -static void stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { stellaris_enet_state *s = vc->opaque; int n; @@ -86,10 +86,10 @@ static void stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size uint32_t crc; if ((s->rctl & SE_RCTL_RXEN) == 0) - return; + return -1; if (s->np >= 31) { DPRINTF("Packet dropped\n"); - return; + return -1; } DPRINTF("Received packet len=%d\n", size); @@ -116,6 +116,8 @@ static void stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size s->ris |= SE_INT_RX; stellaris_enet_update(s); + + return size; } static int stellaris_enet_can_receive(VLANClientState *vc) diff --git a/hw/usb-net.c b/hw/usb-net.c index d8d5e773f5..0e80ca6923 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1369,7 +1369,7 @@ static int usb_net_handle_data(USBDevice *dev, USBPacket *p) return ret; } -static void usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { USBNetState *s = vc->opaque; struct rndis_packet_msg_type *msg; @@ -1377,9 +1377,9 @@ static void usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) if (s->rndis) { msg = (struct rndis_packet_msg_type *) s->in_buf; if (!s->rndis_state == RNDIS_DATA_INITIALIZED) - return; + return -1; if (size + sizeof(struct rndis_packet_msg_type) > sizeof(s->in_buf)) - return; + return -1; memset(msg, 0, sizeof(struct rndis_packet_msg_type)); msg->MessageType = cpu_to_le32(RNDIS_PACKET_MSG); @@ -1398,11 +1398,12 @@ static void usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size) s->in_len = size + sizeof(struct rndis_packet_msg_type); } else { if (size > sizeof(s->in_buf)) - return; + return -1; memcpy(s->in_buf, buf, size); s->in_len = size; } s->in_ptr = 0; + return size; } static int usbnet_can_receive(VLANClientState *vc) diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 1ffebac222..6b34c5afc1 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -361,17 +361,17 @@ static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) return 0; } -static void virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { VirtIONet *n = vc->opaque; struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL; size_t hdr_len, offset, i; if (!do_virtio_net_can_receive(n, size)) - return; + return -1; if (!receive_filter(n, buf, size)) - return; + return size; /* hdr_len refers to the header we supply to the guest */ hdr_len = n->mergeable_rx_bufs ? @@ -389,7 +389,7 @@ static void virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t s if ((i != 0 && !n->mergeable_rx_bufs) || virtqueue_pop(n->rx_vq, &elem) == 0) { if (i == 0) - return; + return -1; fprintf(stderr, "virtio-net truncating packet\n"); exit(1); } @@ -431,6 +431,8 @@ static void virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t s virtqueue_flush(n->rx_vq, i); virtio_notify(&n->vdev, n->rx_vq); + + return size; } /* TX */ diff --git a/hw/xen_nic.c b/hw/xen_nic.c index 173e87a8ff..9a3c870c2d 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -243,7 +243,7 @@ static int net_rx_ok(VLANClientState *vc) return 1; } -static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) { struct XenNetDev *netdev = vc->opaque; netif_rx_request_t rxreq; @@ -251,7 +251,7 @@ static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) void *page; if (netdev->xendev.be_state != XenbusStateConnected) - return; + return -1; rc = netdev->rx_ring.req_cons; rp = netdev->rx_ring.sring->req_prod; @@ -259,12 +259,12 @@ static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) if (rc == rp || RING_REQUEST_CONS_OVERFLOW(&netdev->rx_ring, rc)) { xen_be_printf(&netdev->xendev, 2, "no buffer, drop packet\n"); - return; + return -1; } if (size > XC_PAGE_SIZE - NET_IP_ALIGN) { xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", (unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); - return; + return -1; } memcpy(&rxreq, RING_GET_REQUEST(&netdev->rx_ring, rc), sizeof(rxreq)); @@ -277,11 +277,13 @@ static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size) xen_be_printf(&netdev->xendev, 0, "error: rx gref dereference failed (%d)\n", rxreq.gref); net_rx_response(netdev, &rxreq, NETIF_RSP_ERROR, 0, 0, 0); - return; + return -1; } memcpy(page + NET_IP_ALIGN, buf, size); xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); net_rx_response(netdev, &rxreq, NETIF_RSP_OKAY, NET_IP_ALIGN, size, 0); + + return size; } /* ------------------------------------------------------------- */ diff --git a/net.c b/net.c index da79d99a12..8403120750 100644 --- a/net.c +++ b/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) diff --git a/net.h b/net.h index a28827c4a7..f1cedf4d17 100644 --- a/net.h +++ b/net.h @@ -8,7 +8,7 @@ typedef struct VLANClientState VLANClientState; typedef int (NetCanReceive)(VLANClientState *); -typedef void (NetReceive)(VLANClientState *, const uint8_t *, size_t); +typedef ssize_t (NetReceive)(VLANClientState *, const uint8_t *, size_t); typedef ssize_t (NetReceiveIOV)(VLANClientState *, const struct iovec *, int); typedef void (NetCleanup) (VLANClientState *); typedef void (LinkStatusChanged)(VLANClientState *); diff --git a/tap-win32.c b/tap-win32.c index ff1e1ed5f4..ba93355a74 100644 --- a/tap-win32.c +++ b/tap-win32.c @@ -650,11 +650,11 @@ static void tap_cleanup(VLANClientState *vc) qemu_free(s); } -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 = opaque; + TAPState *s = vc->opaque; - tap_win32_write(s->handle, buf, size); + return tap_win32_write(s->handle, buf, size); } static void tap_win32_send(void *opaque) -- cgit 1.4.1