qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/4] net: move CRC32 calculation from compute_mc


From: Mark Cave-Ayland
Subject: Re: [Qemu-devel] [PATCH 1/4] net: move CRC32 calculation from compute_mcast_idx() into its own net_crc32() function
Date: Fri, 18 Aug 2017 19:11:33 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1

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 <address@hidden>
>>> ---
>>>   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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]