| 706 | } |
| 707 | |
| 708 | static int |
| 709 | rte_table_acl_lookup( |
| 710 | void *table, |
| 711 | struct rte_mbuf **pkts, |
| 712 | uint64_t pkts_mask, |
| 713 | uint64_t *lookup_hit_mask, |
| 714 | void **entries) |
| 715 | { |
| 716 | struct rte_table_acl *acl = (struct rte_table_acl *) table; |
| 717 | const uint8_t *pkts_data[RTE_PORT_IN_BURST_SIZE_MAX]; |
| 718 | uint32_t results[RTE_PORT_IN_BURST_SIZE_MAX]; |
| 719 | uint64_t pkts_out_mask; |
| 720 | uint32_t n_pkts, i, j; |
| 721 | |
| 722 | __rte_unused uint32_t n_pkts_in = rte_popcount64(pkts_mask); |
| 723 | RTE_TABLE_ACL_STATS_PKTS_IN_ADD(acl, n_pkts_in); |
| 724 | |
| 725 | /* Input conversion */ |
| 726 | for (i = 0, j = 0; i < (uint32_t)(RTE_PORT_IN_BURST_SIZE_MAX - |
| 727 | rte_clz64(pkts_mask)); i++) { |
| 728 | uint64_t pkt_mask = 1LLU << i; |
| 729 | |
| 730 | if (pkt_mask & pkts_mask) { |
| 731 | pkts_data[j] = rte_pktmbuf_mtod(pkts[i], uint8_t *); |
| 732 | j++; |
| 733 | } |
| 734 | } |
| 735 | n_pkts = j; |
| 736 | |
| 737 | /* Low-level ACL table lookup */ |
| 738 | if (acl->ctx != NULL) |
| 739 | rte_acl_classify(acl->ctx, pkts_data, results, n_pkts, 1); |
| 740 | else |
| 741 | n_pkts = 0; |
| 742 | |
| 743 | /* Output conversion */ |
| 744 | pkts_out_mask = 0; |
| 745 | for (i = 0; i < n_pkts; i++) { |
| 746 | uint32_t action_table_pos = results[i]; |
| 747 | uint32_t pkt_pos = rte_ctz64(pkts_mask); |
| 748 | uint64_t pkt_mask = 1LLU << pkt_pos; |
| 749 | |
| 750 | pkts_mask &= ~pkt_mask; |
| 751 | |
| 752 | if (action_table_pos != 0) { |
| 753 | pkts_out_mask |= pkt_mask; |
| 754 | entries[pkt_pos] = (void *) |
| 755 | &acl->memory[action_table_pos * |
| 756 | acl->entry_size]; |
| 757 | rte_prefetch0(entries[pkt_pos]); |
| 758 | } |
| 759 | } |
| 760 | |
| 761 | *lookup_hit_mask = pkts_out_mask; |
| 762 | RTE_TABLE_ACL_STATS_PKTS_LOOKUP_MISS(acl, n_pkts_in - rte_popcount64(pkts_out_mask)); |
| 763 | |
| 764 | return 0; |
| 765 | } |
nothing calls this directly
no test coverage detected