From: bwasim <bilal_wa...@mentor.com> The current code makes a bad assumption that the most-significant byte of the MAC address is used to determine if the address is multicast or unicast, but in reality only a single bit is used to determine this. This caused IPv6 to not work.. Fix is now in place and has been tested with ZCU102-A53 / IPv6 on a TAP interface. Works well..
Signed-off-by: Bilal Wasim <bilal_wa...@mentor.com> --- hw/net/cadence_gem.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c index b8be73dc55..6400b3653b 100644 --- a/hw/net/cadence_gem.c +++ b/hw/net/cadence_gem.c @@ -34,6 +34,7 @@ #include "qemu/module.h" #include "sysemu/dma.h" #include "net/checksum.h" +#include "net/eth.h" #ifdef CADENCE_GEM_ERR_DEBUG #define DB_PRINT(...) do { \ @@ -601,7 +602,7 @@ static void gem_receive_updatestats(CadenceGEMState *s, const uint8_t *packet, } /* Error-free Multicast Frames counter */ - if (packet[0] == 0x01) { + if (is_multicast_ether_addr(packet)) { s->regs[GEM_RXMULTICNT]++; } @@ -690,21 +691,25 @@ static int gem_mac_address_filter(CadenceGEMState *s, const uint8_t *packet) } /* Accept packets -w- hash match? */ - if ((packet[0] == 0x01 && (s->regs[GEM_NWCFG] & GEM_NWCFG_MCAST_HASH)) || - (packet[0] != 0x01 && (s->regs[GEM_NWCFG] & GEM_NWCFG_UCAST_HASH))) { + if ((is_multicast_ether_addr(packet) + && (s->regs[GEM_NWCFG] & GEM_NWCFG_MCAST_HASH)) || + (is_unicast_ether_addr(packet) + && (s->regs[GEM_NWCFG] & GEM_NWCFG_UCAST_HASH))) { unsigned hash_index; hash_index = calc_mac_hash(packet); if (hash_index < 32) { if (s->regs[GEM_HASHLO] & (1<<hash_index)) { - return packet[0] == 0x01 ? GEM_RX_MULTICAST_HASH_ACCEPT : - GEM_RX_UNICAST_HASH_ACCEPT; + return is_multicast_ether_addr(packet) ? + GEM_RX_MULTICAST_HASH_ACCEPT : + GEM_RX_UNICAST_HASH_ACCEPT; } } else { hash_index -= 32; if (s->regs[GEM_HASHHI] & (1<<hash_index)) { - return packet[0] == 0x01 ? GEM_RX_MULTICAST_HASH_ACCEPT : - GEM_RX_UNICAST_HASH_ACCEPT; + return is_multicast_ether_addr(packet) ? + GEM_RX_MULTICAST_HASH_ACCEPT : + GEM_RX_UNICAST_HASH_ACCEPT; } } } @@ -1083,7 +1088,7 @@ static void gem_transmit_updatestats(CadenceGEMState *s, const uint8_t *packet, } /* Error-free Multicast Frames counter */ - if (packet[0] == 0x01) { + if (is_multicast_ether_addr(packet)) { s->regs[GEM_TXMCNT]++; } -- 2.19.1.windows.1