Thanks Dekel for your information. I will have a try. Bests, Daniel
> On Apr 4, 2019, at 7:18 PM, Dekel Peled <dek...@mellanox.com> wrote: > > Hi Daniel, > > The flow_director API will be deprecated in the near future. > It was replaced by rte_flow API, which contains much more features, and is > fully supported by Mellanox. > > It is recommended that you use rte_flow API in your application. > > Regards, > Dekel > >> -----Original Message----- >> From: benli ye <danielbenl...@gmail.com> >> Sent: Wednesday, April 3, 2019 11:30 AM >> To: Dekel Peled <dek...@mellanox.com> >> Cc: dev@dpdk.org >> Subject: Re: mlx5 FDIR rule comparison issue >> >> +Dekel >> >> Add Dekel to see if this is an issue. >> >> Thanks, >> Daniel >> >>> On Apr 2, 2019, at 3:23 PM, benli ye <danielbenl...@gmail.com> wrote: >>> >>> Hi Developers, >>> >>> I am adding two FDIR rule (one is for UDP and the other is for TCP) for mlx5 >> pmd driver. The rules are listed below. >>> struct rte_eth_fdir_filter filt[MAX_FDIR_PROTO] = { >>> { >>> .input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_TCP, >>> .input.flow.tcp4_flow.ip.dst_ip = dip, >>> .input.flow.tcp4_flow.dst_port = dport, >>> >>> .action.behavior = RTE_ETH_FDIR_ACCEPT, >>> .action.report_status = RTE_ETH_FDIR_REPORT_ID, >>> .soft_id = 0, >>> }, >>> { >>> .input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP, >>> .input.flow.udp4_flow.ip.dst_ip = dip, >>> .input.flow.udp4_flow.dst_port = dport, >>> >>> .action.behavior = RTE_ETH_FDIR_ACCEPT, >>> .action.report_status = RTE_ETH_FDIR_REPORT_ID, >>> .soft_id = 1, >>> }, >>> }; >>> >>> However, mlx5 lib prevent me to doing this as when it treats the two rules >> are the same. >>> >>> I debugged for a while and found flow_fdir_cmp() didn’t compare the >> protocol type in field items of struct mlx5_fdir. So should this be a bug for >> mlx5? >>> >>> flow_fdir_cmp(const struct mlx5_fdir *f1, const struct mlx5_fdir *f2) >>> { >>> if (FLOW_FDIR_CMP(f1, f2, attr) || >>> FLOW_FDIR_CMP(f1, f2, l2) || >>> FLOW_FDIR_CMP(f1, f2, l2_mask) || >>> FLOW_FDIR_CMP(f1, f2, l3) || >>> FLOW_FDIR_CMP(f1, f2, l3_mask) || >>> FLOW_FDIR_CMP(f1, f2, l4) || >>> FLOW_FDIR_CMP(f1, f2, l4_mask) || >>> FLOW_FDIR_CMP(f1, f2, actions[0].type)) >>> return 1; >>> if (f1->actions[0].type == RTE_FLOW_ACTION_TYPE_QUEUE && >>> FLOW_FDIR_CMP(f1, f2, queue)) >>> return 1; >>> return 0; >>> } >>> >>> Thanks, >>> Daniel >