Lines Matching refs:node

165 				   const struct lpm_trie_node *node,  in longest_prefix_match()  argument
168 u32 limit = min(node->prefixlen, key->prefixlen); in longest_prefix_match()
180 u64 diff = be64_to_cpu(*(__be64 *)node->data ^ in longest_prefix_match()
193 u32 diff = be32_to_cpu(*(__be32 *)&node->data[i] ^ in longest_prefix_match()
205 u16 diff = be16_to_cpu(*(__be16 *)&node->data[i] ^ in longest_prefix_match()
217 prefixlen += 8 - fls(node->data[i] ^ key->data[i]); in longest_prefix_match()
230 struct lpm_trie_node *node, *found = NULL; in trie_lookup_elem() local
235 for (node = rcu_dereference_check(trie->root, rcu_read_lock_bh_held()); in trie_lookup_elem()
236 node;) { in trie_lookup_elem()
244 matchlen = longest_prefix_match(trie, node, key); in trie_lookup_elem()
246 found = node; in trie_lookup_elem()
254 if (matchlen < node->prefixlen) in trie_lookup_elem()
260 if (!(node->flags & LPM_TREE_NODE_FLAG_IM)) in trie_lookup_elem()
261 found = node; in trie_lookup_elem()
267 next_bit = extract_bit(key->data, node->prefixlen); in trie_lookup_elem()
268 node = rcu_dereference_check(node->child[next_bit], in trie_lookup_elem()
281 struct lpm_trie_node *node; in lpm_trie_node_alloc() local
287 node = bpf_map_kmalloc_node(&trie->map, size, GFP_ATOMIC | __GFP_NOWARN, in lpm_trie_node_alloc()
289 if (!node) in lpm_trie_node_alloc()
292 node->flags = 0; in lpm_trie_node_alloc()
295 memcpy(node->data + trie->data_size, value, in lpm_trie_node_alloc()
298 return node; in lpm_trie_node_alloc()
306 struct lpm_trie_node *node, *im_node = NULL, *new_node = NULL; in trie_update_elem() local
349 while ((node = rcu_dereference_protected(*slot, in trie_update_elem()
351 matchlen = longest_prefix_match(trie, node, key); in trie_update_elem()
353 if (node->prefixlen != matchlen || in trie_update_elem()
354 node->prefixlen == key->prefixlen || in trie_update_elem()
355 node->prefixlen == trie->max_prefixlen) in trie_update_elem()
358 next_bit = extract_bit(key->data, node->prefixlen); in trie_update_elem()
359 slot = &node->child[next_bit]; in trie_update_elem()
365 if (!node) { in trie_update_elem()
373 if (node->prefixlen == matchlen) { in trie_update_elem()
374 new_node->child[0] = node->child[0]; in trie_update_elem()
375 new_node->child[1] = node->child[1]; in trie_update_elem()
377 if (!(node->flags & LPM_TREE_NODE_FLAG_IM)) in trie_update_elem()
381 kfree_rcu(node, rcu); in trie_update_elem()
390 next_bit = extract_bit(node->data, matchlen); in trie_update_elem()
391 rcu_assign_pointer(new_node->child[next_bit], node); in trie_update_elem()
404 memcpy(im_node->data, node->data, trie->data_size); in trie_update_elem()
408 rcu_assign_pointer(im_node->child[0], node); in trie_update_elem()
412 rcu_assign_pointer(im_node->child[1], node); in trie_update_elem()
438 struct lpm_trie_node *node, *parent; in trie_delete_elem() local
458 while ((node = rcu_dereference_protected( in trie_delete_elem()
460 matchlen = longest_prefix_match(trie, node, key); in trie_delete_elem()
462 if (node->prefixlen != matchlen || in trie_delete_elem()
463 node->prefixlen == key->prefixlen) in trie_delete_elem()
466 parent = node; in trie_delete_elem()
468 next_bit = extract_bit(key->data, node->prefixlen); in trie_delete_elem()
469 trim = &node->child[next_bit]; in trie_delete_elem()
472 if (!node || node->prefixlen != key->prefixlen || in trie_delete_elem()
473 node->prefixlen != matchlen || in trie_delete_elem()
474 (node->flags & LPM_TREE_NODE_FLAG_IM)) { in trie_delete_elem()
484 if (rcu_access_pointer(node->child[0]) && in trie_delete_elem()
485 rcu_access_pointer(node->child[1])) { in trie_delete_elem()
486 node->flags |= LPM_TREE_NODE_FLAG_IM; in trie_delete_elem()
498 !node->child[0] && !node->child[1]) { in trie_delete_elem()
499 if (node == rcu_access_pointer(parent->child[0])) in trie_delete_elem()
506 kfree_rcu(node, rcu); in trie_delete_elem()
514 if (node->child[0]) in trie_delete_elem()
515 rcu_assign_pointer(*trim, rcu_access_pointer(node->child[0])); in trie_delete_elem()
516 else if (node->child[1]) in trie_delete_elem()
517 rcu_assign_pointer(*trim, rcu_access_pointer(node->child[1])); in trie_delete_elem()
520 kfree_rcu(node, rcu); in trie_delete_elem()
579 struct lpm_trie_node *node; in trie_free() local
590 node = rcu_dereference_protected(*slot, 1); in trie_free()
591 if (!node) in trie_free()
594 if (rcu_access_pointer(node->child[0])) { in trie_free()
595 slot = &node->child[0]; in trie_free()
599 if (rcu_access_pointer(node->child[1])) { in trie_free()
600 slot = &node->child[1]; in trie_free()
604 kfree(node); in trie_free()
616 struct lpm_trie_node *node, *next_node = NULL, *parent, *search_root; in trie_get_next_key() local
651 for (node = search_root; node;) { in trie_get_next_key()
652 node_stack[++stack_ptr] = node; in trie_get_next_key()
653 matchlen = longest_prefix_match(trie, node, key); in trie_get_next_key()
654 if (node->prefixlen != matchlen || in trie_get_next_key()
655 node->prefixlen == key->prefixlen) in trie_get_next_key()
658 next_bit = extract_bit(key->data, node->prefixlen); in trie_get_next_key()
659 node = rcu_dereference(node->child[next_bit]); in trie_get_next_key()
661 if (!node || node->prefixlen != key->prefixlen || in trie_get_next_key()
662 (node->flags & LPM_TREE_NODE_FLAG_IM)) in trie_get_next_key()
668 node = node_stack[stack_ptr]; in trie_get_next_key()
671 if (rcu_dereference(parent->child[0]) == node) { in trie_get_next_key()
681 node = parent; in trie_get_next_key()
693 for (node = search_root; node;) { in trie_get_next_key()
694 if (node->flags & LPM_TREE_NODE_FLAG_IM) { in trie_get_next_key()
695 node = rcu_dereference(node->child[0]); in trie_get_next_key()
697 next_node = node; in trie_get_next_key()
698 node = rcu_dereference(node->child[0]); in trie_get_next_key()
699 if (!node) in trie_get_next_key()
700 node = rcu_dereference(next_node->child[1]); in trie_get_next_key()