On 12/05/2017 05:17 AM, Mark Cave-Ayland wrote: > Separate out the standard ethernet CRC32 calculation into a new net_crc32() > function, renaming the constant POLYNOMIAL to POLYNOMIAL_BE to make it clear > that this is a big-endian CRC32 calculation. > > Then remove the existing implementation from compute_mcast_idx() and call the > new function in its place. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > --- > include/net/net.h | 3 ++- > net/net.c | 16 +++++++++++----- > 2 files changed, 13 insertions(+), 6 deletions(-) > > diff --git a/include/net/net.h b/include/net/net.h > index 1c55a93588..586098cb94 100644 > --- a/include/net/net.h > +++ b/include/net/net.h > @@ -227,7 +227,8 @@ NetClientState *net_hub_port_find(int hub_id); > > void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd); > > -#define POLYNOMIAL 0x04c11db6 > +#define POLYNOMIAL_BE 0x04c11db6 > +uint32_t net_crc32(const uint8_t *p, int len); > unsigned compute_mcast_idx(const uint8_t *ep); > > #define vmstate_offset_macaddr(_state, _field) \ > diff --git a/net/net.c b/net/net.c > index 39ef546708..02a567c18f 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -1581,25 +1581,31 @@ int net_client_parse(QemuOptsList *opts_list, const > char *optarg) > > /* From FreeBSD */ > /* XXX: optimize */ > -unsigned compute_mcast_idx(const uint8_t *ep) > +uint32_t net_crc32(const uint8_t *p, int len) > { > uint32_t crc; > int carry, i, j; > uint8_t b; > > crc = 0xffffffff; > - for (i = 0; i < 6; i++) { > - b = *ep++; > + for (i = 0; i < len; i++) { > + b = *p++; > for (j = 0; j < 8; j++) { > carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01); > crc <<= 1; > b >>= 1; > if (carry) { > - crc = ((crc ^ POLYNOMIAL) | carry); > + crc = ((crc ^ POLYNOMIAL_BE) | carry); > } > } > } > - return crc >> 26; > + > + return crc; > +} > + > +unsigned compute_mcast_idx(const uint8_t *ep) > +{ > + return net_crc32(ep, 6) >> 26; > } > > QemuOptsList qemu_netdev_opts = { >