|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] public/io/netif.h: make control ring hash protocol more general
>>> On 15.02.16 at 11:17, <paul.durrant@xxxxxxxxxx> wrote:
> +#define NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ 1
> +
> +/*
> + * This algorithm uses a 'key' as well as the data buffer itself.
> + * (Buffer[] and Key[] are treated as shift-registers where the MSB of
> + * Buffer/Key[0] is considered 'left-most' and the LSB of Buffer/Key[N-1]
> + * is the 'right-most').
> + *
> + * Value = 0
> + * For number of bits in Buffer[]
> + * If (left-most bit of Buffer[] is 1)
> + * Value ^= left-most 32 bits of Key[]
> + * Key[] << 1
> + * Buffer[] << 1
> + *
> + * The code below is provided for convenience where an operating system
> + * does not already provide an implementation.
> + */
> +
> +static inline uint32_t netif_toeplitz_hash(const uint8_t *key,
> + unsigned int keylen,
> + const uint8_t *buf,
> + unsigned int buflen)
> +{
> + unsigned int keyi, bufi;
> + uint64_t prefix = 0;
> + uint64_t hash = 0;
> +
> + /* Pre-load prefix with the first 8 bytes of the key */
> + for (keyi = 0; keyi < 8; keyi++) {
> + prefix <<= 8;
> + prefix |= (keyi < keylen) ? key[keyi] : 0;
> + }
> +
> + for (bufi = 0; bufi < buflen; bufi++) {
> + uint8_t byte = buf[bufi];
> + unsigned int bit;
> +
> + for (bit = 0; bit < 8; bit++) {
> + if (byte & 0x80)
> + hash ^= prefix;
> + prefix <<= 1;
> + byte <<=1;
> + }
> +
> + /*
> + * 'prefix' has now been left-shifted by 8, so
> + * OR in the next byte.
> + */
> + prefix |= (keyi < keylen) ? key[keyi] : 0;
> + keyi++;
> + }
> +
> + /* The valid part of the hash is in the upper 32 bits. */
> + return hash >> 32;
> +}
"inline" is not a C89 keyword and hence can't be used without
suitable guarding in a public header. I'd suggest making this
reference implementation an opt-in thing, controllable by the
consumer needing to #define some tbd identifier.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |