trie
static struct allowedips_node *find_node(struct allowedips_node *trie, u8 bits,
struct allowedips_node *node = trie, *found = NULL;
static bool node_placement(struct allowedips_node __rcu *trie, const u8 *key,
struct allowedips_node *node = rcu_dereference_protected(trie, lockdep_is_held(lock));
static int add(struct allowedips_node __rcu **trie, u8 bits, const u8 *key,
if (!rcu_access_pointer(*trie)) {
connect_node(trie, 2, node);
if (node_placement(*trie, key, cidr, bits, &node, lock)) {
down = rcu_dereference_protected(*trie, lockdep_is_held(lock));
connect_node(trie, 2, newnode);
connect_node(trie, 2, node);
static int remove(struct allowedips_node __rcu **trie, u8 bits, const u8 *key,
if (!rcu_access_pointer(*trie) || !node_placement(*trie, key, cidr, bits, &node, lock) ||
utf8trie_t *trie;
trie = utf8data + tree->index;
offlen = (*trie & OFFLEN) >> OFFLEN_SHIFT;
if (*trie & NEXTBYTE) {
mask = 1 << (*trie & BITNUM);
node = (*trie & RIGHTNODE);
offset = trie[offlen];
offset |= trie[offlen];
trie += offset;
} else if (*trie & RIGHTPATH) {
node = (*trie & TRIENODE);
trie++;
node = (*trie & LEFTNODE);
trie += offlen + 1;
} else if (*trie & RIGHTPATH) {
node = (*trie & TRIENODE);
trie++;
if (LEAF_CCC(trie) == DECOMPOSE && LEAF_STR(trie)[0] == HANGUL)
trie = utf8hangul(s - 2, hangul);
return trie;
utf8trie_t *trie = um->tables->utf8data + um->ntab[n]->offset;
offlen = (*trie & OFFLEN) >> OFFLEN_SHIFT;
if (*trie & NEXTBYTE) {
mask = 1 << (*trie & BITNUM);
node = (*trie & RIGHTNODE);
offset = trie[offlen];
offset |= trie[offlen];
trie += offset;
} else if (*trie & RIGHTPATH) {
node = (*trie & TRIENODE);
trie++;
node = (*trie & LEFTNODE);
trie += offlen + 1;
} else if (*trie & RIGHTPATH) {
node = (*trie & TRIENODE);
trie++;
if (LEAF_CCC(trie) == DECOMPOSE && LEAF_STR(trie)[0] == HANGUL)
trie = utf8hangul(s - 2, hangul);
return trie;
size_t __longest_prefix_match(const struct lpm_trie *trie,
if (trie->data_size >= 8) {
while (trie->data_size >= i + 4) {
if (trie->data_size >= i + 2) {
if (trie->data_size >= i + 1) {
static size_t longest_prefix_match(const struct lpm_trie *trie,
return __longest_prefix_match(trie, node, key);
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
if (key->prefixlen > trie->max_prefixlen)
for (node = rcu_dereference_check(trie->root, rcu_read_lock_bh_held());
matchlen = __longest_prefix_match(trie, node, key);
if (matchlen == trie->max_prefixlen) {
return found->data + trie->data_size;
static struct lpm_trie_node *lpm_trie_node_alloc(struct lpm_trie *trie,
node = bpf_mem_cache_alloc(&trie->ma);
memcpy(node->data + trie->data_size, value,
trie->map.value_size);
static int trie_check_add_elem(struct lpm_trie *trie, u64 flags)
if (trie->n_entries == trie->map.max_entries)
trie->n_entries++;
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
if (key->prefixlen > trie->max_prefixlen)
new_node = lpm_trie_node_alloc(trie, value);
ret = raw_res_spin_lock_irqsave(&trie->lock, irq_flags);
memcpy(new_node->data, key->data, trie->data_size);
slot = &trie->root;
matchlen = longest_prefix_match(trie, node, key);
ret = trie_check_add_elem(trie, flags);
ret = trie_check_add_elem(trie, flags);
ret = trie_check_add_elem(trie, flags);
im_node = lpm_trie_node_alloc(trie, NULL);
trie->n_entries--;
memcpy(im_node->data, node->data, trie->data_size);
raw_res_spin_unlock_irqrestore(&trie->lock, irq_flags);
bpf_mem_cache_free(&trie->ma, new_node);
bpf_mem_cache_free_rcu(&trie->ma, free_node);
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
if (key->prefixlen > trie->max_prefixlen)
ret = raw_res_spin_lock_irqsave(&trie->lock, irq_flags);
trim = &trie->root;
matchlen = longest_prefix_match(trie, node, key);
trie->n_entries--;
raw_res_spin_unlock_irqrestore(&trie->lock, irq_flags);
bpf_mem_cache_free_rcu(&trie->ma, free_parent);
bpf_mem_cache_free_rcu(&trie->ma, free_node);
struct lpm_trie *trie;
trie = bpf_map_area_alloc(sizeof(*trie), NUMA_NO_NODE);
if (!trie)
bpf_map_init_from_attr(&trie->map, attr);
trie->data_size = attr->key_size -
trie->max_prefixlen = trie->data_size * 8;
raw_res_spin_lock_init(&trie->lock);
leaf_size = sizeof(struct lpm_trie_node) + trie->data_size +
trie->map.value_size;
err = bpf_mem_alloc_init(&trie->ma, leaf_size, false);
return &trie->map;
bpf_map_area_free(trie);
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
slot = &trie->root;
bpf_mem_alloc_destroy(&trie->ma);
bpf_map_area_free(trie);
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
search_root = rcu_dereference(trie->root);
if (!key || key->prefixlen > trie->max_prefixlen)
trie->max_prefixlen + 1,
matchlen = longest_prefix_match(trie, node, key);
next_node->data, trie->data_size);
struct lpm_trie *trie = container_of(map, struct lpm_trie, map);
elem_size = sizeof(struct lpm_trie_node) + trie->data_size +
trie->map.value_size;
return elem_size * READ_ONCE(trie->n_entries);
struct trie *t;
t = (struct trie *)tb->tb_data;
static void trie_rebalance(struct trie *t, struct key_vector *tn)
static int fib_insert_node(struct trie *t, struct key_vector *tp,
static int fib_insert_alias(struct trie *t, struct key_vector *tp,
static void fib_remove_alias(struct trie *t, struct key_vector *tp,
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *) tb->tb_data;
static void fib_remove_alias(struct trie *t, struct key_vector *tp,
struct trie *t = (struct trie *) tb->tb_data;
static struct key_vector *resize(struct trie *t, struct key_vector *tn);
struct trie *t = (struct trie *)tb->tb_data;
struct trie *ot = (struct trie *)oldtb->tb_data;
struct trie *lt;
lt = (struct trie *)local_tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t = (struct trie *)tb->tb_data;
struct trie *t;
sz += sizeof(struct trie);
t = (struct trie *) tb->tb_data;
struct trie *t)
static void trie_collect_stats(struct trie *t, struct trie_stat *s)
struct trie *t = (struct trie *) tb->tb_data;
(struct trie *) tb->tb_data);
n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
struct trie *t;
t = (struct trie *)tb->tb_data;
static struct key_vector *replace(struct trie *t,
static struct key_vector *inflate(struct trie *t,
static struct key_vector *halve(struct trie *t,
static struct key_vector *collapse(struct trie *t,
static struct key_vector *resize(struct trie *t, struct key_vector *tn)
static struct key_vector *fib_find_node(struct trie *t,