Lines Matching +full:node +full:- +full:version

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
13 * upwards of a half-hour to complete. There's no set of users who should be
22 static __init void print_node(struct allowedips_node *node, u8 bits) in print_node() argument
24 char *fmt_connection = KERN_DEBUG "\t\"%p/%d\" -> \"%p/%d\";\n"; in print_node()
30 if (node == NULL) in print_node()
33 fmt_connection = KERN_DEBUG "\t\"%pI4/%d\" -> \"%pI4/%d\";\n"; in print_node()
36 fmt_connection = KERN_DEBUG "\t\"%pI6/%d\" -> \"%pI6/%d\";\n"; in print_node()
39 if (node->peer) { in print_node()
42 memcpy(&key, &node->peer, sizeof(node->peer)); in print_node()
48 wg_allowedips_read_node(node, ip1, &cidr1); in print_node()
50 if (node->bit[0]) { in print_node()
51 wg_allowedips_read_node(rcu_dereference_raw(node->bit[0]), ip2, &cidr2); in print_node()
54 if (node->bit[1]) { in print_node()
55 wg_allowedips_read_node(rcu_dereference_raw(node->bit[1]), ip2, &cidr2); in print_node()
58 if (node->bit[0]) in print_node()
59 print_node(rcu_dereference_raw(node->bit[0]), bits); in print_node()
60 if (node->bit[1]) in print_node()
61 print_node(rcu_dereference_raw(node->bit[1]), bits); in print_node()
92 INIT_HLIST_HEAD(&table->head); in horrible_allowedips_init()
97 struct horrible_allowedips_node *node; in horrible_allowedips_free() local
100 hlist_for_each_entry_safe(node, h, &table->head, table) { in horrible_allowedips_free()
101 hlist_del(&node->table); in horrible_allowedips_free()
102 kfree(node); in horrible_allowedips_free()
114 (0xFFFFFFFFUL << (32 - (cidr % 32))) & 0xFFFFFFFFUL); in horrible_cidr_to_mask()
125 horrible_mask_self(struct horrible_allowedips_node *node) in horrible_mask_self() argument
127 if (node->ip_version == 4) { in horrible_mask_self()
128 node->ip.ip &= node->mask.ip; in horrible_mask_self()
129 } else if (node->ip_version == 6) { in horrible_mask_self()
130 node->ip.ip6[0] &= node->mask.ip6[0]; in horrible_mask_self()
131 node->ip.ip6[1] &= node->mask.ip6[1]; in horrible_mask_self()
132 node->ip.ip6[2] &= node->mask.ip6[2]; in horrible_mask_self()
133 node->ip.ip6[3] &= node->mask.ip6[3]; in horrible_mask_self()
138 horrible_match_v4(const struct horrible_allowedips_node *node, struct in_addr *ip) in horrible_match_v4() argument
140 return (ip->s_addr & node->mask.ip) == node->ip.ip; in horrible_match_v4()
144 horrible_match_v6(const struct horrible_allowedips_node *node, struct in6_addr *ip) in horrible_match_v6() argument
146 return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) == node->ip.ip6[0] && in horrible_match_v6()
147 (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) == node->ip.ip6[1] && in horrible_match_v6()
148 (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) == node->ip.ip6[2] && in horrible_match_v6()
149 (ip->in6_u.u6_addr32[3] & node->mask.ip6[3]) == node->ip.ip6[3]; in horrible_match_v6()
153 horrible_insert_ordered(struct horrible_allowedips *table, struct horrible_allowedips_node *node) in horrible_insert_ordered() argument
156 u8 my_cidr = horrible_mask_to_cidr(node->mask); in horrible_insert_ordered()
158 hlist_for_each_entry(other, &table->head, table) { in horrible_insert_ordered()
159 if (other->ip_version == node->ip_version && in horrible_insert_ordered()
160 !memcmp(&other->mask, &node->mask, sizeof(union nf_inet_addr)) && in horrible_insert_ordered()
161 !memcmp(&other->ip, &node->ip, sizeof(union nf_inet_addr))) { in horrible_insert_ordered()
162 other->value = node->value; in horrible_insert_ordered()
163 kfree(node); in horrible_insert_ordered()
167 hlist_for_each_entry(other, &table->head, table) { in horrible_insert_ordered()
169 if (horrible_mask_to_cidr(other->mask) <= my_cidr) in horrible_insert_ordered()
173 hlist_add_head(&node->table, &table->head); in horrible_insert_ordered()
175 hlist_add_behind(&node->table, &where->table); in horrible_insert_ordered()
177 hlist_add_before(&node->table, &where->table); in horrible_insert_ordered()
184 struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL); in horrible_allowedips_insert_v4() local
186 if (unlikely(!node)) in horrible_allowedips_insert_v4()
187 return -ENOMEM; in horrible_allowedips_insert_v4()
188 node->ip.in = *ip; in horrible_allowedips_insert_v4()
189 node->mask = horrible_cidr_to_mask(cidr); in horrible_allowedips_insert_v4()
190 node->ip_version = 4; in horrible_allowedips_insert_v4()
191 node->value = value; in horrible_allowedips_insert_v4()
192 horrible_mask_self(node); in horrible_allowedips_insert_v4()
193 horrible_insert_ordered(table, node); in horrible_allowedips_insert_v4()
201 struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL); in horrible_allowedips_insert_v6() local
203 if (unlikely(!node)) in horrible_allowedips_insert_v6()
204 return -ENOMEM; in horrible_allowedips_insert_v6()
205 node->ip.in6 = *ip; in horrible_allowedips_insert_v6()
206 node->mask = horrible_cidr_to_mask(cidr); in horrible_allowedips_insert_v6()
207 node->ip_version = 6; in horrible_allowedips_insert_v6()
208 node->value = value; in horrible_allowedips_insert_v6()
209 horrible_mask_self(node); in horrible_allowedips_insert_v6()
210 horrible_insert_ordered(table, node); in horrible_allowedips_insert_v6()
217 struct horrible_allowedips_node *node; in horrible_allowedips_lookup_v4() local
219 hlist_for_each_entry(node, &table->head, table) { in horrible_allowedips_lookup_v4()
220 if (node->ip_version == 4 && horrible_match_v4(node, ip)) in horrible_allowedips_lookup_v4()
221 return node->value; in horrible_allowedips_lookup_v4()
229 struct horrible_allowedips_node *node; in horrible_allowedips_lookup_v6() local
231 hlist_for_each_entry(node, &table->head, table) { in horrible_allowedips_lookup_v6()
232 if (node->ip_version == 6 && horrible_match_v6(node, ip)) in horrible_allowedips_lookup_v6()
233 return node->value; in horrible_allowedips_lookup_v6()
242 struct horrible_allowedips_node *node; in horrible_allowedips_remove_by_value() local
245 hlist_for_each_entry_safe(node, h, &table->head, table) { in horrible_allowedips_remove_by_value()
246 if (node->value != value) in horrible_allowedips_remove_by_value()
248 hlist_del(&node->table); in horrible_allowedips_remove_by_value()
249 kfree(node); in horrible_allowedips_remove_by_value()
271 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
277 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
280 kref_init(&peers[i]->refcount); in randomized_test()
281 INIT_LIST_HEAD(&peers[i]->allowedips_list); in randomized_test()
292 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
297 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
307 << ((8 - (mutate_amount % 8)) % 8); in randomized_test()
319 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
324 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
336 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
341 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
351 << ((8 - (mutate_amount % 8)) % 8); in randomized_test()
363 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
369 pr_err("allowedips random self-test malloc: FAIL\n"); in randomized_test()
387 pr_err("allowedips random v4 self-test: FAIL\n"); in randomized_test()
392 pr_err("allowedips random v6 self-test: FAIL\n"); in randomized_test()
405 pr_err("allowedips random self-test removal: FAIL\n"); in randomized_test()
455 kref_init(&peer->refcount); in init_peer()
456 INIT_LIST_HEAD(&peer->allowedips_list); in init_peer()
460 #define insert(version, mem, ipa, ipb, ipc, ipd, cidr) \ argument
461 wg_allowedips_insert_v##version(&t, ip##version(ipa, ipb, ipc, ipd), \
467 pr_info("allowedips self-test %zu: FAIL\n", i); \
472 #define test(version, mem, ipa, ipb, ipc, ipd) do { \ argument
473 bool _s = lookup(t.root##version, (version) == 4 ? 32 : 128, \
474 ip##version(ipa, ipb, ipc, ipd)) == (mem); \
478 #define test_negative(version, mem, ipa, ipb, ipc, ipd) do { \ argument
479 bool _s = lookup(t.root##version, (version) == 4 ? 32 : 128, \
480 ip##version(ipa, ipb, ipc, ipd)) != (mem); \
509 pr_err("allowedips self-test malloc: FAIL\n"); in wg_allowedips_selftest()
618 list_for_each_entry(iter_node, &a->allowedips_list, peer_list) { in wg_allowedips_selftest()
657 pr_info("allowedips self-tests: pass\n"); in wg_allowedips_selftest()