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