On 12/2/2016 11:53 AM, Beilei Xing wrote:
> Check if the rule is a ethertype rule, and get the ethertype
> info BTW.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo...@intel.com>
> Signed-off-by: Beilei Xing <beilei.x...@intel.com>
> ---

CC: Adrien Mazarguil <adrien.mazarg...@6wind.com>

>  lib/librte_ether/rte_flow.c        | 136 
> +++++++++++++++++++++++++++++++++++++
>  lib/librte_ether/rte_flow_driver.h |  34 ++++++++++

<...>

> diff --git a/lib/librte_ether/rte_flow_driver.h 
> b/lib/librte_ether/rte_flow_driver.h
> index a88c621..2760c74 100644
> --- a/lib/librte_ether/rte_flow_driver.h
> +++ b/lib/librte_ether/rte_flow_driver.h
> @@ -170,6 +170,40 @@ rte_flow_error_set(struct rte_flow_error *error,
>  const struct rte_flow_ops *
>  rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error);
>  
> +int cons_parse_ethertype_filter(const struct rte_flow_attr *attr,
> +                         const struct rte_flow_item *pattern,
> +                         const struct rte_flow_action *actions,
> +                         struct rte_eth_ethertype_filter *filter,
> +                         struct rte_flow_error *error);

Although this is helper function, it may be good if it follows the
rte_follow namespace.

> +
> +#define PATTERN_SKIP_VOID(filter, filter_struct, error_type)         \
> +     do {                                                            \
> +             if (!pattern) {                                         \
> +                     memset(filter, 0, sizeof(filter_struct));       \
> +                     error->type = error_type;                       \
> +                     return -EINVAL;                                 \
> +             }                                                       \
> +             item = pattern + i;                                     \

I believe macros that relies on variables that not passed as argument is
not good idea.

> +             while (item->type == RTE_FLOW_ITEM_TYPE_VOID) {         \
> +                     i++;                                            \
> +                     item = pattern + i;                             \
> +             }                                                       \
> +     } while (0)
> +
> +#define ACTION_SKIP_VOID(filter, filter_struct, error_type)          \
> +     do {                                                            \
> +             if (!actions) {                                         \
> +                     memset(filter, 0, sizeof(filter_struct));       \
> +                     error->type = error_type;                       \
> +                     return -EINVAL;                                 \
> +             }                                                       \
> +             act = actions + i;                                      \
> +             while (act->type == RTE_FLOW_ACTION_TYPE_VOID) {        \
> +                     i++;                                            \
> +                     act = actions + i;                              \
> +             }                                                       \
> +     } while (0)

Are these macros generic enough for all rte_flow consumers?

What do you think separate this patch, and use these after applied,
meanwhile keeping function and MACROS PMD internal?

> +
>  #ifdef __cplusplus
>  }
>  #endif
> 

Reply via email to