I should have checked the driver code more thoroughly before asking questions here. From drivers/net/e1000/igb_ethdev.c (ntuple_filter_to_2tuple) seems that only filtering by the dst_port and the proto is supported by this driver. And so the check from the previous question is perfectly correct. switch (filter->dst_port_mask) { case UINT16_MAX: filter_info->dst_port_mask = 0; filter_info->dst_port = filter->dst_port; break; case 0: filter_info->dst_port_mask = 1; break; default: PMD_DRV_LOG(ERR, "invalid dst_port mask."); return -EINVAL; } switch (filter->proto_mask) { case UINT8_MAX: filter_info->proto_mask = 0; filter_info->proto = filter->proto; break; case 0: filter_info->proto_mask = 1; break; default: PMD_DRV_LOG(ERR, "invalid protocol mask."); return -EINVAL; } On Fri, Jul 29, 2022 at 1:59 PM Pavel Vazharov wrote: > Hi there, > > I'm trying to distribute among the Rx queues flows of TCP packets based on > their destination IPv4 address and source TCP port. I'm using the rte_flow > DPDK API for this purpose. I'm using DPDK 20.11.0. The setup is successful > when the application is started on a server with i40e driver but fails when > the application is started on a server using igb driver. > In the failure case the validation function returns EINVAL and the error > message is "only two tuple are supported by this filter". > I checked the source code of this DPDK driver in > drivers/net/e1000/igb_flow.c and I saw the following related code there, > starting at line 449: > > if (filter->src_ip_mask || filter->dst_ip_mask || > > filter->src_port_mask) { > > memset(filter, 0, sizeof(struct rte_eth_ntuple_filter)); > > rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ITEM, > > NULL, "only two tuple are " > > "supported by this filter"); > > return -rte_errno; > > } > > The condition looks odd to me because it seems to ensure that only > filtering by destination port is supported while the error message hints > for something else. Why would filtering only by the destination port be > allowed!? > I've provided dst_ip_mask = 0xFFFFFFFF and src_port_mask 0xFFFF because I > just want to match exact ips and ports and in my understanding this should > classify, in my understanding, as filtering by "two tuple" - destination ip > and source port. > > So, my questions are: > 1. Am I missing something about this condition and thus it's the way it > should be? > 2. If the question is not appropriate for this user group where should I > post it - dev@dpdk.org? > > Thanks, > Pavel. >