There are two user defined ACL rules and they are added with just different priority -
1. And all other fields are wild card: > SOURCE IP and DEST IP = wild card (*) > LIF_GRP_INFO_FIELD_IPV6 = wild card (*) > PORTS = wild card (*) 2. Only next header protocol is specified = ICMPv6 (58) 3. Priority is different. But the one with lower priority is returned during lookup. The structure is - enum { NEXT_HDR_FIELD_IPV4, //8 IPSRC_FIELD_IPV4, //src ip (32) IPDST_FIELD_IPV4, //dst ip (32) PORTS_FIELD_IPV4, // src port (16) + dest port (16) => 32 LIF_GRP_INFO_FIELD_IPV4, //lif group (16) + lif Id (16) => 32 ADDR_CTX_FIELD_IPV4, //addr context (32) NUM_FIELDS_IPV4 }; struct rte_acl_field_def ipv6_defs[NUM_FIELDS_IPV6] = { { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint8_t), .field_index = NEXT_HDR_FIELD_IPV6, .input_index = NEXT_HDR_FIELD_IPV6, .offset = offsetof(struct ipv6_hdr, proto), }, ///source ip { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPSRC_FIELD0_IPV6, .input_index = IPSRC_FIELD0_IPV6, .offset = offsetof(struct ipv6_hdr, src_addr), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPSRC_FIELD1_IPV6, .input_index = IPSRC_FIELD1_IPV6, .offset = offsetof(struct ipv6_hdr, src_addr) + 1*sizeof (uint32_t), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPSRC_FIELD2_IPV6, .input_index = IPSRC_FIELD2_IPV6, .offset = offsetof(struct ipv6_hdr, src_addr) + 2*sizeof (uint32_t), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPSRC_FIELD3_IPV6, .input_index = IPSRC_FIELD3_IPV6, .offset = offsetof(struct ipv6_hdr, src_addr) + 3*sizeof (uint32_t), }, ///destination ip { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPDST_FIELD0_IPV6, .input_index = IPDST_FIELD0_IPV6, .offset = offsetof(struct ipv6_hdr, dst_addr), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPDST_FIELD1_IPV6, .input_index = IPDST_FIELD1_IPV6, .offset = offsetof(struct ipv6_hdr, dst_addr) + 1*sizeof (uint32_t), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPDST_FIELD2_IPV6, .input_index = IPDST_FIELD2_IPV6, .offset = offsetof(struct ipv6_hdr, dst_addr) + 2*sizeof (uint32_t), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = IPDST_FIELD3_IPV6, .input_index = IPDST_FIELD3_IPV6, .offset = offsetof(struct ipv6_hdr, dst_addr) + 3*sizeof (uint32_t), }, ///ports { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = PORTS_FIELD_IPV6, .input_index = PORTS_FIELD_IPV6, .offset = sizeof(struct ipv6_hdr) , }, //LIF grp and addr ctx { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = LIF_GRP_INFO_FIELD_IPV6, .input_index = LIF_GRP_INFO_FIELD_IPV6, .offset = sizeof(struct ipv6_hdr) + sizeof (uint32_t), }, { .type = RTE_ACL_FIELD_TYPE_BITMASK, .size = sizeof (uint32_t), .field_index = ADDR_CTX_FIELD_IPV6, .input_index = ADDR_CTX_FIELD_IPV6, .offset = sizeof(struct ipv6_hdr) + 2*sizeof (uint32_t), } } ; -----Original Message----- From: Ananyev, Konstantin [mailto:konstantin.anan...@intel.com] Sent: Tuesday, October 14, 2014 4:16 PM To: Karmarkar Suyash; dev at dpdk.org Cc: Dey, Souvik; Patil, PraveenKumar Subject: RE: Bug in IPACL library of DPDK-1.6.0 Hi, > -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Karmarkar Suyash > Sent: Tuesday, October 14, 2014 10:55 AM > To: dev at dpdk.org<mailto:dev at dpdk.org> > Cc: Dey, Souvik; Patil, PraveenKumar > Subject: [dpdk-dev] Bug in IPACL library of DPDK-1.6.0 > > Hello All, > > If there are two identical IPv6 rules with source and destination IP > addresses as wild card but with different priority, then during lookup > always the rule that is added first in TRIE is returned even though the > second rule that has highest priority. > Could you provide a bit more details how to reproduce the problem: - either a rule and trace file to reproduce the problem in testacl (classsbench) format -or some simple code snippet. Thanks Konstantin > Regards > Suyash Karmarkar