Revision 4f1c942b
b/hw/dp8393x.c | ||
---|---|---|
725 | 725 |
return -1; |
726 | 726 |
} |
727 | 727 |
|
728 |
static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size)
|
|
728 |
static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size)
|
|
729 | 729 |
{ |
730 | 730 |
uint16_t data[10]; |
731 | 731 |
dp8393xState *s = vc->opaque; |
... | ... | |
742 | 742 |
packet_type = receive_filter(s, buf, size); |
743 | 743 |
if (packet_type < 0) { |
744 | 744 |
DPRINTF("packet not for netcard\n"); |
745 |
return; |
|
745 |
return -1;
|
|
746 | 746 |
} |
747 | 747 |
|
748 | 748 |
/* XXX: Check byte ordering */ |
... | ... | |
755 | 755 |
s->memory_rw(s->mem_opaque, address, (uint8_t*)data, size, 0); |
756 | 756 |
if (data[0 * width] & 0x1) { |
757 | 757 |
/* Still EOL ; stop reception */ |
758 |
return; |
|
758 |
return -1;
|
|
759 | 759 |
} else { |
760 | 760 |
s->regs[SONIC_CRDA] = s->regs[SONIC_LLFA]; |
761 | 761 |
} |
... | ... | |
833 | 833 |
|
834 | 834 |
/* Done */ |
835 | 835 |
dp8393x_update_irq(s); |
836 |
|
|
837 |
return size; |
|
836 | 838 |
} |
837 | 839 |
|
838 | 840 |
static void nic_reset(void *opaque) |
b/hw/e1000.c | ||
---|---|---|
599 | 599 |
return (s->mac_reg[RCTL] & E1000_RCTL_EN); |
600 | 600 |
} |
601 | 601 |
|
602 |
static void
|
|
602 |
static ssize_t
|
|
603 | 603 |
e1000_receive(VLANClientState *vc, const uint8_t *buf, size_t size) |
604 | 604 |
{ |
605 | 605 |
E1000State *s = vc->opaque; |
... | ... | |
611 | 611 |
uint8_t vlan_status = 0, vlan_offset = 0; |
612 | 612 |
|
613 | 613 |
if (!(s->mac_reg[RCTL] & E1000_RCTL_EN)) |
614 |
return; |
|
614 |
return -1;
|
|
615 | 615 |
|
616 | 616 |
if (size > s->rxbuf_size) { |
617 | 617 |
DBGOUT(RX, "packet too large for buffers (%lu > %d)\n", |
618 | 618 |
(unsigned long)size, s->rxbuf_size); |
619 |
return; |
|
619 |
return -1;
|
|
620 | 620 |
} |
621 | 621 |
|
622 | 622 |
if (!receive_filter(s, buf, size)) |
623 |
return; |
|
623 |
return size;
|
|
624 | 624 |
|
625 | 625 |
if (vlan_enabled(s) && is_vlan_packet(s, buf)) { |
626 | 626 |
vlan_special = cpu_to_le16(be16_to_cpup((uint16_t *)(buf + 14))); |
... | ... | |
635 | 635 |
do { |
636 | 636 |
if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) { |
637 | 637 |
set_ics(s, 0, E1000_ICS_RXO); |
638 |
return; |
|
638 |
return -1;
|
|
639 | 639 |
} |
640 | 640 |
base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] + |
641 | 641 |
sizeof(desc) * s->mac_reg[RDH]; |
... | ... | |
659 | 659 |
DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n", |
660 | 660 |
rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]); |
661 | 661 |
set_ics(s, 0, E1000_ICS_RXO); |
662 |
return; |
|
662 |
return -1;
|
|
663 | 663 |
} |
664 | 664 |
} while (desc.buffer_addr == 0); |
665 | 665 |
|
... | ... | |
677 | 677 |
n |= E1000_ICS_RXDMT0; |
678 | 678 |
|
679 | 679 |
set_ics(s, 0, n); |
680 |
|
|
681 |
return size; |
|
680 | 682 |
} |
681 | 683 |
|
682 | 684 |
static uint32_t |
b/hw/eepro100.c | ||
---|---|---|
1441 | 1441 |
//~ return !eepro100_buffer_full(s); |
1442 | 1442 |
} |
1443 | 1443 |
|
1444 |
static void nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size)
|
|
1444 |
static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size)
|
|
1445 | 1445 |
{ |
1446 | 1446 |
/* TODO: |
1447 | 1447 |
* - Magic packets should set bit 30 in power management driver register. |
... | ... | |
1458 | 1458 |
if (s->configuration[8] & 0x80) { |
1459 | 1459 |
/* CSMA is disabled. */ |
1460 | 1460 |
logout("%p received while CSMA is disabled\n", s); |
1461 |
return; |
|
1461 |
return -1;
|
|
1462 | 1462 |
} else if (size < 64 && (s->configuration[7] & 1)) { |
1463 | 1463 |
/* Short frame and configuration byte 7/0 (discard short receive) set: |
1464 | 1464 |
* Short frame is discarded */ |
1465 | 1465 |
logout("%p received short frame (%d byte)\n", s, size); |
1466 | 1466 |
s->statistics.rx_short_frame_errors++; |
1467 |
//~ return; |
|
1467 |
//~ return -1;
|
|
1468 | 1468 |
} else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) { |
1469 | 1469 |
/* Long frame and configuration byte 18/3 (long receive ok) not set: |
1470 | 1470 |
* Long frames are discarded. */ |
1471 | 1471 |
logout("%p received long frame (%d byte), ignored\n", s, size); |
1472 |
return; |
|
1472 |
return -1;
|
|
1473 | 1473 |
} else if (memcmp(buf, s->macaddr, 6) == 0) { // !!! |
1474 | 1474 |
/* Frame matches individual address. */ |
1475 | 1475 |
/* TODO: check configuration byte 15/4 (ignore U/L). */ |
... | ... | |
1485 | 1485 |
assert(!(s->configuration[21] & BIT(3))); |
1486 | 1486 |
int mcast_idx = compute_mcast_idx(buf); |
1487 | 1487 |
if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) { |
1488 |
return; |
|
1488 |
return size;
|
|
1489 | 1489 |
} |
1490 | 1490 |
rfd_status |= 0x0002; |
1491 | 1491 |
} else if (s->configuration[15] & 1) { |
... | ... | |
1495 | 1495 |
} else { |
1496 | 1496 |
logout("%p received frame, ignored, len=%d,%s\n", s, size, |
1497 | 1497 |
nic_dump(buf, size)); |
1498 |
return; |
|
1498 |
return size;
|
|
1499 | 1499 |
} |
1500 | 1500 |
|
1501 | 1501 |
if (get_ru_state(s) != ru_ready) { |
... | ... | |
1503 | 1503 |
logout("no ressources, state=%u\n", get_ru_state(s)); |
1504 | 1504 |
s->statistics.rx_resource_errors++; |
1505 | 1505 |
//~ assert(!"no ressources"); |
1506 |
return; |
|
1506 |
return -1;
|
|
1507 | 1507 |
} |
1508 | 1508 |
//~ !!! |
1509 | 1509 |
//~ $3 = {status = 0x0, command = 0xc000, link = 0x2d220, rx_buf_addr = 0x207dc, count = 0x0, size = 0x5f8, packet = {0x0 <repeats 1518 times>}} |
... | ... | |
1540 | 1540 |
/* S bit is set. */ |
1541 | 1541 |
set_ru_state(s, ru_suspended); |
1542 | 1542 |
} |
1543 |
return size; |
|
1543 | 1544 |
} |
1544 | 1545 |
|
1545 | 1546 |
static int nic_load(QEMUFile * f, void *opaque, int version_id) |
b/hw/etraxfs_eth.c | ||
---|---|---|
501 | 501 |
return 1; |
502 | 502 |
} |
503 | 503 |
|
504 |
static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
504 |
static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
505 | 505 |
{ |
506 | 506 |
unsigned char sa_bcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; |
507 | 507 |
struct fs_eth *eth = vc->opaque; |
... | ... | |
510 | 510 |
int r_bcast = eth->regs[RW_REC_CTRL] & 8; |
511 | 511 |
|
512 | 512 |
if (size < 12) |
513 |
return; |
|
513 |
return -1;
|
|
514 | 514 |
|
515 | 515 |
D(printf("%x.%x.%x.%x.%x.%x ma=%d %d bc=%d\n", |
516 | 516 |
buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], |
... | ... | |
521 | 521 |
&& (!use_ma1 || memcmp(buf, eth->macaddr[1], 6)) |
522 | 522 |
&& (!r_bcast || memcmp(buf, sa_bcast, 6)) |
523 | 523 |
&& !eth_match_groupaddr(eth, buf)) |
524 |
return; |
|
524 |
return size;
|
|
525 | 525 |
|
526 | 526 |
/* FIXME: Find another way to pass on the fake csum. */ |
527 | 527 |
etraxfs_dmac_input(eth->dma_in, (void *)buf, size + 4, 1); |
528 |
|
|
529 |
return size; |
|
528 | 530 |
} |
529 | 531 |
|
530 | 532 |
static int eth_tx_push(void *opaque, unsigned char *buf, int len) |
b/hw/mcf_fec.c | ||
---|---|---|
353 | 353 |
return s->rx_enabled; |
354 | 354 |
} |
355 | 355 |
|
356 |
static void mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
356 |
static ssize_t mcf_fec_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
357 | 357 |
{ |
358 | 358 |
mcf_fec_state *s = vc->opaque; |
359 | 359 |
mcf_fec_bd bd; |
... | ... | |
426 | 426 |
s->rx_descriptor = addr; |
427 | 427 |
mcf_fec_enable_rx(s); |
428 | 428 |
mcf_fec_update(s); |
429 |
return size; |
|
429 | 430 |
} |
430 | 431 |
|
431 | 432 |
static CPUReadMemoryFunc *mcf_fec_readfn[] = { |
b/hw/mipsnet.c | ||
---|---|---|
75 | 75 |
return !mipsnet_buffer_full(s); |
76 | 76 |
} |
77 | 77 |
|
78 |
static void mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
78 |
static ssize_t mipsnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
79 | 79 |
{ |
80 | 80 |
MIPSnetState *s = vc->opaque; |
81 | 81 |
|
... | ... | |
83 | 83 |
printf("mipsnet: receiving len=%d\n", size); |
84 | 84 |
#endif |
85 | 85 |
if (!mipsnet_can_receive(vc)) |
86 |
return; |
|
86 |
return -1;
|
|
87 | 87 |
|
88 | 88 |
s->busy = 1; |
89 | 89 |
|
... | ... | |
98 | 98 |
/* Now we can signal we have received something. */ |
99 | 99 |
s->intctl |= MIPSNET_INTCTL_RXDONE; |
100 | 100 |
mipsnet_update_irq(s); |
101 |
|
|
102 |
return size; |
|
101 | 103 |
} |
102 | 104 |
|
103 | 105 |
static uint32_t mipsnet_ioport_read(void *opaque, uint32_t addr) |
b/hw/musicpal.c | ||
---|---|---|
562 | 562 |
return 1; |
563 | 563 |
} |
564 | 564 |
|
565 |
static void eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
565 |
static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
566 | 566 |
{ |
567 | 567 |
mv88w8618_eth_state *s = vc->opaque; |
568 | 568 |
uint32_t desc_addr; |
... | ... | |
586 | 586 |
if (s->icr & s->imr) |
587 | 587 |
qemu_irq_raise(s->irq); |
588 | 588 |
eth_rx_desc_put(desc_addr, &desc); |
589 |
return; |
|
589 |
return size;
|
|
590 | 590 |
} |
591 | 591 |
desc_addr = desc.next; |
592 | 592 |
} while (desc_addr != s->rx_queue[i]); |
593 | 593 |
} |
594 |
return size; |
|
594 | 595 |
} |
595 | 596 |
|
596 | 597 |
static void eth_tx_desc_put(uint32_t addr, mv88w8618_tx_desc *desc) |
b/hw/ne2000.c | ||
---|---|---|
224 | 224 |
|
225 | 225 |
#define MIN_BUF_SIZE 60 |
226 | 226 |
|
227 |
static void ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
227 |
static ssize_t ne2000_receive(VLANClientState *vc, const uint8_t *buf, size_t size_)
|
|
228 | 228 |
{ |
229 | 229 |
NE2000State *s = vc->opaque; |
230 |
int size = size_; |
|
230 | 231 |
uint8_t *p; |
231 | 232 |
unsigned int total_len, next, avail, len, index, mcast_idx; |
232 | 233 |
uint8_t buf1[60]; |
... | ... | |
238 | 239 |
#endif |
239 | 240 |
|
240 | 241 |
if (s->cmd & E8390_STOP || ne2000_buffer_full(s)) |
241 |
return; |
|
242 |
return -1;
|
|
242 | 243 |
|
243 | 244 |
/* XXX: check this */ |
244 | 245 |
if (s->rxcr & 0x10) { |
... | ... | |
247 | 248 |
if (!memcmp(buf, broadcast_macaddr, 6)) { |
248 | 249 |
/* broadcast address */ |
249 | 250 |
if (!(s->rxcr & 0x04)) |
250 |
return; |
|
251 |
return size;
|
|
251 | 252 |
} else if (buf[0] & 0x01) { |
252 | 253 |
/* multicast */ |
253 | 254 |
if (!(s->rxcr & 0x08)) |
254 |
return; |
|
255 |
return size;
|
|
255 | 256 |
mcast_idx = compute_mcast_idx(buf); |
256 | 257 |
if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7)))) |
257 |
return; |
|
258 |
return size;
|
|
258 | 259 |
} else if (s->mem[0] == buf[0] && |
259 | 260 |
s->mem[2] == buf[1] && |
260 | 261 |
s->mem[4] == buf[2] && |
... | ... | |
263 | 264 |
s->mem[10] == buf[5]) { |
264 | 265 |
/* match */ |
265 | 266 |
} else { |
266 |
return; |
|
267 |
return size;
|
|
267 | 268 |
} |
268 | 269 |
} |
269 | 270 |
|
... | ... | |
316 | 317 |
/* now we can signal we have received something */ |
317 | 318 |
s->isr |= ENISR_RX; |
318 | 319 |
ne2000_update_irq(s); |
320 |
|
|
321 |
return size_; |
|
319 | 322 |
} |
320 | 323 |
|
321 | 324 |
static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
b/hw/pcnet.c | ||
---|---|---|
1076 | 1076 |
|
1077 | 1077 |
#define MIN_BUF_SIZE 60 |
1078 | 1078 |
|
1079 |
static void pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1079 |
static ssize_t pcnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size_)
|
|
1080 | 1080 |
{ |
1081 | 1081 |
PCNetState *s = vc->opaque; |
1082 | 1082 |
int is_padr = 0, is_bcast = 0, is_ladr = 0; |
1083 | 1083 |
uint8_t buf1[60]; |
1084 | 1084 |
int remaining; |
1085 | 1085 |
int crc_err = 0; |
1086 |
int size = size_; |
|
1086 | 1087 |
|
1087 | 1088 |
if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size) |
1088 |
return; |
|
1089 |
return -1;
|
|
1089 | 1090 |
|
1090 | 1091 |
#ifdef PCNET_DEBUG |
1091 | 1092 |
printf("pcnet_receive size=%d\n", size); |
... | ... | |
1252 | 1253 |
|
1253 | 1254 |
pcnet_poll(s); |
1254 | 1255 |
pcnet_update_irq(s); |
1256 |
|
|
1257 |
return size_; |
|
1255 | 1258 |
} |
1256 | 1259 |
|
1257 | 1260 |
static void pcnet_transmit(PCNetState *s) |
b/hw/rtl8139.c | ||
---|---|---|
812 | 812 |
} |
813 | 813 |
} |
814 | 814 |
|
815 |
static void rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, int size, int do_interrupt)
|
|
815 |
static ssize_t rtl8139_do_receive(VLANClientState *vc, const uint8_t *buf, size_t size_, int do_interrupt)
|
|
816 | 816 |
{ |
817 | 817 |
RTL8139State *s = vc->opaque; |
818 |
int size = size_; |
|
818 | 819 |
|
819 | 820 |
uint32_t packet_header = 0; |
820 | 821 |
|
... | ... | |
828 | 829 |
if (!s->clock_enabled) |
829 | 830 |
{ |
830 | 831 |
DEBUG_PRINT(("RTL8139: stopped ==========================\n")); |
831 |
return; |
|
832 |
return -1;
|
|
832 | 833 |
} |
833 | 834 |
|
834 | 835 |
/* first check if receiver is enabled */ |
... | ... | |
836 | 837 |
if (!rtl8139_receiver_enabled(s)) |
837 | 838 |
{ |
838 | 839 |
DEBUG_PRINT(("RTL8139: receiver disabled ================\n")); |
839 |
return; |
|
840 |
return -1;
|
|
840 | 841 |
} |
841 | 842 |
|
842 | 843 |
/* XXX: check this */ |
... | ... | |
854 | 855 |
/* update tally counter */ |
855 | 856 |
++s->tally_counters.RxERR; |
856 | 857 |
|
857 |
return; |
|
858 |
return size;
|
|
858 | 859 |
} |
859 | 860 |
|
860 | 861 |
packet_header |= RxBroadcast; |
... | ... | |
873 | 874 |
/* update tally counter */ |
874 | 875 |
++s->tally_counters.RxERR; |
875 | 876 |
|
876 |
return; |
|
877 |
return size;
|
|
877 | 878 |
} |
878 | 879 |
|
879 | 880 |
int mcast_idx = compute_mcast_idx(buf); |
... | ... | |
885 | 886 |
/* update tally counter */ |
886 | 887 |
++s->tally_counters.RxERR; |
887 | 888 |
|
888 |
return; |
|
889 |
return size;
|
|
889 | 890 |
} |
890 | 891 |
|
891 | 892 |
packet_header |= RxMulticast; |
... | ... | |
909 | 910 |
/* update tally counter */ |
910 | 911 |
++s->tally_counters.RxERR; |
911 | 912 |
|
912 |
return; |
|
913 |
return size;
|
|
913 | 914 |
} |
914 | 915 |
|
915 | 916 |
packet_header |= RxPhysical; |
... | ... | |
926 | 927 |
/* update tally counter */ |
927 | 928 |
++s->tally_counters.RxERR; |
928 | 929 |
|
929 |
return; |
|
930 |
return size;
|
|
930 | 931 |
} |
931 | 932 |
} |
932 | 933 |
|
... | ... | |
993 | 994 |
++s->tally_counters.MissPkt; |
994 | 995 |
|
995 | 996 |
rtl8139_update_irq(s); |
996 |
return; |
|
997 |
return size_;
|
|
997 | 998 |
} |
998 | 999 |
|
999 | 1000 |
uint32_t rx_space = rxdw0 & CP_RX_BUFFER_SIZE_MASK; |
... | ... | |
1013 | 1014 |
++s->tally_counters.MissPkt; |
1014 | 1015 |
|
1015 | 1016 |
rtl8139_update_irq(s); |
1016 |
return; |
|
1017 |
return size_;
|
|
1017 | 1018 |
} |
1018 | 1019 |
|
1019 | 1020 |
target_phys_addr_t rx_addr = rtl8139_addr64(rxbufLO, rxbufHI); |
... | ... | |
1118 | 1119 |
s->IntrStatus |= RxOverflow; |
1119 | 1120 |
++s->RxMissed; |
1120 | 1121 |
rtl8139_update_irq(s); |
1121 |
return; |
|
1122 |
return size_;
|
|
1122 | 1123 |
} |
1123 | 1124 |
|
1124 | 1125 |
packet_header |= RxStatusOK; |
... | ... | |
1156 | 1157 |
{ |
1157 | 1158 |
rtl8139_update_irq(s); |
1158 | 1159 |
} |
1160 |
|
|
1161 |
return size_; |
|
1159 | 1162 |
} |
1160 | 1163 |
|
1161 |
static void rtl8139_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1164 |
static ssize_t rtl8139_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1162 | 1165 |
{ |
1163 |
rtl8139_do_receive(vc, buf, size, 1); |
|
1166 |
return rtl8139_do_receive(vc, buf, size, 1);
|
|
1164 | 1167 |
} |
1165 | 1168 |
|
1166 | 1169 |
static void rtl8139_reset_rxring(RTL8139State *s, uint32_t bufferSize) |
b/hw/smc91c111.c | ||
---|---|---|
602 | 602 |
return 1; |
603 | 603 |
} |
604 | 604 |
|
605 |
static void smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
605 |
static ssize_t smc91c111_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
606 | 606 |
{ |
607 | 607 |
smc91c111_state *s = vc->opaque; |
608 | 608 |
int status; |
... | ... | |
612 | 612 |
uint8_t *p; |
613 | 613 |
|
614 | 614 |
if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) |
615 |
return; |
|
615 |
return -1;
|
|
616 | 616 |
/* Short packets are padded with zeros. Receiving a packet |
617 | 617 |
< 64 bytes long is considered an error condition. */ |
618 | 618 |
if (size < 64) |
... | ... | |
625 | 625 |
packetsize += 4; |
626 | 626 |
/* TODO: Flag overrun and receive errors. */ |
627 | 627 |
if (packetsize > 2048) |
628 |
return; |
|
628 |
return -1;
|
|
629 | 629 |
packetnum = smc91c111_allocate_packet(s); |
630 | 630 |
if (packetnum == 0x80) |
631 |
return; |
|
631 |
return -1;
|
|
632 | 632 |
s->rx_fifo[s->rx_fifo_len++] = packetnum; |
633 | 633 |
|
634 | 634 |
p = &s->data[packetnum][0]; |
... | ... | |
676 | 676 |
/* TODO: Raise early RX interrupt? */ |
677 | 677 |
s->int_level |= INT_RCV; |
678 | 678 |
smc91c111_update(s); |
679 |
|
|
680 |
return size; |
|
679 | 681 |
} |
680 | 682 |
|
681 | 683 |
static CPUReadMemoryFunc *smc91c111_readfn[] = { |
b/hw/stellaris_enet.c | ||
---|---|---|
78 | 78 |
} |
79 | 79 |
|
80 | 80 |
/* TODO: Implement MAC address filtering. */ |
81 |
static void stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
81 |
static ssize_t stellaris_enet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
82 | 82 |
{ |
83 | 83 |
stellaris_enet_state *s = vc->opaque; |
84 | 84 |
int n; |
... | ... | |
86 | 86 |
uint32_t crc; |
87 | 87 |
|
88 | 88 |
if ((s->rctl & SE_RCTL_RXEN) == 0) |
89 |
return; |
|
89 |
return -1;
|
|
90 | 90 |
if (s->np >= 31) { |
91 | 91 |
DPRINTF("Packet dropped\n"); |
92 |
return; |
|
92 |
return -1;
|
|
93 | 93 |
} |
94 | 94 |
|
95 | 95 |
DPRINTF("Received packet len=%d\n", size); |
... | ... | |
116 | 116 |
|
117 | 117 |
s->ris |= SE_INT_RX; |
118 | 118 |
stellaris_enet_update(s); |
119 |
|
|
120 |
return size; |
|
119 | 121 |
} |
120 | 122 |
|
121 | 123 |
static int stellaris_enet_can_receive(VLANClientState *vc) |
b/hw/usb-net.c | ||
---|---|---|
1369 | 1369 |
return ret; |
1370 | 1370 |
} |
1371 | 1371 |
|
1372 |
static void usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1372 |
static ssize_t usbnet_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1373 | 1373 |
{ |
1374 | 1374 |
USBNetState *s = vc->opaque; |
1375 | 1375 |
struct rndis_packet_msg_type *msg; |
... | ... | |
1377 | 1377 |
if (s->rndis) { |
1378 | 1378 |
msg = (struct rndis_packet_msg_type *) s->in_buf; |
1379 | 1379 |
if (!s->rndis_state == RNDIS_DATA_INITIALIZED) |
1380 |
return; |
|
1380 |
return -1;
|
|
1381 | 1381 |
if (size + sizeof(struct rndis_packet_msg_type) > sizeof(s->in_buf)) |
1382 |
return; |
|
1382 |
return -1;
|
|
1383 | 1383 |
|
1384 | 1384 |
memset(msg, 0, sizeof(struct rndis_packet_msg_type)); |
1385 | 1385 |
msg->MessageType = cpu_to_le32(RNDIS_PACKET_MSG); |
... | ... | |
1398 | 1398 |
s->in_len = size + sizeof(struct rndis_packet_msg_type); |
1399 | 1399 |
} else { |
1400 | 1400 |
if (size > sizeof(s->in_buf)) |
1401 |
return; |
|
1401 |
return -1;
|
|
1402 | 1402 |
memcpy(s->in_buf, buf, size); |
1403 | 1403 |
s->in_len = size; |
1404 | 1404 |
} |
1405 | 1405 |
s->in_ptr = 0; |
1406 |
return size; |
|
1406 | 1407 |
} |
1407 | 1408 |
|
1408 | 1409 |
static int usbnet_can_receive(VLANClientState *vc) |
b/hw/virtio-net.c | ||
---|---|---|
361 | 361 |
return 0; |
362 | 362 |
} |
363 | 363 |
|
364 |
static void virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
364 |
static ssize_t virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
365 | 365 |
{ |
366 | 366 |
VirtIONet *n = vc->opaque; |
367 | 367 |
struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL; |
368 | 368 |
size_t hdr_len, offset, i; |
369 | 369 |
|
370 | 370 |
if (!do_virtio_net_can_receive(n, size)) |
371 |
return; |
|
371 |
return -1;
|
|
372 | 372 |
|
373 | 373 |
if (!receive_filter(n, buf, size)) |
374 |
return; |
|
374 |
return size;
|
|
375 | 375 |
|
376 | 376 |
/* hdr_len refers to the header we supply to the guest */ |
377 | 377 |
hdr_len = n->mergeable_rx_bufs ? |
... | ... | |
389 | 389 |
if ((i != 0 && !n->mergeable_rx_bufs) || |
390 | 390 |
virtqueue_pop(n->rx_vq, &elem) == 0) { |
391 | 391 |
if (i == 0) |
392 |
return; |
|
392 |
return -1;
|
|
393 | 393 |
fprintf(stderr, "virtio-net truncating packet\n"); |
394 | 394 |
exit(1); |
395 | 395 |
} |
... | ... | |
431 | 431 |
|
432 | 432 |
virtqueue_flush(n->rx_vq, i); |
433 | 433 |
virtio_notify(&n->vdev, n->rx_vq); |
434 |
|
|
435 |
return size; |
|
434 | 436 |
} |
435 | 437 |
|
436 | 438 |
/* TX */ |
b/hw/xen_nic.c | ||
---|---|---|
243 | 243 |
return 1; |
244 | 244 |
} |
245 | 245 |
|
246 |
static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
246 |
static ssize_t net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
247 | 247 |
{ |
248 | 248 |
struct XenNetDev *netdev = vc->opaque; |
249 | 249 |
netif_rx_request_t rxreq; |
... | ... | |
251 | 251 |
void *page; |
252 | 252 |
|
253 | 253 |
if (netdev->xendev.be_state != XenbusStateConnected) |
254 |
return; |
|
254 |
return -1;
|
|
255 | 255 |
|
256 | 256 |
rc = netdev->rx_ring.req_cons; |
257 | 257 |
rp = netdev->rx_ring.sring->req_prod; |
... | ... | |
259 | 259 |
|
260 | 260 |
if (rc == rp || RING_REQUEST_CONS_OVERFLOW(&netdev->rx_ring, rc)) { |
261 | 261 |
xen_be_printf(&netdev->xendev, 2, "no buffer, drop packet\n"); |
262 |
return; |
|
262 |
return -1;
|
|
263 | 263 |
} |
264 | 264 |
if (size > XC_PAGE_SIZE - NET_IP_ALIGN) { |
265 | 265 |
xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", |
266 | 266 |
(unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); |
267 |
return; |
|
267 |
return -1;
|
|
268 | 268 |
} |
269 | 269 |
|
270 | 270 |
memcpy(&rxreq, RING_GET_REQUEST(&netdev->rx_ring, rc), sizeof(rxreq)); |
... | ... | |
277 | 277 |
xen_be_printf(&netdev->xendev, 0, "error: rx gref dereference failed (%d)\n", |
278 | 278 |
rxreq.gref); |
279 | 279 |
net_rx_response(netdev, &rxreq, NETIF_RSP_ERROR, 0, 0, 0); |
280 |
return; |
|
280 |
return -1;
|
|
281 | 281 |
} |
282 | 282 |
memcpy(page + NET_IP_ALIGN, buf, size); |
283 | 283 |
xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); |
284 | 284 |
net_rx_response(netdev, &rxreq, NETIF_RSP_OKAY, NET_IP_ALIGN, size, 0); |
285 |
|
|
286 |
return size; |
|
285 | 287 |
} |
286 | 288 |
|
287 | 289 |
/* ------------------------------------------------------------- */ |
b/net.c | ||
---|---|---|
593 | 593 |
return slirp_inited; |
594 | 594 |
} |
595 | 595 |
|
596 |
static void slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
596 |
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
597 | 597 |
{ |
598 | 598 |
#ifdef DEBUG_SLIRP |
599 | 599 |
printf("slirp input:\n"); |
600 | 600 |
hex_dump(stdout, buf, size); |
601 | 601 |
#endif |
602 | 602 |
slirp_input(buf, size); |
603 |
return size; |
|
603 | 604 |
} |
604 | 605 |
|
605 | 606 |
static int slirp_in_use; |
... | ... | |
945 | 946 |
return len; |
946 | 947 |
} |
947 | 948 |
|
948 |
static void tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
949 |
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
949 | 950 |
{ |
950 | 951 |
TAPState *s = vc->opaque; |
951 |
int ret; |
|
952 |
for(;;) { |
|
953 |
ret = write(s->fd, buf, size); |
|
954 |
if (ret < 0 && (errno == EINTR || errno == EAGAIN)) { |
|
955 |
} else { |
|
956 |
break; |
|
957 |
} |
|
958 |
} |
|
952 |
ssize_t len; |
|
953 |
|
|
954 |
do { |
|
955 |
len = write(s->fd, buf, size); |
|
956 |
} while (len == -1 && (errno == EINTR || errno == EAGAIN)); |
|
957 |
|
|
958 |
return len; |
|
959 | 959 |
} |
960 | 960 |
|
961 | 961 |
static int tap_can_send(void *opaque) |
... | ... | |
1311 | 1311 |
} |
1312 | 1312 |
} |
1313 | 1313 |
|
1314 |
static void vde_receive(VLANClientState *vc, const uint8_t *buf, int size)
|
|
1314 |
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1315 | 1315 |
{ |
1316 | 1316 |
VDEState *s = vc->opaque; |
1317 |
int ret; |
|
1318 |
for(;;) { |
|
1319 |
ret = vde_send(s->vde, (const char *)buf, size, 0); |
|
1320 |
if (ret < 0 && errno == EINTR) { |
|
1321 |
} else { |
|
1322 |
break; |
|
1323 |
} |
|
1324 |
} |
|
1317 |
ssize ret; |
|
1318 |
|
|
1319 |
do { |
|
1320 |
ret = vde_send(s->vde, (const char *)buf, size, 0); |
|
1321 |
} while (ret < 0 && errno == EINTR); |
|
1322 |
|
|
1323 |
return ret; |
|
1325 | 1324 |
} |
1326 | 1325 |
|
1327 | 1326 |
static void vde_cleanup(VLANClientState *vc) |
... | ... | |
1380 | 1379 |
} NetSocketListenState; |
1381 | 1380 |
|
1382 | 1381 |
/* XXX: we consider we can send the whole packet without blocking */ |
1383 |
static void net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1382 |
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1384 | 1383 |
{ |
1385 | 1384 |
NetSocketState *s = vc->opaque; |
1386 | 1385 |
uint32_t len; |
1387 | 1386 |
len = htonl(size); |
1388 | 1387 |
|
1389 | 1388 |
send_all(s->fd, (const uint8_t *)&len, sizeof(len)); |
1390 |
send_all(s->fd, buf, size); |
|
1389 |
return send_all(s->fd, buf, size);
|
|
1391 | 1390 |
} |
1392 | 1391 |
|
1393 |
static void net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1392 |
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1394 | 1393 |
{ |
1395 | 1394 |
NetSocketState *s = vc->opaque; |
1396 |
sendto(s->fd, buf, size, 0, |
|
1397 |
(struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst)); |
|
1395 |
|
|
1396 |
return sendto(s->fd, buf, size, 0, |
|
1397 |
(struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst)); |
|
1398 | 1398 |
} |
1399 | 1399 |
|
1400 | 1400 |
static void net_socket_send(void *opaque) |
... | ... | |
1831 | 1831 |
uint32_t len; |
1832 | 1832 |
}; |
1833 | 1833 |
|
1834 |
static void dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1834 |
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
1835 | 1835 |
{ |
1836 | 1836 |
DumpState *s = vc->opaque; |
1837 | 1837 |
struct pcap_sf_pkthdr hdr; |
... | ... | |
1840 | 1840 |
|
1841 | 1841 |
/* Early return in case of previous error. */ |
1842 | 1842 |
if (s->fd < 0) { |
1843 |
return; |
|
1843 |
return size;
|
|
1844 | 1844 |
} |
1845 | 1845 |
|
1846 | 1846 |
ts = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec); |
... | ... | |
1856 | 1856 |
close(s->fd); |
1857 | 1857 |
s->fd = -1; |
1858 | 1858 |
} |
1859 |
|
|
1860 |
return size; |
|
1859 | 1861 |
} |
1860 | 1862 |
|
1861 | 1863 |
static void net_dump_cleanup(VLANClientState *vc) |
b/net.h | ||
---|---|---|
8 | 8 |
typedef struct VLANClientState VLANClientState; |
9 | 9 |
|
10 | 10 |
typedef int (NetCanReceive)(VLANClientState *); |
11 |
typedef void (NetReceive)(VLANClientState *, const uint8_t *, size_t);
|
|
11 |
typedef ssize_t (NetReceive)(VLANClientState *, const uint8_t *, size_t);
|
|
12 | 12 |
typedef ssize_t (NetReceiveIOV)(VLANClientState *, const struct iovec *, int); |
13 | 13 |
typedef void (NetCleanup) (VLANClientState *); |
14 | 14 |
typedef void (LinkStatusChanged)(VLANClientState *); |
b/tap-win32.c | ||
---|---|---|
650 | 650 |
qemu_free(s); |
651 | 651 |
} |
652 | 652 |
|
653 |
static void tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
653 |
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
654 | 654 |
{ |
655 |
TAPState *s = opaque; |
|
655 |
TAPState *s = vc->opaque;
|
|
656 | 656 |
|
657 |
tap_win32_write(s->handle, buf, size); |
|
657 |
return tap_win32_write(s->handle, buf, size);
|
|
658 | 658 |
} |
659 | 659 |
|
660 | 660 |
static void tap_win32_send(void *opaque) |
Also available in: Unified diff