On 5/2/2024 10:31 PM, Stephen Hemminger wrote:
> The flow RSS support via BPF was not using the key, or
> hash type parameters. Which is good because they were never
> properly setup.
> 
> Fix the setup and validate the flow parameters, the BPF
> side gets fixed later.
> 
> Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
>

<...>

> @@ -2095,6 +2112,41 @@ static int rss_add_actions(struct rte_flow *flow, 
> struct pmd_internals *pmd,
>                       (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
>                        "a nonzero RSS encapsulation level is not supported");
>  
> +     if (rss->queue_num == 0 || rss->queue_num >= TAP_MAX_QUEUES)
> +             return rte_flow_error_set(error, EINVAL, 
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
> +                                       "invalid number of queues");
> +
> +     /* allow RSS key_len 0 in case of NULL (default) RSS key. */
> +     if (rss->key_len == 0) {
> +             if (rss->key != NULL)
> +                     return rte_flow_error_set(error, ENOTSUP,
> +                                               
> RTE_FLOW_ERROR_TYPE_ACTION_CONF,
> +                                               &rss->key_len, "RSS hash key 
> length 0");
> +             key_in = rss_hash_default_key;
> +     } else {
> +             if (rss->key_len != TAP_RSS_HASH_KEY_SIZE)
> +                     return rte_flow_error_set(error, EINVAL, 
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +                                               NULL, "RSS hash invalid key 
> length");
> +             if (rss->key == NULL)
> +                     return rte_flow_error_set(error, EINVAL, 
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +                                               NULL, "RSS hash key is NULL");
> +             key_in = rss->key;
> +     }
>

Does it make sense to add above expectations (like if "key_len == 0"
default key used, or 'key_len' expectations, etc..) to the function comment?

<...>

> @@ -2109,8 +2161,11 @@ static int rss_add_actions(struct rte_flow *flow, 
> struct pmd_internals *pmd,
>       rss_entry.nb_queues = rss->queue_num;
>       for (i = 0; i < rss->queue_num; i++)
>               rss_entry.queues[i] = rss->queue[i];
> -     rss_entry.hash_fields =
> -             (1 << HASH_FIELD_IPV4_L3_L4) | (1 << HASH_FIELD_IPV6_L3_L4);
> +
> +     rss_entry.hash_fields = hash_type;
> +     rte_convert_rss_key((const uint32_t *)key_in, (uint32_t *)rss_entry.key,
> +                         TAP_RSS_HASH_KEY_SIZE);
> +
>

Why 'rte_convert_rss_key()' is required? Is this making an assumption on
the CPU architecture?

Reply via email to