hash: fix strict-aliasing for CRC
Fix rte_hash_crc() function by making use of uintptr_t variable
to hold a pointer to data being hashed. In this way, casting uint64_t
pointer to uint32_t avoided.
Fixes: 614289298d
("hash: slice CRC data into 8-byte pieces")
Signed-off-by: Yerden Zhumabekov <e_zhumabekov@sts.kz>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
parent
91a8743eb9
commit
504a29af13
@ -513,35 +513,36 @@ rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val)
|
|||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
uint64_t temp = 0;
|
uint64_t temp = 0;
|
||||||
const uint64_t *p64 = (const uint64_t *)data;
|
uintptr_t pd = (uintptr_t) data;
|
||||||
|
|
||||||
for (i = 0; i < data_len / 8; i++) {
|
for (i = 0; i < data_len / 8; i++) {
|
||||||
init_val = rte_hash_crc_8byte(*p64++, init_val);
|
init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val);
|
||||||
|
pd += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (7 - (data_len & 0x07)) {
|
switch (7 - (data_len & 0x07)) {
|
||||||
case 0:
|
case 0:
|
||||||
temp |= (uint64_t) *((const uint8_t *)p64 + 6) << 48;
|
temp |= (uint64_t) *((const uint8_t *)pd + 6) << 48;
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
case 1:
|
case 1:
|
||||||
temp |= (uint64_t) *((const uint8_t *)p64 + 5) << 40;
|
temp |= (uint64_t) *((const uint8_t *)pd + 5) << 40;
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
case 2:
|
case 2:
|
||||||
temp |= (uint64_t) *((const uint8_t *)p64 + 4) << 32;
|
temp |= (uint64_t) *((const uint8_t *)pd + 4) << 32;
|
||||||
temp |= *((const uint32_t *)p64);
|
temp |= *(const uint32_t *)pd;
|
||||||
init_val = rte_hash_crc_8byte(temp, init_val);
|
init_val = rte_hash_crc_8byte(temp, init_val);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
init_val = rte_hash_crc_4byte(*(const uint32_t *)p64, init_val);
|
init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, init_val);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
temp |= *((const uint8_t *)p64 + 2) << 16;
|
temp |= *((const uint8_t *)pd + 2) << 16;
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
case 5:
|
case 5:
|
||||||
temp |= *((const uint8_t *)p64 + 1) << 8;
|
temp |= *((const uint8_t *)pd + 1) << 8;
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
case 6:
|
case 6:
|
||||||
temp |= *((const uint8_t *)p64);
|
temp |= *(const uint8_t *)pd;
|
||||||
init_val = rte_hash_crc_4byte(temp, init_val);
|
init_val = rte_hash_crc_4byte(temp, init_val);
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user