On 18/08/17 18:06, Philippe Mathieu-Daudé wrote: > On 08/18/2017 01:51 PM, Philippe Mathieu-Daudé wrote: >> On 08/18/2017 11:15 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> >>> --- >>> 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 1c55a93..586098c 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 0e28099..a856907 100644 >>> --- a/net/net.c >>> +++ b/net/net.c >>> @@ -1568,25 +1568,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) >> >> imho there is no point in using signed length. >> >>> { >>> 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; >> >> while here let's use ETH_ALEN >> > > reading the next patches, what do you think about: > > static inline uint32_t mac_crc32_be(const uint8_t *p) > { > return net_crc32_be(ep, ETH_ALEN); > } > > unsigned compute_mcast_idx(const uint8_t *ep) > { > return mac_crc32_be(p) >> 26; > }
Yes, using ETH_ALEN looks like a good idea - I can do that for the next revision. As for the naming of the functions, I've followed the kernel convention that by default the CRC32 functions are big-endian unless they have a _le suffix. I don't really feel strongly either way, so I'm happy to go with whatever naming scheme Jason prefers. ATB, Mark.