Message ID | 20171215184155.2543-7-mark.cave-ayland@ilande.co.uk |
---|---|
State | New |
Headers | show |
Series | None | expand |
On 12/15/2017 03:41 PM, Mark Cave-Ayland wrote: > From the Linux sungem driver, we know that the multicast filter CRC is > implemented using ether_crc_le() which isn't the same as calling zlib's > crc32() function (the zlib implementation requires a complemented initial value > and also returns the complemented result). > > Fix the multicast filter by simply using the new net_crc32_le() function. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > hw/net/sungem.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/hw/net/sungem.c b/hw/net/sungem.c > index 6aa8d1117b..60f1e479f3 100644 > --- a/hw/net/sungem.c > +++ b/hw/net/sungem.c > @@ -11,12 +11,11 @@ > #include "hw/pci/pci.h" > #include "qemu/log.h" > #include "net/net.h" > +#include "net/eth.h" > #include "net/checksum.h" > #include "hw/net/mii.h" > #include "sysemu/sysemu.h" > #include "trace.h" > -/* For crc32 */ > -#include <zlib.h> > > #define TYPE_SUNGEM "sungem" > > @@ -595,7 +594,7 @@ static ssize_t sungem_receive(NetClientState *nc, const uint8_t *buf, > } > > /* Get MAC crc */ > - mac_crc = crc32(~0, buf, 6); > + mac_crc = net_crc32_le(buf, ETH_ALEN); > > /* Packet isn't for me ? */ > rx_cond = sungem_check_rx_mac(s, buf, mac_crc); >
diff --git a/hw/net/sungem.c b/hw/net/sungem.c index 6aa8d1117b..60f1e479f3 100644 --- a/hw/net/sungem.c +++ b/hw/net/sungem.c @@ -11,12 +11,11 @@ #include "hw/pci/pci.h" #include "qemu/log.h" #include "net/net.h" +#include "net/eth.h" #include "net/checksum.h" #include "hw/net/mii.h" #include "sysemu/sysemu.h" #include "trace.h" -/* For crc32 */ -#include <zlib.h> #define TYPE_SUNGEM "sungem" @@ -595,7 +594,7 @@ static ssize_t sungem_receive(NetClientState *nc, const uint8_t *buf, } /* Get MAC crc */ - mac_crc = crc32(~0, buf, 6); + mac_crc = net_crc32_le(buf, ETH_ALEN); /* Packet isn't for me ? */ rx_cond = sungem_check_rx_mac(s, buf, mac_crc);
From the Linux sungem driver, we know that the multicast filter CRC is implemented using ether_crc_le() which isn't the same as calling zlib's crc32() function (the zlib implementation requires a complemented initial value and also returns the complemented result). Fix the multicast filter by simply using the new net_crc32_le() function. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> --- hw/net/sungem.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)