[dpdk-users] FDir flex filters on XL710/i40e NICs with the new filter API

Paul Emmerich emmericp at net.in.tum.de
Fri Aug 19 18:39:14 CEST 2016


I've an update and work-around for this issue that we encountered in 
DPDK >= 2.2. (See original email below)
Cross-posting to dev since this seems to be a bug in the i40e driver.

We are trying to set a filter matching on the following conditions while 
ignoring all other header fields.

1. Packet is a UDP packet
2. Bytes 42 and 43 of the payload are a specific value

The first condition is optional, a filter that just matches on the 
payload bytes of arbitrary packets is fine as well.

So we set all fdir masks to ignore everything except for the payload 
bytes and then add a filter that just specifies the payload bytes.

We got the following results with ixgbe:

Old filter API, DPDK  < 2.2:
everything works fine

New filter API, DPDK >= 2.2:
The "packet is a UDP packet" condition stops working if we do not also 
filter for the ports, i.e., flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP 
does not work as expected.

flow_type = RTE_ETH_FLOW_IPV4 does work.
We are fine with this as we assume that it improves compatibility.

The real problem is the i40e driver.

Setting flow_type to anything other RTE_ETH_FLOW_NONFRAG_IPV4_UDP 
doesn't match any packets (the packets we are trying to match are 
actually UDP packets). I guess that's okay, but inconsistent with the 
ixgbe driver that does accept RTE_ETH_FLOW_IPV4 as well.

The actual problem is that we have to explicitly specify IP addresses 
and ports in the filter, *despite setting masks to ignore them*.

Is this a bug? Or are we using something wrong? (The filter API doesn't 
seem to be very well documented)


Paul Emmerich:
> Hi,
> we are trying to use flex filters to match on payload bytes and our code
> stopped working with the new Filter API after upgrading to DPDK 2.2 or
> later (currently using 16.04).
> We use these filters to match on the bytes 42 and 43 of the payload, the
> filter worked with DPDK 2.0 with both XL710 and 82599 NICs with the old
> fdir filter API.
> We then upgraded to DPDK 2.2 and later to DPDK 16.04 and migrated to the
> new filter API. The filter still works on 82599 NICs but not on XL710 NICs.
> Any ideas what we might be doing wrong here?
> The initialization code can be found here:
> https://github.com/emmericp/MoonGen/blob/master/src/device.c#L115-L157
> Adding the filter is done here:
> https://github.com/emmericp/MoonGen/blob/master/lua/include/filter.lua#L356-L385
> rte_eth_dev_filter_ctrl() does not return an error and the same code
> works for the 82599 NIC. Yet, the filter matches no packets on XL710 NICs.
> Is there a minimal example for the flex filters somewhere that could
> help me track down this?
> Any help would be appreciated.
> Thanks!
>  Paul

More information about the users mailing list