On Thu, Aug 23, 2012 at 05:39:39PM +0200, Aurelien Jarno wrote: > The lan9118 emulation tries to compute the multicast index by calling > directly the crc32() function from zlib, but fails to get the correct > result. > > Use the common compute_mcast_idx() function instead, which gives the > correct result. This fixes IPv6 support. > > Signed-off-by: Aurelien Jarno <aurel...@aurel32.net> > --- > hw/lan9118.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/lan9118.c b/hw/lan9118.c > index ff0a50b..ceaf96f 100644 > --- a/hw/lan9118.c > +++ b/hw/lan9118.c > @@ -500,7 +500,7 @@ static int lan9118_filter(lan9118_state *s, const uint8_t > *addr) > } > } else { > /* Hash matching */ > - hash = (crc32(~0, addr, 6) >> 26); > + hash = compute_mcast_idx(addr); > if (hash & 0x20) { > return (s->mac_hashh >> (hash & 0x1f)) & 1; > } else {
Ping? For the record the Linux kernel uses the ether_crc() function for smsc911x.c, but also for 8139cp.c, 8139too.c and ethoc.c, which use compute_mcast_idx() on the QEMU side. To test it, just run this machine with a Linux kernel with IPv6 support on an IPv6-enabled network with router advertisement, it should get an IPv6 address automatically. It doesn't without this patch. -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurel...@aurel32.net http://www.aurel32.net