[dpdk-users] DPDK application that sends rules to the NIC

Nélio Laranjeiro nelio.laranjeiro at 6wind.com
Mon Sep 18 15:20:56 CEST 2017


Hi Georgios,

On Mon, Sep 18, 2017 at 05:26:08AM -0700, george.dit at gmail.com wrote:
> Dear all,
> 
> I am implementing my own DPDK application to program a Mellanox NIC (mlx5
> driver) but I have some issues.
> Specifically I compose a simple rule that matches only the Ethernet
> header's type field using value 800 (Ethernet frames that encapsulate IPv4
> packets).
> Then I compose an action RTE_FLOW_ACTION_TYPE_QUEUE which redirects the
> matched packets to queue index 0.
> 
> Using test-pmd, this rule is: "flow create 0 ingress pattern eth type is
> 800 / end actions queue index 0 / end" and I get a "Flow rule #0 created"
> message.
> In my application I compose the same rule using:
> 
> PATTERNS
> 
> struct rte_flow_item_eth flow_item_eth_type_ipv4 = {
>         .dst = {
>             .addr_bytes = { 0 }
>         },
>         .src = {
>             .addr_bytes = { 0 }
>         },
>         .type = RTE_BE16(ETHER_TYPE_IPv4)                // from rte_ether.h
>     };
> 
>     struct rte_flow_item_eth flow_item_eth_mask_type_ipv4 = {
>         .dst = {
>             .addr_bytes = { 0 }
>         },
>         .src = {
>             .addr_bytes = { 0 }
>         },
>         .type = 0xFFFF
>  // match only the 'type' filed
>     };
> 
> struct rte_flow_item patterns[] = {
>         {
>             .type = RTE_FLOW_ITEM_TYPE_ETH,
>             .spec = &flow_item_eth_type_ipv4,
>             .last = NULL,
>             .mask = &flow_item_eth_mask_type_ipv4,
>         },
>         {
>             .type = RTE_FLOW_ITEM_TYPE_END,
>             .spec = NULL,
>             .last = NULL,
>             .mask = NULL,
>         }
>     };
> 
> ACTIONS
> 
> struct rte_flow_action_queue queue_conf;
> queue_conf.index = 0;
> 
> struct rte_flow_action actions[] =
>     {
>         {
>             .type = RTE_FLOW_ACTION_TYPE_QUEUE,
>             .conf = &queue_conf
>         },
>         {
>             .type = RTE_FLOW_ACTION_TYPE_END,
>             .conf = NULL
>         }
>     };
> 
> PROBLEM
> 
> When I pass this rule to rte_flow_validate(...) it is successfully
> validated, but rte_flow_create() crashes although it get the very same
> arguments.

Can you explain a little more what do you mean by "crash" ?

> If I replace my Mellanox NIC with an Intel 82599 (using DPDK's ixgbe
> driver), then the validate function returns error: "Caught error type 9
> (specific pattern item): Not supported by L2 tunnel filter".
> The error reported by the Intel driver is weird because there is no
> tunneling.
>
> I guess some value assignments require strict format and are sensitive
> (e.g., big/little endian) so I would really appreciate your help.
> 
> Thanks in advance and best regards,
> Georgios

With so few informations it is not easy to help, from the code above I
don't see anything wrong.  To help can you answer the following points:

 - which version of DPDK are you using,
 - which version of MLNX_OFED,
 - Is it possible to share your snippet of code (just the pattern/action
   allocation) ?

Regards,

-- 
Nélio Laranjeiro
6WIND


More information about the users mailing list