| 942 | } |
| 943 | |
| 944 | static struct rte_acl_node * |
| 945 | build_trie(struct acl_build_context *context, struct rte_acl_build_rule *head, |
| 946 | struct rte_acl_build_rule **last, uint32_t *count) |
| 947 | { |
| 948 | uint32_t n, m; |
| 949 | int field_index, node_count; |
| 950 | struct rte_acl_node *trie; |
| 951 | struct rte_acl_build_rule *prev, *rule; |
| 952 | struct rte_acl_node *end, *merge, *root, *end_prev; |
| 953 | const struct rte_acl_field *fld; |
| 954 | |
| 955 | prev = head; |
| 956 | rule = head; |
| 957 | *last = prev; |
| 958 | |
| 959 | trie = acl_alloc_node(context, 0); |
| 960 | |
| 961 | while (rule != NULL) { |
| 962 | |
| 963 | root = acl_alloc_node(context, 0); |
| 964 | |
| 965 | root->ref_count = 1; |
| 966 | end = root; |
| 967 | |
| 968 | for (n = 0; n < rule->config->num_fields; n++) { |
| 969 | |
| 970 | field_index = rule->config->defs[n].field_index; |
| 971 | fld = rule->f->field + field_index; |
| 972 | end_prev = end; |
| 973 | |
| 974 | /* build a mini-trie for this field */ |
| 975 | switch (rule->config->defs[n].type) { |
| 976 | |
| 977 | case RTE_ACL_FIELD_TYPE_BITMASK: |
| 978 | merge = acl_gen_mask_trie(context, |
| 979 | &fld->value, |
| 980 | &fld->mask_range, |
| 981 | rule->config->defs[n].size, |
| 982 | end->level + 1, |
| 983 | &end); |
| 984 | break; |
| 985 | |
| 986 | case RTE_ACL_FIELD_TYPE_MASK: |
| 987 | { |
| 988 | /* |
| 989 | * set msb for the size of the field and |
| 990 | * all higher bits. |
| 991 | */ |
| 992 | uint64_t mask; |
| 993 | mask = RTE_ACL_MASKLEN_TO_BITMASK( |
| 994 | fld->mask_range.u64, |
| 995 | rule->config->defs[n].size); |
| 996 | |
| 997 | /* gen a mini-trie for this field */ |
| 998 | merge = acl_gen_mask_trie(context, |
| 999 | &fld->value, |
| 1000 | (char *)&mask, |
| 1001 | rule->config->defs[n].size, |
no test coverage detected