aboutsummaryrefslogtreecommitdiff
path: root/hw/pcnet.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-07-04 21:42:10 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-07-04 21:42:10 +0000
commit219fb125039e175a92aa14684ac688305b5143bd (patch)
treecfd7477e17671f7f44f447d1cf4d8a4083a40d8e /hw/pcnet.c
parent8ead62cfc21f61a32677892c721674e06e9f6153 (diff)
avoid unneeded dependencies
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2041 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/pcnet.c')
-rw-r--r--hw/pcnet.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/hw/pcnet.c b/hw/pcnet.c
index 1200581628..a375f27d92 100644
--- a/hw/pcnet.c
+++ b/hw/pcnet.c
@@ -29,11 +29,6 @@
#include "vl.h"
-/* XXX: suppress those headers */
-#include <sys/times.h>
-#include <arpa/inet.h>
-#include <net/ethernet.h>
-
//#define PCNET_DEBUG
//#define PCNET_DEBUG_IO
//#define PCNET_DEBUG_BCR
@@ -70,6 +65,12 @@ struct PCNetState_st {
#error FixMe
#endif
+struct qemu_ether_header {
+ uint8_t ether_dhost[6];
+ uint8_t ether_shost[6];
+ uint16_t ether_type;
+};
+
/* BUS CONFIGURATION REGISTERS */
#define BCR_MSRDA 0
#define BCR_MSWRA 1
@@ -441,7 +442,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd, target_
#endif
#define PRINT_PKTHDR(BUF) do { \
- struct ether_header *hdr = (void *)(BUF); \
+ struct qemu_ether_header *hdr = (void *)(BUF); \
printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, " \
"shost=%02x:%02x:%02x:%02x:%02x:%02x, " \
"type=0x%04x (bcast=%d)\n", \
@@ -449,7 +450,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd, target_
hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \
hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \
hdr->ether_shost[3],hdr->ether_shost[4],hdr->ether_shost[5], \
- htons(hdr->ether_type), \
+ be16_to_cpu(hdr->ether_type), \
!!ETHER_IS_MULTICAST(hdr->ether_dhost)); \
} while (0)
@@ -462,7 +463,7 @@ static inline uint32_t lnc_mchash(const uint8_t *ether_addr)
int idx, bit;
uint8_t data;
- for (idx = 0; idx < ETHER_ADDR_LEN; idx++) {
+ for (idx = 0; idx < 6; idx++) {
for (data = *ether_addr++, bit = 0; bit < MULTICAST_FILTER_LEN; bit++) {
crc = (crc >> 1) ^ (((crc ^ data) & 1) ? LNC_POLYNOMIAL : 0);
data >>= 1;
@@ -547,7 +548,7 @@ static const uint32_t crctab[256] = {
static inline int padr_match(PCNetState *s, const uint8_t *buf, int size)
{
- struct ether_header *hdr = (void *)buf;
+ struct qemu_ether_header *hdr = (void *)buf;
uint8_t padr[6] = {
s->csr[12] & 0xff, s->csr[12] >> 8,
s->csr[13] & 0xff, s->csr[13] >> 8,
@@ -568,7 +569,7 @@ static inline int padr_match(PCNetState *s, const uint8_t *buf, int size)
static inline int padr_bcast(PCNetState *s, const uint8_t *buf, int size)
{
static uint8_t BCAST[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
- struct ether_header *hdr = (void *)buf;
+ struct qemu_ether_header *hdr = (void *)buf;
int result = !CSR_DRCVBC(s) && !bcmp(hdr->ether_dhost, BCAST, 6);
#ifdef PCNET_DEBUG_MATCH
printf("padr_bcast result=%d\n", result);
@@ -578,7 +579,7 @@ static inline int padr_bcast(PCNetState *s, const uint8_t *buf, int size)
static inline int ladr_match(PCNetState *s, const uint8_t *buf, int size)
{
- struct ether_header *hdr = (void *)buf;
+ struct qemu_ether_header *hdr = (void *)buf;
if ((*(hdr->ether_dhost)&0x01) &&
((uint64_t *)&s->csr[8])[0] != 0LL) {
uint8_t ladr[8] = {
@@ -993,17 +994,18 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size)
memcpy(src, buf, size);
+#if 1
+ /* no need to compute the CRC */
+ src[size] = 0;
+ src[size + 1] = 0;
+ src[size + 2] = 0;
+ src[size + 3] = 0;
+ size += 4;
+#else
/* XXX: avoid CRC generation */
if (!CSR_ASTRP_RCV(s)) {
uint32_t fcs = ~0;
-#if 0
- uint8_t *p = s->buffer;
-
- ((uint32_t *)p)[0] = ((uint32_t *)p)[1] = 0xaaaaaaaa;
- p[7] = 0xab;
-#else
uint8_t *p = src;
-#endif
while (size < 46) {
src[size++] = 0;
@@ -1015,6 +1017,7 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size)
((uint32_t *)&src[size])[0] = htonl(fcs);
size += 4; /* FCS at end of packet */
} else size += 4;
+#endif
#ifdef PCNET_DEBUG_MATCH
PRINT_PKTHDR(buf);