[dpdk-dev] [PATCH 2/4] lpm: fix vector lookup for x86

Medvedkin, Vladimir vladimir.medvedkin at intel.com
Wed Jan 13 19:46:53 CET 2021



On 08/01/2021 08:21, Ruifeng Wang wrote:
> rte_lpm_lookupx4 could return wrong next hop when more than 256 tbl8
> groups are created. This is caused by incorrect type casting of tbl8
> group index that been stored in tbl24 entry. The casting caused group
> index truncation and hence wrong tbl8 group been searched.
> 
> Issue fixed by applying proper mask to tbl24 entry to get tbl8 group index.
> 
> Fixes: dc81ebbacaeb ("lpm: extend IPv4 next hop field")
> Cc: michalx.kobylinski at intel.com
> Cc: stable at dpdk.org
> 
> Signed-off-by: Ruifeng Wang <ruifeng.wang at arm.com>
> ---
>   lib/librte_lpm/rte_lpm_sse.h | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/librte_lpm/rte_lpm_sse.h b/lib/librte_lpm/rte_lpm_sse.h
> index 44770b6ff..eaa863c52 100644
> --- a/lib/librte_lpm/rte_lpm_sse.h
> +++ b/lib/librte_lpm/rte_lpm_sse.h
> @@ -82,28 +82,28 @@ rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
>   	if (unlikely((pt & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
>   			RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
>   		i8.u32[0] = i8.u32[0] +
> -			(uint8_t)tbl[0] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
> +			(tbl[0] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
>   		ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[0]];
>   		tbl[0] = *ptbl;
>   	}
>   	if (unlikely((pt >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
>   			RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
>   		i8.u32[1] = i8.u32[1] +
> -			(uint8_t)tbl[1] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
> +			(tbl[1] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
>   		ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[1]];
>   		tbl[1] = *ptbl;
>   	}
>   	if (unlikely((pt2 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
>   			RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
>   		i8.u32[2] = i8.u32[2] +
> -			(uint8_t)tbl[2] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
> +			(tbl[2] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
>   		ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[2]];
>   		tbl[2] = *ptbl;
>   	}
>   	if (unlikely((pt2 >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
>   			RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
>   		i8.u32[3] = i8.u32[3] +
> -			(uint8_t)tbl[3] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
> +			(tbl[3] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
>   		ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[3]];
>   		tbl[3] = *ptbl;
>   	}
> 

Acked-by: Vladimir Medvedkin <vladimir.medvedkin at intel.com>

-- 
Regards,
Vladimir


More information about the dev mailing list