DEC Tulip: Correctly return 0 when aborting receive on the first descriptor and no longer block broadcast packets.
This commit is contained in:
@@ -452,7 +452,9 @@ tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
|
|||||||
static bool
|
static bool
|
||||||
tulip_filter_address(TULIPState *s, const uint8_t *addr)
|
tulip_filter_address(TULIPState *s, const uint8_t *addr)
|
||||||
{
|
{
|
||||||
|
#ifdef BLOCK_BROADCAST
|
||||||
static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||||
|
#endif
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 16 && ret == false; i++) {
|
for (uint8_t i = 0; i < 16 && ret == false; i++) {
|
||||||
@@ -461,9 +463,15 @@ tulip_filter_address(TULIPState *s, const uint8_t *addr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not block broadcast packets - needed for connections to the guest
|
||||||
|
to succeed when using SLiRP.
|
||||||
|
*/
|
||||||
|
#ifdef BLOCK_BROADCAST
|
||||||
if (!memcmp(addr, broadcast, ETH_ALEN)) {
|
if (!memcmp(addr, broadcast, ETH_ALEN)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
|
if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
|
||||||
/* Promiscuous mode enabled */
|
/* Promiscuous mode enabled */
|
||||||
@@ -488,7 +496,7 @@ tulip_receive(void *priv, uint8_t *buf, int size)
|
|||||||
{
|
{
|
||||||
struct tulip_descriptor desc;
|
struct tulip_descriptor desc;
|
||||||
TULIPState *s = (TULIPState *) priv;
|
TULIPState *s = (TULIPState *) priv;
|
||||||
|
int first = 1;
|
||||||
|
|
||||||
if (size < 14 || size > sizeof(s->rx_frame) - 4
|
if (size < 14 || size > sizeof(s->rx_frame) - 4
|
||||||
|| s->rx_frame_len || tulip_rx_stopped(s))
|
|| s->rx_frame_len || tulip_rx_stopped(s))
|
||||||
@@ -506,7 +514,11 @@ tulip_receive(void *priv, uint8_t *buf, int size)
|
|||||||
if (!(desc.status & RDES0_OWN)) {
|
if (!(desc.status & RDES0_OWN)) {
|
||||||
s->csr[5] |= CSR5_RU;
|
s->csr[5] |= CSR5_RU;
|
||||||
tulip_update_int(s);
|
tulip_update_int(s);
|
||||||
return s->rx_frame_size - s->rx_frame_len;
|
if (first)
|
||||||
|
/* Stop at the very beginning, tell the host 0 bytes have been received. */
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return (s->rx_frame_size - s->rx_frame_len) % s->rx_frame_size;
|
||||||
}
|
}
|
||||||
desc.status = 0;
|
desc.status = 0;
|
||||||
|
|
||||||
@@ -527,6 +539,7 @@ tulip_receive(void *priv, uint8_t *buf, int size)
|
|||||||
}
|
}
|
||||||
tulip_desc_write(s, s->current_rx_desc, &desc);
|
tulip_desc_write(s, s->current_rx_desc, &desc);
|
||||||
tulip_next_rx_descriptor(s, &desc);
|
tulip_next_rx_descriptor(s, &desc);
|
||||||
|
first = 0;
|
||||||
} while (s->rx_frame_len);
|
} while (s->rx_frame_len);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
Reference in New Issue
Block a user