[dpdk-users] DPDK application that sends rules to the NIC
george.dit at gmail.com
george.dit at gmail.com
Mon Sep 18 15:38:36 CEST 2017
Hi Nelio,
Thanks for the prompt reply.
I tried not to overwhelm the e-mail but you are right, there is some
missing information.
DPDK version: 17.08
MLNX_OFED: MLNX_OFED_LINUX-3.4-2.0.0.0-ubuntu16.04-x86_64.tgz
here is my code snippet:
//////////////////////////////////////////////////////////////////////
// Flow Attributes: Only ingress rules are currently supported
//////////////////////////////////////////////////////////////////////
struct rte_flow_attr attr = {
.group = 0,
.priority = 0,
.ingress = 1,
.egress = 0,
.reserved = 0,
};
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Flow Patterns
//////////////////////////////////////////////////////////////////////
// L2 - Ethernet type is always IPv4
struct rte_flow_item_eth flow_item_eth_type_ipv4 = {
.dst = {
.addr_bytes = { 0 }
},
.src = {
.addr_bytes = { 0 }
},
.type = RTE_BE16(ETHER_TYPE_IPv4)
};
struct rte_flow_item_eth flow_item_eth_mask_type_ipv4 = {
.dst = {
.addr_bytes = { 0 }
},
.src = {
.addr_bytes = { 0 }
},
.type = 0xFFFF
};
//////////////////////////////////////////////////////////////////////
// Compose the pattern
struct rte_flow_item patterns[] = {
{
.type = RTE_FLOW_ITEM_TYPE_ETH,
.spec = (void *) &flow_item_eth_type_ipv4,
.last = NULL,
.mask = (void *) &flow_item_eth_mask_type_ipv4,
},
{
.type = RTE_FLOW_ITEM_TYPE_END,
.spec = NULL,
.last = NULL,
.mask = NULL,
}
};
//////////////////////////////////////////////////////////////////////
// Flow Actions
//////////////////////////////////////////////////////////////////////
// Only core dispatching is currently supported
struct rte_flow_action_queue queue_conf;
queue_conf.index = RTE_BE16(queue_index);
//////////////////////////////////////////////////////////////////////
struct rte_flow_action actions[] =
{
{
.type = RTE_FLOW_ACTION_TYPE_QUEUE,
.conf = &queue_conf
},
{
.type = RTE_FLOW_ACTION_TYPE_END,
.conf = NULL
}
};
//////////////////////////////////////////////////////////////////////
// Validate Flow
//////////////////////////////////////////////////////////////////////
struct rte_flow_error error;
/* Poisoning to make sure PMDs update it in case of error. */
memset(&error, 0x11, sizeof(error));
uint8_t port_id = 0;
int ret = rte_flow_validate(port_id, &attr, patterns, actions, &error);
if (ret < 0) {
flow_rule_complain(&error);
return false;
}
errh->message("Flow rule validated"); // Up until
here everything works
//////////////////////////////////////////////////////////////////////
// Create Flow
//////////////////////////////////////////////////////////////////////
struct rte_flow *flow = NULL;
// Create a DPDK flow
flow = rte_flow_create(port_id, &attr, patterns, actions, &error);
// At this line I get segmentation fault
if (flow == NULL) {
flow_rule_complain(&error);
return false;
}
SEG FAULT:
Thread 1 "click" received signal SIGSEGV, Segmentation fault.
0x00000000006a8f74 in priv_flow_create_action_queue (flow=0x7fffffffcc90,
flow=0x7fffffffcc90, error=<optimized out>, action=0x7fffffffcd90,
priv=0x7ffbfffeb180)
at /opt/dpdk/drivers/net/mlx5/mlx5_flow.c:1085
1085 rxq = container_of((*priv->rxqs)[action->queues[i]],
I hope this helps you to understand the issue.
Best regards,
Georgios
On Mon, Sep 18, 2017 at 6:20 AM, Nélio Laranjeiro <
nelio.laranjeiro at 6wind.com> wrote:
> 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
>
--
Georgios Katsikas
Industrial Ph.D. Student
Network Intelligence Group
Decision, Networks, and Analytics (DNA) Lab
RISE SICS
E-Mail: georgios.katsikas at ri.se
More information about the users
mailing list