1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License 4 * as published by the Free Software Foundation; either version 5 * 2 of the License, or (at your option) any later version. 6 * 7 * Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet 8 * & Swedish University of Agricultural Sciences. 9 * 10 * Jens Laas <jens.laas@data.slu.se> Swedish University of 11 * Agricultural Sciences. 12 * 13 * Hans Liss <hans.liss@its.uu.se> Uppsala Universitet 14 * 15 * This work is based on the LPC-trie which is originally described in: 16 * 17 * An experimental study of compression methods for dynamic tries 18 * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002. 19 * http://www.csc.kth.se/~snilsson/software/dyntrie2/ 20 * 21 * 22 * IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson 23 * IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999 24 * 25 * 26 * Code from fib_hash has been reused which includes the following header: 27 * 28 * 29 * INET An implementation of the TCP/IP protocol suite for the LINUX 30 * operating system. INET is implemented using the BSD Socket 31 * interface as the means of communication with the user level. 32 * 33 * IPv4 FIB: lookup engine and maintenance routines. 34 * 35 * 36 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 37 * 38 * This program is free software; you can redistribute it and/or 39 * modify it under the terms of the GNU General Public License 40 * as published by the Free Software Foundation; either version 41 * 2 of the License, or (at your option) any later version. 42 * 43 * Substantial contributions to this work comes from: 44 * 45 * David S. Miller, <davem@davemloft.net> 46 * Stephen Hemminger <shemminger@osdl.org> 47 * Paul E. McKenney <paulmck@us.ibm.com> 48 * Patrick McHardy <kaber@trash.net> 49 */ 50 51 #define VERSION "0.409" 52 53 #include <linux/cache.h> 54 #include <linux/uaccess.h> 55 #include <linux/bitops.h> 56 #include <linux/types.h> 57 #include <linux/kernel.h> 58 #include <linux/mm.h> 59 #include <linux/string.h> 60 #include <linux/socket.h> 61 #include <linux/sockios.h> 62 #include <linux/errno.h> 63 #include <linux/in.h> 64 #include <linux/inet.h> 65 #include <linux/inetdevice.h> 66 #include <linux/netdevice.h> 67 #include <linux/if_arp.h> 68 #include <linux/proc_fs.h> 69 #include <linux/rcupdate.h> 70 #include <linux/skbuff.h> 71 #include <linux/netlink.h> 72 #include <linux/init.h> 73 #include <linux/list.h> 74 #include <linux/slab.h> 75 #include <linux/export.h> 76 #include <linux/vmalloc.h> 77 #include <linux/notifier.h> 78 #include <net/net_namespace.h> 79 #include <net/ip.h> 80 #include <net/protocol.h> 81 #include <net/route.h> 82 #include <net/tcp.h> 83 #include <net/sock.h> 84 #include <net/ip_fib.h> 85 #include <net/fib_notifier.h> 86 #include <trace/events/fib.h> 87 #include "fib_lookup.h" 88 89 static int call_fib_entry_notifier(struct notifier_block *nb, struct net *net, 90 enum fib_event_type event_type, u32 dst, 91 int dst_len, struct fib_alias *fa) 92 { 93 struct fib_entry_notifier_info info = { 94 .dst = dst, 95 .dst_len = dst_len, 96 .fi = fa->fa_info, 97 .tos = fa->fa_tos, 98 .type = fa->fa_type, 99 .tb_id = fa->tb_id, 100 }; 101 return call_fib4_notifier(nb, net, event_type, &info.info); 102 } 103 104 static int call_fib_entry_notifiers(struct net *net, 105 enum fib_event_type event_type, u32 dst, 106 int dst_len, struct fib_alias *fa, 107 struct netlink_ext_ack *extack) 108 { 109 struct fib_entry_notifier_info info = { 110 .info.extack = extack, 111 .dst = dst, 112 .dst_len = dst_len, 113 .fi = fa->fa_info, 114 .tos = fa->fa_tos, 115 .type = fa->fa_type, 116 .tb_id = fa->tb_id, 117 }; 118 return call_fib4_notifiers(net, event_type, &info.info); 119 } 120 121 #define MAX_STAT_DEPTH 32 122 123 #define KEYLENGTH (8*sizeof(t_key)) 124 #define KEY_MAX ((t_key)~0) 125 126 typedef unsigned int t_key; 127 128 #define IS_TRIE(n) ((n)->pos >= KEYLENGTH) 129 #define IS_TNODE(n) ((n)->bits) 130 #define IS_LEAF(n) (!(n)->bits) 131 132 struct key_vector { 133 t_key key; 134 unsigned char pos; /* 2log(KEYLENGTH) bits needed */ 135 unsigned char bits; /* 2log(KEYLENGTH) bits needed */ 136 unsigned char slen; 137 union { 138 /* This list pointer if valid if (pos | bits) == 0 (LEAF) */ 139 struct hlist_head leaf; 140 /* This array is valid if (pos | bits) > 0 (TNODE) */ 141 struct key_vector __rcu *tnode[0]; 142 }; 143 }; 144 145 struct tnode { 146 struct rcu_head rcu; 147 t_key empty_children; /* KEYLENGTH bits needed */ 148 t_key full_children; /* KEYLENGTH bits needed */ 149 struct key_vector __rcu *parent; 150 struct key_vector kv[1]; 151 #define tn_bits kv[0].bits 152 }; 153 154 #define TNODE_SIZE(n) offsetof(struct tnode, kv[0].tnode[n]) 155 #define LEAF_SIZE TNODE_SIZE(1) 156 157 #ifdef CONFIG_IP_FIB_TRIE_STATS 158 struct trie_use_stats { 159 unsigned int gets; 160 unsigned int backtrack; 161 unsigned int semantic_match_passed; 162 unsigned int semantic_match_miss; 163 unsigned int null_node_hit; 164 unsigned int resize_node_skipped; 165 }; 166 #endif 167 168 struct trie_stat { 169 unsigned int totdepth; 170 unsigned int maxdepth; 171 unsigned int tnodes; 172 unsigned int leaves; 173 unsigned int nullpointers; 174 unsigned int prefixes; 175 unsigned int nodesizes[MAX_STAT_DEPTH]; 176 }; 177 178 struct trie { 179 struct key_vector kv[1]; 180 #ifdef CONFIG_IP_FIB_TRIE_STATS 181 struct trie_use_stats __percpu *stats; 182 #endif 183 }; 184 185 static struct key_vector *resize(struct trie *t, struct key_vector *tn); 186 static unsigned int tnode_free_size; 187 188 /* 189 * synchronize_rcu after call_rcu for outstanding dirty memory; it should be 190 * especially useful before resizing the root node with PREEMPT_NONE configs; 191 * the value was obtained experimentally, aiming to avoid visible slowdown. 192 */ 193 unsigned int sysctl_fib_sync_mem = 512 * 1024; 194 unsigned int sysctl_fib_sync_mem_min = 64 * 1024; 195 unsigned int sysctl_fib_sync_mem_max = 64 * 1024 * 1024; 196 197 static struct kmem_cache *fn_alias_kmem __ro_after_init; 198 static struct kmem_cache *trie_leaf_kmem __ro_after_init; 199 200 static inline struct tnode *tn_info(struct key_vector *kv) 201 { 202 return container_of(kv, struct tnode, kv[0]); 203 } 204 205 /* caller must hold RTNL */ 206 #define node_parent(tn) rtnl_dereference(tn_info(tn)->parent) 207 #define get_child(tn, i) rtnl_dereference((tn)->tnode[i]) 208 209 /* caller must hold RCU read lock or RTNL */ 210 #define node_parent_rcu(tn) rcu_dereference_rtnl(tn_info(tn)->parent) 211 #define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i]) 212 213 /* wrapper for rcu_assign_pointer */ 214 static inline void node_set_parent(struct key_vector *n, struct key_vector *tp) 215 { 216 if (n) 217 rcu_assign_pointer(tn_info(n)->parent, tp); 218 } 219 220 #define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER(tn_info(n)->parent, p) 221 222 /* This provides us with the number of children in this node, in the case of a 223 * leaf this will return 0 meaning none of the children are accessible. 224 */ 225 static inline unsigned long child_length(const struct key_vector *tn) 226 { 227 return (1ul << tn->bits) & ~(1ul); 228 } 229 230 #define get_cindex(key, kv) (((key) ^ (kv)->key) >> (kv)->pos) 231 232 static inline unsigned long get_index(t_key key, struct key_vector *kv) 233 { 234 unsigned long index = key ^ kv->key; 235 236 if ((BITS_PER_LONG <= KEYLENGTH) && (KEYLENGTH == kv->pos)) 237 return 0; 238 239 return index >> kv->pos; 240 } 241 242 /* To understand this stuff, an understanding of keys and all their bits is 243 * necessary. Every node in the trie has a key associated with it, but not 244 * all of the bits in that key are significant. 245 * 246 * Consider a node 'n' and its parent 'tp'. 247 * 248 * If n is a leaf, every bit in its key is significant. Its presence is 249 * necessitated by path compression, since during a tree traversal (when 250 * searching for a leaf - unless we are doing an insertion) we will completely 251 * ignore all skipped bits we encounter. Thus we need to verify, at the end of 252 * a potentially successful search, that we have indeed been walking the 253 * correct key path. 254 * 255 * Note that we can never "miss" the correct key in the tree if present by 256 * following the wrong path. Path compression ensures that segments of the key 257 * that are the same for all keys with a given prefix are skipped, but the 258 * skipped part *is* identical for each node in the subtrie below the skipped 259 * bit! trie_insert() in this implementation takes care of that. 260 * 261 * if n is an internal node - a 'tnode' here, the various parts of its key 262 * have many different meanings. 263 * 264 * Example: 265 * _________________________________________________________________ 266 * | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C | 267 * ----------------------------------------------------------------- 268 * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 269 * 270 * _________________________________________________________________ 271 * | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u | 272 * ----------------------------------------------------------------- 273 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 274 * 275 * tp->pos = 22 276 * tp->bits = 3 277 * n->pos = 13 278 * n->bits = 4 279 * 280 * First, let's just ignore the bits that come before the parent tp, that is 281 * the bits from (tp->pos + tp->bits) to 31. They are *known* but at this 282 * point we do not use them for anything. 283 * 284 * The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the 285 * index into the parent's child array. That is, they will be used to find 286 * 'n' among tp's children. 287 * 288 * The bits from (n->pos + n->bits) to (tp->pos - 1) - "S" - are skipped bits 289 * for the node n. 290 * 291 * All the bits we have seen so far are significant to the node n. The rest 292 * of the bits are really not needed or indeed known in n->key. 293 * 294 * The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into 295 * n's child array, and will of course be different for each child. 296 * 297 * The rest of the bits, from 0 to (n->pos -1) - "u" - are completely unknown 298 * at this point. 299 */ 300 301 static const int halve_threshold = 25; 302 static const int inflate_threshold = 50; 303 static const int halve_threshold_root = 15; 304 static const int inflate_threshold_root = 30; 305 306 static void __alias_free_mem(struct rcu_head *head) 307 { 308 struct fib_alias *fa = container_of(head, struct fib_alias, rcu); 309 kmem_cache_free(fn_alias_kmem, fa); 310 } 311 312 static inline void alias_free_mem_rcu(struct fib_alias *fa) 313 { 314 call_rcu(&fa->rcu, __alias_free_mem); 315 } 316 317 #define TNODE_KMALLOC_MAX \ 318 ilog2((PAGE_SIZE - TNODE_SIZE(0)) / sizeof(struct key_vector *)) 319 #define TNODE_VMALLOC_MAX \ 320 ilog2((SIZE_MAX - TNODE_SIZE(0)) / sizeof(struct key_vector *)) 321 322 static void __node_free_rcu(struct rcu_head *head) 323 { 324 struct tnode *n = container_of(head, struct tnode, rcu); 325 326 if (!n->tn_bits) 327 kmem_cache_free(trie_leaf_kmem, n); 328 else 329 kvfree(n); 330 } 331 332 #define node_free(n) call_rcu(&tn_info(n)->rcu, __node_free_rcu) 333 334 static struct tnode *tnode_alloc(int bits) 335 { 336 size_t size; 337 338 /* verify bits is within bounds */ 339 if (bits > TNODE_VMALLOC_MAX) 340 return NULL; 341 342 /* determine size and verify it is non-zero and didn't overflow */ 343 size = TNODE_SIZE(1ul << bits); 344 345 if (size <= PAGE_SIZE) 346 return kzalloc(size, GFP_KERNEL); 347 else 348 return vzalloc(size); 349 } 350 351 static inline void empty_child_inc(struct key_vector *n) 352 { 353 ++tn_info(n)->empty_children ? : ++tn_info(n)->full_children; 354 } 355 356 static inline void empty_child_dec(struct key_vector *n) 357 { 358 tn_info(n)->empty_children-- ? : tn_info(n)->full_children--; 359 } 360 361 static struct key_vector *leaf_new(t_key key, struct fib_alias *fa) 362 { 363 struct key_vector *l; 364 struct tnode *kv; 365 366 kv = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL); 367 if (!kv) 368 return NULL; 369 370 /* initialize key vector */ 371 l = kv->kv; 372 l->key = key; 373 l->pos = 0; 374 l->bits = 0; 375 l->slen = fa->fa_slen; 376 377 /* link leaf to fib alias */ 378 INIT_HLIST_HEAD(&l->leaf); 379 hlist_add_head(&fa->fa_list, &l->leaf); 380 381 return l; 382 } 383 384 static struct key_vector *tnode_new(t_key key, int pos, int bits) 385 { 386 unsigned int shift = pos + bits; 387 struct key_vector *tn; 388 struct tnode *tnode; 389 390 /* verify bits and pos their msb bits clear and values are valid */ 391 BUG_ON(!bits || (shift > KEYLENGTH)); 392 393 tnode = tnode_alloc(bits); 394 if (!tnode) 395 return NULL; 396 397 pr_debug("AT %p s=%zu %zu\n", tnode, TNODE_SIZE(0), 398 sizeof(struct key_vector *) << bits); 399 400 if (bits == KEYLENGTH) 401 tnode->full_children = 1; 402 else 403 tnode->empty_children = 1ul << bits; 404 405 tn = tnode->kv; 406 tn->key = (shift < KEYLENGTH) ? (key >> shift) << shift : 0; 407 tn->pos = pos; 408 tn->bits = bits; 409 tn->slen = pos; 410 411 return tn; 412 } 413 414 /* Check whether a tnode 'n' is "full", i.e. it is an internal node 415 * and no bits are skipped. See discussion in dyntree paper p. 6 416 */ 417 static inline int tnode_full(struct key_vector *tn, struct key_vector *n) 418 { 419 return n && ((n->pos + n->bits) == tn->pos) && IS_TNODE(n); 420 } 421 422 /* Add a child at position i overwriting the old value. 423 * Update the value of full_children and empty_children. 424 */ 425 static void put_child(struct key_vector *tn, unsigned long i, 426 struct key_vector *n) 427 { 428 struct key_vector *chi = get_child(tn, i); 429 int isfull, wasfull; 430 431 BUG_ON(i >= child_length(tn)); 432 433 /* update emptyChildren, overflow into fullChildren */ 434 if (!n && chi) 435 empty_child_inc(tn); 436 if (n && !chi) 437 empty_child_dec(tn); 438 439 /* update fullChildren */ 440 wasfull = tnode_full(tn, chi); 441 isfull = tnode_full(tn, n); 442 443 if (wasfull && !isfull) 444 tn_info(tn)->full_children--; 445 else if (!wasfull && isfull) 446 tn_info(tn)->full_children++; 447 448 if (n && (tn->slen < n->slen)) 449 tn->slen = n->slen; 450 451 rcu_assign_pointer(tn->tnode[i], n); 452 } 453 454 static void update_children(struct key_vector *tn) 455 { 456 unsigned long i; 457 458 /* update all of the child parent pointers */ 459 for (i = child_length(tn); i;) { 460 struct key_vector *inode = get_child(tn, --i); 461 462 if (!inode) 463 continue; 464 465 /* Either update the children of a tnode that 466 * already belongs to us or update the child 467 * to point to ourselves. 468 */ 469 if (node_parent(inode) == tn) 470 update_children(inode); 471 else 472 node_set_parent(inode, tn); 473 } 474 } 475 476 static inline void put_child_root(struct key_vector *tp, t_key key, 477 struct key_vector *n) 478 { 479 if (IS_TRIE(tp)) 480 rcu_assign_pointer(tp->tnode[0], n); 481 else 482 put_child(tp, get_index(key, tp), n); 483 } 484 485 static inline void tnode_free_init(struct key_vector *tn) 486 { 487 tn_info(tn)->rcu.next = NULL; 488 } 489 490 static inline void tnode_free_append(struct key_vector *tn, 491 struct key_vector *n) 492 { 493 tn_info(n)->rcu.next = tn_info(tn)->rcu.next; 494 tn_info(tn)->rcu.next = &tn_info(n)->rcu; 495 } 496 497 static void tnode_free(struct key_vector *tn) 498 { 499 struct callback_head *head = &tn_info(tn)->rcu; 500 501 while (head) { 502 head = head->next; 503 tnode_free_size += TNODE_SIZE(1ul << tn->bits); 504 node_free(tn); 505 506 tn = container_of(head, struct tnode, rcu)->kv; 507 } 508 509 if (tnode_free_size >= sysctl_fib_sync_mem) { 510 tnode_free_size = 0; 511 synchronize_rcu(); 512 } 513 } 514 515 static struct key_vector *replace(struct trie *t, 516 struct key_vector *oldtnode, 517 struct key_vector *tn) 518 { 519 struct key_vector *tp = node_parent(oldtnode); 520 unsigned long i; 521 522 /* setup the parent pointer out of and back into this node */ 523 NODE_INIT_PARENT(tn, tp); 524 put_child_root(tp, tn->key, tn); 525 526 /* update all of the child parent pointers */ 527 update_children(tn); 528 529 /* all pointers should be clean so we are done */ 530 tnode_free(oldtnode); 531 532 /* resize children now that oldtnode is freed */ 533 for (i = child_length(tn); i;) { 534 struct key_vector *inode = get_child(tn, --i); 535 536 /* resize child node */ 537 if (tnode_full(tn, inode)) 538 tn = resize(t, inode); 539 } 540 541 return tp; 542 } 543 544 static struct key_vector *inflate(struct trie *t, 545 struct key_vector *oldtnode) 546 { 547 struct key_vector *tn; 548 unsigned long i; 549 t_key m; 550 551 pr_debug("In inflate\n"); 552 553 tn = tnode_new(oldtnode->key, oldtnode->pos - 1, oldtnode->bits + 1); 554 if (!tn) 555 goto notnode; 556 557 /* prepare oldtnode to be freed */ 558 tnode_free_init(oldtnode); 559 560 /* Assemble all of the pointers in our cluster, in this case that 561 * represents all of the pointers out of our allocated nodes that 562 * point to existing tnodes and the links between our allocated 563 * nodes. 564 */ 565 for (i = child_length(oldtnode), m = 1u << tn->pos; i;) { 566 struct key_vector *inode = get_child(oldtnode, --i); 567 struct key_vector *node0, *node1; 568 unsigned long j, k; 569 570 /* An empty child */ 571 if (!inode) 572 continue; 573 574 /* A leaf or an internal node with skipped bits */ 575 if (!tnode_full(oldtnode, inode)) { 576 put_child(tn, get_index(inode->key, tn), inode); 577 continue; 578 } 579 580 /* drop the node in the old tnode free list */ 581 tnode_free_append(oldtnode, inode); 582 583 /* An internal node with two children */ 584 if (inode->bits == 1) { 585 put_child(tn, 2 * i + 1, get_child(inode, 1)); 586 put_child(tn, 2 * i, get_child(inode, 0)); 587 continue; 588 } 589 590 /* We will replace this node 'inode' with two new 591 * ones, 'node0' and 'node1', each with half of the 592 * original children. The two new nodes will have 593 * a position one bit further down the key and this 594 * means that the "significant" part of their keys 595 * (see the discussion near the top of this file) 596 * will differ by one bit, which will be "0" in 597 * node0's key and "1" in node1's key. Since we are 598 * moving the key position by one step, the bit that 599 * we are moving away from - the bit at position 600 * (tn->pos) - is the one that will differ between 601 * node0 and node1. So... we synthesize that bit in the 602 * two new keys. 603 */ 604 node1 = tnode_new(inode->key | m, inode->pos, inode->bits - 1); 605 if (!node1) 606 goto nomem; 607 node0 = tnode_new(inode->key, inode->pos, inode->bits - 1); 608 609 tnode_free_append(tn, node1); 610 if (!node0) 611 goto nomem; 612 tnode_free_append(tn, node0); 613 614 /* populate child pointers in new nodes */ 615 for (k = child_length(inode), j = k / 2; j;) { 616 put_child(node1, --j, get_child(inode, --k)); 617 put_child(node0, j, get_child(inode, j)); 618 put_child(node1, --j, get_child(inode, --k)); 619 put_child(node0, j, get_child(inode, j)); 620 } 621 622 /* link new nodes to parent */ 623 NODE_INIT_PARENT(node1, tn); 624 NODE_INIT_PARENT(node0, tn); 625 626 /* link parent to nodes */ 627 put_child(tn, 2 * i + 1, node1); 628 put_child(tn, 2 * i, node0); 629 } 630 631 /* setup the parent pointers into and out of this node */ 632 return replace(t, oldtnode, tn); 633 nomem: 634 /* all pointers should be clean so we are done */ 635 tnode_free(tn); 636 notnode: 637 return NULL; 638 } 639 640 static struct key_vector *halve(struct trie *t, 641 struct key_vector *oldtnode) 642 { 643 struct key_vector *tn; 644 unsigned long i; 645 646 pr_debug("In halve\n"); 647 648 tn = tnode_new(oldtnode->key, oldtnode->pos + 1, oldtnode->bits - 1); 649 if (!tn) 650 goto notnode; 651 652 /* prepare oldtnode to be freed */ 653 tnode_free_init(oldtnode); 654 655 /* Assemble all of the pointers in our cluster, in this case that 656 * represents all of the pointers out of our allocated nodes that 657 * point to existing tnodes and the links between our allocated 658 * nodes. 659 */ 660 for (i = child_length(oldtnode); i;) { 661 struct key_vector *node1 = get_child(oldtnode, --i); 662 struct key_vector *node0 = get_child(oldtnode, --i); 663 struct key_vector *inode; 664 665 /* At least one of the children is empty */ 666 if (!node1 || !node0) { 667 put_child(tn, i / 2, node1 ? : node0); 668 continue; 669 } 670 671 /* Two nonempty children */ 672 inode = tnode_new(node0->key, oldtnode->pos, 1); 673 if (!inode) 674 goto nomem; 675 tnode_free_append(tn, inode); 676 677 /* initialize pointers out of node */ 678 put_child(inode, 1, node1); 679 put_child(inode, 0, node0); 680 NODE_INIT_PARENT(inode, tn); 681 682 /* link parent to node */ 683 put_child(tn, i / 2, inode); 684 } 685 686 /* setup the parent pointers into and out of this node */ 687 return replace(t, oldtnode, tn); 688 nomem: 689 /* all pointers should be clean so we are done */ 690 tnode_free(tn); 691 notnode: 692 return NULL; 693 } 694 695 static struct key_vector *collapse(struct trie *t, 696 struct key_vector *oldtnode) 697 { 698 struct key_vector *n, *tp; 699 unsigned long i; 700 701 /* scan the tnode looking for that one child that might still exist */ 702 for (n = NULL, i = child_length(oldtnode); !n && i;) 703 n = get_child(oldtnode, --i); 704 705 /* compress one level */ 706 tp = node_parent(oldtnode); 707 put_child_root(tp, oldtnode->key, n); 708 node_set_parent(n, tp); 709 710 /* drop dead node */ 711 node_free(oldtnode); 712 713 return tp; 714 } 715 716 static unsigned char update_suffix(struct key_vector *tn) 717 { 718 unsigned char slen = tn->pos; 719 unsigned long stride, i; 720 unsigned char slen_max; 721 722 /* only vector 0 can have a suffix length greater than or equal to 723 * tn->pos + tn->bits, the second highest node will have a suffix 724 * length at most of tn->pos + tn->bits - 1 725 */ 726 slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen); 727 728 /* search though the list of children looking for nodes that might 729 * have a suffix greater than the one we currently have. This is 730 * why we start with a stride of 2 since a stride of 1 would 731 * represent the nodes with suffix length equal to tn->pos 732 */ 733 for (i = 0, stride = 0x2ul ; i < child_length(tn); i += stride) { 734 struct key_vector *n = get_child(tn, i); 735 736 if (!n || (n->slen <= slen)) 737 continue; 738 739 /* update stride and slen based on new value */ 740 stride <<= (n->slen - slen); 741 slen = n->slen; 742 i &= ~(stride - 1); 743 744 /* stop searching if we have hit the maximum possible value */ 745 if (slen >= slen_max) 746 break; 747 } 748 749 tn->slen = slen; 750 751 return slen; 752 } 753 754 /* From "Implementing a dynamic compressed trie" by Stefan Nilsson of 755 * the Helsinki University of Technology and Matti Tikkanen of Nokia 756 * Telecommunications, page 6: 757 * "A node is doubled if the ratio of non-empty children to all 758 * children in the *doubled* node is at least 'high'." 759 * 760 * 'high' in this instance is the variable 'inflate_threshold'. It 761 * is expressed as a percentage, so we multiply it with 762 * child_length() and instead of multiplying by 2 (since the 763 * child array will be doubled by inflate()) and multiplying 764 * the left-hand side by 100 (to handle the percentage thing) we 765 * multiply the left-hand side by 50. 766 * 767 * The left-hand side may look a bit weird: child_length(tn) 768 * - tn->empty_children is of course the number of non-null children 769 * in the current node. tn->full_children is the number of "full" 770 * children, that is non-null tnodes with a skip value of 0. 771 * All of those will be doubled in the resulting inflated tnode, so 772 * we just count them one extra time here. 773 * 774 * A clearer way to write this would be: 775 * 776 * to_be_doubled = tn->full_children; 777 * not_to_be_doubled = child_length(tn) - tn->empty_children - 778 * tn->full_children; 779 * 780 * new_child_length = child_length(tn) * 2; 781 * 782 * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) / 783 * new_child_length; 784 * if (new_fill_factor >= inflate_threshold) 785 * 786 * ...and so on, tho it would mess up the while () loop. 787 * 788 * anyway, 789 * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >= 790 * inflate_threshold 791 * 792 * avoid a division: 793 * 100 * (not_to_be_doubled + 2*to_be_doubled) >= 794 * inflate_threshold * new_child_length 795 * 796 * expand not_to_be_doubled and to_be_doubled, and shorten: 797 * 100 * (child_length(tn) - tn->empty_children + 798 * tn->full_children) >= inflate_threshold * new_child_length 799 * 800 * expand new_child_length: 801 * 100 * (child_length(tn) - tn->empty_children + 802 * tn->full_children) >= 803 * inflate_threshold * child_length(tn) * 2 804 * 805 * shorten again: 806 * 50 * (tn->full_children + child_length(tn) - 807 * tn->empty_children) >= inflate_threshold * 808 * child_length(tn) 809 * 810 */ 811 static inline bool should_inflate(struct key_vector *tp, struct key_vector *tn) 812 { 813 unsigned long used = child_length(tn); 814 unsigned long threshold = used; 815 816 /* Keep root node larger */ 817 threshold *= IS_TRIE(tp) ? inflate_threshold_root : inflate_threshold; 818 used -= tn_info(tn)->empty_children; 819 used += tn_info(tn)->full_children; 820 821 /* if bits == KEYLENGTH then pos = 0, and will fail below */ 822 823 return (used > 1) && tn->pos && ((50 * used) >= threshold); 824 } 825 826 static inline bool should_halve(struct key_vector *tp, struct key_vector *tn) 827 { 828 unsigned long used = child_length(tn); 829 unsigned long threshold = used; 830 831 /* Keep root node larger */ 832 threshold *= IS_TRIE(tp) ? halve_threshold_root : halve_threshold; 833 used -= tn_info(tn)->empty_children; 834 835 /* if bits == KEYLENGTH then used = 100% on wrap, and will fail below */ 836 837 return (used > 1) && (tn->bits > 1) && ((100 * used) < threshold); 838 } 839 840 static inline bool should_collapse(struct key_vector *tn) 841 { 842 unsigned long used = child_length(tn); 843 844 used -= tn_info(tn)->empty_children; 845 846 /* account for bits == KEYLENGTH case */ 847 if ((tn->bits == KEYLENGTH) && tn_info(tn)->full_children) 848 used -= KEY_MAX; 849 850 /* One child or none, time to drop us from the trie */ 851 return used < 2; 852 } 853 854 #define MAX_WORK 10 855 static struct key_vector *resize(struct trie *t, struct key_vector *tn) 856 { 857 #ifdef CONFIG_IP_FIB_TRIE_STATS 858 struct trie_use_stats __percpu *stats = t->stats; 859 #endif 860 struct key_vector *tp = node_parent(tn); 861 unsigned long cindex = get_index(tn->key, tp); 862 int max_work = MAX_WORK; 863 864 pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n", 865 tn, inflate_threshold, halve_threshold); 866 867 /* track the tnode via the pointer from the parent instead of 868 * doing it ourselves. This way we can let RCU fully do its 869 * thing without us interfering 870 */ 871 BUG_ON(tn != get_child(tp, cindex)); 872 873 /* Double as long as the resulting node has a number of 874 * nonempty nodes that are above the threshold. 875 */ 876 while (should_inflate(tp, tn) && max_work) { 877 tp = inflate(t, tn); 878 if (!tp) { 879 #ifdef CONFIG_IP_FIB_TRIE_STATS 880 this_cpu_inc(stats->resize_node_skipped); 881 #endif 882 break; 883 } 884 885 max_work--; 886 tn = get_child(tp, cindex); 887 } 888 889 /* update parent in case inflate failed */ 890 tp = node_parent(tn); 891 892 /* Return if at least one inflate is run */ 893 if (max_work != MAX_WORK) 894 return tp; 895 896 /* Halve as long as the number of empty children in this 897 * node is above threshold. 898 */ 899 while (should_halve(tp, tn) && max_work) { 900 tp = halve(t, tn); 901 if (!tp) { 902 #ifdef CONFIG_IP_FIB_TRIE_STATS 903 this_cpu_inc(stats->resize_node_skipped); 904 #endif 905 break; 906 } 907 908 max_work--; 909 tn = get_child(tp, cindex); 910 } 911 912 /* Only one child remains */ 913 if (should_collapse(tn)) 914 return collapse(t, tn); 915 916 /* update parent in case halve failed */ 917 return node_parent(tn); 918 } 919 920 static void node_pull_suffix(struct key_vector *tn, unsigned char slen) 921 { 922 unsigned char node_slen = tn->slen; 923 924 while ((node_slen > tn->pos) && (node_slen > slen)) { 925 slen = update_suffix(tn); 926 if (node_slen == slen) 927 break; 928 929 tn = node_parent(tn); 930 node_slen = tn->slen; 931 } 932 } 933 934 static void node_push_suffix(struct key_vector *tn, unsigned char slen) 935 { 936 while (tn->slen < slen) { 937 tn->slen = slen; 938 tn = node_parent(tn); 939 } 940 } 941 942 /* rcu_read_lock needs to be hold by caller from readside */ 943 static struct key_vector *fib_find_node(struct trie *t, 944 struct key_vector **tp, u32 key) 945 { 946 struct key_vector *pn, *n = t->kv; 947 unsigned long index = 0; 948 949 do { 950 pn = n; 951 n = get_child_rcu(n, index); 952 953 if (!n) 954 break; 955 956 index = get_cindex(key, n); 957 958 /* This bit of code is a bit tricky but it combines multiple 959 * checks into a single check. The prefix consists of the 960 * prefix plus zeros for the bits in the cindex. The index 961 * is the difference between the key and this value. From 962 * this we can actually derive several pieces of data. 963 * if (index >= (1ul << bits)) 964 * we have a mismatch in skip bits and failed 965 * else 966 * we know the value is cindex 967 * 968 * This check is safe even if bits == KEYLENGTH due to the 969 * fact that we can only allocate a node with 32 bits if a 970 * long is greater than 32 bits. 971 */ 972 if (index >= (1ul << n->bits)) { 973 n = NULL; 974 break; 975 } 976 977 /* keep searching until we find a perfect match leaf or NULL */ 978 } while (IS_TNODE(n)); 979 980 *tp = pn; 981 982 return n; 983 } 984 985 /* Return the first fib alias matching TOS with 986 * priority less than or equal to PRIO. 987 */ 988 static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen, 989 u8 tos, u32 prio, u32 tb_id) 990 { 991 struct fib_alias *fa; 992 993 if (!fah) 994 return NULL; 995 996 hlist_for_each_entry(fa, fah, fa_list) { 997 if (fa->fa_slen < slen) 998 continue; 999 if (fa->fa_slen != slen) 1000 break; 1001 if (fa->tb_id > tb_id) 1002 continue; 1003 if (fa->tb_id != tb_id) 1004 break; 1005 if (fa->fa_tos > tos) 1006 continue; 1007 if (fa->fa_info->fib_priority >= prio || fa->fa_tos < tos) 1008 return fa; 1009 } 1010 1011 return NULL; 1012 } 1013 1014 static void trie_rebalance(struct trie *t, struct key_vector *tn) 1015 { 1016 while (!IS_TRIE(tn)) 1017 tn = resize(t, tn); 1018 } 1019 1020 static int fib_insert_node(struct trie *t, struct key_vector *tp, 1021 struct fib_alias *new, t_key key) 1022 { 1023 struct key_vector *n, *l; 1024 1025 l = leaf_new(key, new); 1026 if (!l) 1027 goto noleaf; 1028 1029 /* retrieve child from parent node */ 1030 n = get_child(tp, get_index(key, tp)); 1031 1032 /* Case 2: n is a LEAF or a TNODE and the key doesn't match. 1033 * 1034 * Add a new tnode here 1035 * first tnode need some special handling 1036 * leaves us in position for handling as case 3 1037 */ 1038 if (n) { 1039 struct key_vector *tn; 1040 1041 tn = tnode_new(key, __fls(key ^ n->key), 1); 1042 if (!tn) 1043 goto notnode; 1044 1045 /* initialize routes out of node */ 1046 NODE_INIT_PARENT(tn, tp); 1047 put_child(tn, get_index(key, tn) ^ 1, n); 1048 1049 /* start adding routes into the node */ 1050 put_child_root(tp, key, tn); 1051 node_set_parent(n, tn); 1052 1053 /* parent now has a NULL spot where the leaf can go */ 1054 tp = tn; 1055 } 1056 1057 /* Case 3: n is NULL, and will just insert a new leaf */ 1058 node_push_suffix(tp, new->fa_slen); 1059 NODE_INIT_PARENT(l, tp); 1060 put_child_root(tp, key, l); 1061 trie_rebalance(t, tp); 1062 1063 return 0; 1064 notnode: 1065 node_free(l); 1066 noleaf: 1067 return -ENOMEM; 1068 } 1069 1070 /* fib notifier for ADD is sent before calling fib_insert_alias with 1071 * the expectation that the only possible failure ENOMEM 1072 */ 1073 static int fib_insert_alias(struct trie *t, struct key_vector *tp, 1074 struct key_vector *l, struct fib_alias *new, 1075 struct fib_alias *fa, t_key key) 1076 { 1077 if (!l) 1078 return fib_insert_node(t, tp, new, key); 1079 1080 if (fa) { 1081 hlist_add_before_rcu(&new->fa_list, &fa->fa_list); 1082 } else { 1083 struct fib_alias *last; 1084 1085 hlist_for_each_entry(last, &l->leaf, fa_list) { 1086 if (new->fa_slen < last->fa_slen) 1087 break; 1088 if ((new->fa_slen == last->fa_slen) && 1089 (new->tb_id > last->tb_id)) 1090 break; 1091 fa = last; 1092 } 1093 1094 if (fa) 1095 hlist_add_behind_rcu(&new->fa_list, &fa->fa_list); 1096 else 1097 hlist_add_head_rcu(&new->fa_list, &l->leaf); 1098 } 1099 1100 /* if we added to the tail node then we need to update slen */ 1101 if (l->slen < new->fa_slen) { 1102 l->slen = new->fa_slen; 1103 node_push_suffix(tp, new->fa_slen); 1104 } 1105 1106 return 0; 1107 } 1108 1109 static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack) 1110 { 1111 if (plen > KEYLENGTH) { 1112 NL_SET_ERR_MSG(extack, "Invalid prefix length"); 1113 return false; 1114 } 1115 1116 if ((plen < KEYLENGTH) && (key << plen)) { 1117 NL_SET_ERR_MSG(extack, 1118 "Invalid prefix for given prefix length"); 1119 return false; 1120 } 1121 1122 return true; 1123 } 1124 1125 /* Caller must hold RTNL. */ 1126 int fib_table_insert(struct net *net, struct fib_table *tb, 1127 struct fib_config *cfg, struct netlink_ext_ack *extack) 1128 { 1129 enum fib_event_type event = FIB_EVENT_ENTRY_ADD; 1130 struct trie *t = (struct trie *)tb->tb_data; 1131 struct fib_alias *fa, *new_fa; 1132 struct key_vector *l, *tp; 1133 u16 nlflags = NLM_F_EXCL; 1134 struct fib_info *fi; 1135 u8 plen = cfg->fc_dst_len; 1136 u8 slen = KEYLENGTH - plen; 1137 u8 tos = cfg->fc_tos; 1138 u32 key; 1139 int err; 1140 1141 key = ntohl(cfg->fc_dst); 1142 1143 if (!fib_valid_key_len(key, plen, extack)) 1144 return -EINVAL; 1145 1146 pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen); 1147 1148 fi = fib_create_info(cfg, extack); 1149 if (IS_ERR(fi)) { 1150 err = PTR_ERR(fi); 1151 goto err; 1152 } 1153 1154 l = fib_find_node(t, &tp, key); 1155 fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority, 1156 tb->tb_id) : NULL; 1157 1158 /* Now fa, if non-NULL, points to the first fib alias 1159 * with the same keys [prefix,tos,priority], if such key already 1160 * exists or to the node before which we will insert new one. 1161 * 1162 * If fa is NULL, we will need to allocate a new one and 1163 * insert to the tail of the section matching the suffix length 1164 * of the new alias. 1165 */ 1166 1167 if (fa && fa->fa_tos == tos && 1168 fa->fa_info->fib_priority == fi->fib_priority) { 1169 struct fib_alias *fa_first, *fa_match; 1170 1171 err = -EEXIST; 1172 if (cfg->fc_nlflags & NLM_F_EXCL) 1173 goto out; 1174 1175 nlflags &= ~NLM_F_EXCL; 1176 1177 /* We have 2 goals: 1178 * 1. Find exact match for type, scope, fib_info to avoid 1179 * duplicate routes 1180 * 2. Find next 'fa' (or head), NLM_F_APPEND inserts before it 1181 */ 1182 fa_match = NULL; 1183 fa_first = fa; 1184 hlist_for_each_entry_from(fa, fa_list) { 1185 if ((fa->fa_slen != slen) || 1186 (fa->tb_id != tb->tb_id) || 1187 (fa->fa_tos != tos)) 1188 break; 1189 if (fa->fa_info->fib_priority != fi->fib_priority) 1190 break; 1191 if (fa->fa_type == cfg->fc_type && 1192 fa->fa_info == fi) { 1193 fa_match = fa; 1194 break; 1195 } 1196 } 1197 1198 if (cfg->fc_nlflags & NLM_F_REPLACE) { 1199 struct fib_info *fi_drop; 1200 u8 state; 1201 1202 nlflags |= NLM_F_REPLACE; 1203 fa = fa_first; 1204 if (fa_match) { 1205 if (fa == fa_match) 1206 err = 0; 1207 goto out; 1208 } 1209 err = -ENOBUFS; 1210 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL); 1211 if (!new_fa) 1212 goto out; 1213 1214 fi_drop = fa->fa_info; 1215 new_fa->fa_tos = fa->fa_tos; 1216 new_fa->fa_info = fi; 1217 new_fa->fa_type = cfg->fc_type; 1218 state = fa->fa_state; 1219 new_fa->fa_state = state & ~FA_S_ACCESSED; 1220 new_fa->fa_slen = fa->fa_slen; 1221 new_fa->tb_id = tb->tb_id; 1222 new_fa->fa_default = -1; 1223 1224 err = call_fib_entry_notifiers(net, 1225 FIB_EVENT_ENTRY_REPLACE, 1226 key, plen, new_fa, 1227 extack); 1228 if (err) 1229 goto out_free_new_fa; 1230 1231 rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, 1232 tb->tb_id, &cfg->fc_nlinfo, nlflags); 1233 1234 hlist_replace_rcu(&fa->fa_list, &new_fa->fa_list); 1235 1236 alias_free_mem_rcu(fa); 1237 1238 fib_release_info(fi_drop); 1239 if (state & FA_S_ACCESSED) 1240 rt_cache_flush(cfg->fc_nlinfo.nl_net); 1241 1242 goto succeeded; 1243 } 1244 /* Error if we find a perfect match which 1245 * uses the same scope, type, and nexthop 1246 * information. 1247 */ 1248 if (fa_match) 1249 goto out; 1250 1251 if (cfg->fc_nlflags & NLM_F_APPEND) { 1252 event = FIB_EVENT_ENTRY_APPEND; 1253 nlflags |= NLM_F_APPEND; 1254 } else { 1255 fa = fa_first; 1256 } 1257 } 1258 err = -ENOENT; 1259 if (!(cfg->fc_nlflags & NLM_F_CREATE)) 1260 goto out; 1261 1262 nlflags |= NLM_F_CREATE; 1263 err = -ENOBUFS; 1264 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL); 1265 if (!new_fa) 1266 goto out; 1267 1268 new_fa->fa_info = fi; 1269 new_fa->fa_tos = tos; 1270 new_fa->fa_type = cfg->fc_type; 1271 new_fa->fa_state = 0; 1272 new_fa->fa_slen = slen; 1273 new_fa->tb_id = tb->tb_id; 1274 new_fa->fa_default = -1; 1275 1276 err = call_fib_entry_notifiers(net, event, key, plen, new_fa, extack); 1277 if (err) 1278 goto out_free_new_fa; 1279 1280 /* Insert new entry to the list. */ 1281 err = fib_insert_alias(t, tp, l, new_fa, fa, key); 1282 if (err) 1283 goto out_fib_notif; 1284 1285 if (!plen) 1286 tb->tb_num_default++; 1287 1288 rt_cache_flush(cfg->fc_nlinfo.nl_net); 1289 rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, new_fa->tb_id, 1290 &cfg->fc_nlinfo, nlflags); 1291 succeeded: 1292 return 0; 1293 1294 out_fib_notif: 1295 /* notifier was sent that entry would be added to trie, but 1296 * the add failed and need to recover. Only failure for 1297 * fib_insert_alias is ENOMEM. 1298 */ 1299 NL_SET_ERR_MSG(extack, "Failed to insert route into trie"); 1300 call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, key, 1301 plen, new_fa, NULL); 1302 out_free_new_fa: 1303 kmem_cache_free(fn_alias_kmem, new_fa); 1304 out: 1305 fib_release_info(fi); 1306 err: 1307 return err; 1308 } 1309 1310 static inline t_key prefix_mismatch(t_key key, struct key_vector *n) 1311 { 1312 t_key prefix = n->key; 1313 1314 return (key ^ prefix) & (prefix | -prefix); 1315 } 1316 1317 /* should be called with rcu_read_lock */ 1318 int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, 1319 struct fib_result *res, int fib_flags) 1320 { 1321 struct trie *t = (struct trie *) tb->tb_data; 1322 #ifdef CONFIG_IP_FIB_TRIE_STATS 1323 struct trie_use_stats __percpu *stats = t->stats; 1324 #endif 1325 const t_key key = ntohl(flp->daddr); 1326 struct key_vector *n, *pn; 1327 struct fib_alias *fa; 1328 unsigned long index; 1329 t_key cindex; 1330 1331 pn = t->kv; 1332 cindex = 0; 1333 1334 n = get_child_rcu(pn, cindex); 1335 if (!n) { 1336 trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN); 1337 return -EAGAIN; 1338 } 1339 1340 #ifdef CONFIG_IP_FIB_TRIE_STATS 1341 this_cpu_inc(stats->gets); 1342 #endif 1343 1344 /* Step 1: Travel to the longest prefix match in the trie */ 1345 for (;;) { 1346 index = get_cindex(key, n); 1347 1348 /* This bit of code is a bit tricky but it combines multiple 1349 * checks into a single check. The prefix consists of the 1350 * prefix plus zeros for the "bits" in the prefix. The index 1351 * is the difference between the key and this value. From 1352 * this we can actually derive several pieces of data. 1353 * if (index >= (1ul << bits)) 1354 * we have a mismatch in skip bits and failed 1355 * else 1356 * we know the value is cindex 1357 * 1358 * This check is safe even if bits == KEYLENGTH due to the 1359 * fact that we can only allocate a node with 32 bits if a 1360 * long is greater than 32 bits. 1361 */ 1362 if (index >= (1ul << n->bits)) 1363 break; 1364 1365 /* we have found a leaf. Prefixes have already been compared */ 1366 if (IS_LEAF(n)) 1367 goto found; 1368 1369 /* only record pn and cindex if we are going to be chopping 1370 * bits later. Otherwise we are just wasting cycles. 1371 */ 1372 if (n->slen > n->pos) { 1373 pn = n; 1374 cindex = index; 1375 } 1376 1377 n = get_child_rcu(n, index); 1378 if (unlikely(!n)) 1379 goto backtrace; 1380 } 1381 1382 /* Step 2: Sort out leaves and begin backtracing for longest prefix */ 1383 for (;;) { 1384 /* record the pointer where our next node pointer is stored */ 1385 struct key_vector __rcu **cptr = n->tnode; 1386 1387 /* This test verifies that none of the bits that differ 1388 * between the key and the prefix exist in the region of 1389 * the lsb and higher in the prefix. 1390 */ 1391 if (unlikely(prefix_mismatch(key, n)) || (n->slen == n->pos)) 1392 goto backtrace; 1393 1394 /* exit out and process leaf */ 1395 if (unlikely(IS_LEAF(n))) 1396 break; 1397 1398 /* Don't bother recording parent info. Since we are in 1399 * prefix match mode we will have to come back to wherever 1400 * we started this traversal anyway 1401 */ 1402 1403 while ((n = rcu_dereference(*cptr)) == NULL) { 1404 backtrace: 1405 #ifdef CONFIG_IP_FIB_TRIE_STATS 1406 if (!n) 1407 this_cpu_inc(stats->null_node_hit); 1408 #endif 1409 /* If we are at cindex 0 there are no more bits for 1410 * us to strip at this level so we must ascend back 1411 * up one level to see if there are any more bits to 1412 * be stripped there. 1413 */ 1414 while (!cindex) { 1415 t_key pkey = pn->key; 1416 1417 /* If we don't have a parent then there is 1418 * nothing for us to do as we do not have any 1419 * further nodes to parse. 1420 */ 1421 if (IS_TRIE(pn)) { 1422 trace_fib_table_lookup(tb->tb_id, flp, 1423 NULL, -EAGAIN); 1424 return -EAGAIN; 1425 } 1426 #ifdef CONFIG_IP_FIB_TRIE_STATS 1427 this_cpu_inc(stats->backtrack); 1428 #endif 1429 /* Get Child's index */ 1430 pn = node_parent_rcu(pn); 1431 cindex = get_index(pkey, pn); 1432 } 1433 1434 /* strip the least significant bit from the cindex */ 1435 cindex &= cindex - 1; 1436 1437 /* grab pointer for next child node */ 1438 cptr = &pn->tnode[cindex]; 1439 } 1440 } 1441 1442 found: 1443 /* this line carries forward the xor from earlier in the function */ 1444 index = key ^ n->key; 1445 1446 /* Step 3: Process the leaf, if that fails fall back to backtracing */ 1447 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) { 1448 struct fib_info *fi = fa->fa_info; 1449 int nhsel, err; 1450 1451 if ((BITS_PER_LONG > KEYLENGTH) || (fa->fa_slen < KEYLENGTH)) { 1452 if (index >= (1ul << fa->fa_slen)) 1453 continue; 1454 } 1455 if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos) 1456 continue; 1457 if (fi->fib_dead) 1458 continue; 1459 if (fa->fa_info->fib_scope < flp->flowi4_scope) 1460 continue; 1461 fib_alias_accessed(fa); 1462 err = fib_props[fa->fa_type].error; 1463 if (unlikely(err < 0)) { 1464 #ifdef CONFIG_IP_FIB_TRIE_STATS 1465 this_cpu_inc(stats->semantic_match_passed); 1466 #endif 1467 trace_fib_table_lookup(tb->tb_id, flp, NULL, err); 1468 return err; 1469 } 1470 if (fi->fib_flags & RTNH_F_DEAD) 1471 continue; 1472 for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) { 1473 struct fib_nh_common *nhc = fib_info_nhc(fi, nhsel); 1474 1475 if (nhc->nhc_flags & RTNH_F_DEAD) 1476 continue; 1477 if (ip_ignore_linkdown(nhc->nhc_dev) && 1478 nhc->nhc_flags & RTNH_F_LINKDOWN && 1479 !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE)) 1480 continue; 1481 if (!(flp->flowi4_flags & FLOWI_FLAG_SKIP_NH_OIF)) { 1482 if (flp->flowi4_oif && 1483 flp->flowi4_oif != nhc->nhc_oif) 1484 continue; 1485 } 1486 1487 if (!(fib_flags & FIB_LOOKUP_NOREF)) 1488 refcount_inc(&fi->fib_clntref); 1489 1490 res->prefix = htonl(n->key); 1491 res->prefixlen = KEYLENGTH - fa->fa_slen; 1492 res->nh_sel = nhsel; 1493 res->nhc = nhc; 1494 res->type = fa->fa_type; 1495 res->scope = fi->fib_scope; 1496 res->fi = fi; 1497 res->table = tb; 1498 res->fa_head = &n->leaf; 1499 #ifdef CONFIG_IP_FIB_TRIE_STATS 1500 this_cpu_inc(stats->semantic_match_passed); 1501 #endif 1502 trace_fib_table_lookup(tb->tb_id, flp, nhc, err); 1503 1504 return err; 1505 } 1506 } 1507 #ifdef CONFIG_IP_FIB_TRIE_STATS 1508 this_cpu_inc(stats->semantic_match_miss); 1509 #endif 1510 goto backtrace; 1511 } 1512 EXPORT_SYMBOL_GPL(fib_table_lookup); 1513 1514 static void fib_remove_alias(struct trie *t, struct key_vector *tp, 1515 struct key_vector *l, struct fib_alias *old) 1516 { 1517 /* record the location of the previous list_info entry */ 1518 struct hlist_node **pprev = old->fa_list.pprev; 1519 struct fib_alias *fa = hlist_entry(pprev, typeof(*fa), fa_list.next); 1520 1521 /* remove the fib_alias from the list */ 1522 hlist_del_rcu(&old->fa_list); 1523 1524 /* if we emptied the list this leaf will be freed and we can sort 1525 * out parent suffix lengths as a part of trie_rebalance 1526 */ 1527 if (hlist_empty(&l->leaf)) { 1528 if (tp->slen == l->slen) 1529 node_pull_suffix(tp, tp->pos); 1530 put_child_root(tp, l->key, NULL); 1531 node_free(l); 1532 trie_rebalance(t, tp); 1533 return; 1534 } 1535 1536 /* only access fa if it is pointing at the last valid hlist_node */ 1537 if (*pprev) 1538 return; 1539 1540 /* update the trie with the latest suffix length */ 1541 l->slen = fa->fa_slen; 1542 node_pull_suffix(tp, fa->fa_slen); 1543 } 1544 1545 /* Caller must hold RTNL. */ 1546 int fib_table_delete(struct net *net, struct fib_table *tb, 1547 struct fib_config *cfg, struct netlink_ext_ack *extack) 1548 { 1549 struct trie *t = (struct trie *) tb->tb_data; 1550 struct fib_alias *fa, *fa_to_delete; 1551 struct key_vector *l, *tp; 1552 u8 plen = cfg->fc_dst_len; 1553 u8 slen = KEYLENGTH - plen; 1554 u8 tos = cfg->fc_tos; 1555 u32 key; 1556 1557 key = ntohl(cfg->fc_dst); 1558 1559 if (!fib_valid_key_len(key, plen, extack)) 1560 return -EINVAL; 1561 1562 l = fib_find_node(t, &tp, key); 1563 if (!l) 1564 return -ESRCH; 1565 1566 fa = fib_find_alias(&l->leaf, slen, tos, 0, tb->tb_id); 1567 if (!fa) 1568 return -ESRCH; 1569 1570 pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t); 1571 1572 fa_to_delete = NULL; 1573 hlist_for_each_entry_from(fa, fa_list) { 1574 struct fib_info *fi = fa->fa_info; 1575 1576 if ((fa->fa_slen != slen) || 1577 (fa->tb_id != tb->tb_id) || 1578 (fa->fa_tos != tos)) 1579 break; 1580 1581 if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) && 1582 (cfg->fc_scope == RT_SCOPE_NOWHERE || 1583 fa->fa_info->fib_scope == cfg->fc_scope) && 1584 (!cfg->fc_prefsrc || 1585 fi->fib_prefsrc == cfg->fc_prefsrc) && 1586 (!cfg->fc_protocol || 1587 fi->fib_protocol == cfg->fc_protocol) && 1588 fib_nh_match(cfg, fi, extack) == 0 && 1589 fib_metrics_match(cfg, fi)) { 1590 fa_to_delete = fa; 1591 break; 1592 } 1593 } 1594 1595 if (!fa_to_delete) 1596 return -ESRCH; 1597 1598 call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, key, plen, 1599 fa_to_delete, extack); 1600 rtmsg_fib(RTM_DELROUTE, htonl(key), fa_to_delete, plen, tb->tb_id, 1601 &cfg->fc_nlinfo, 0); 1602 1603 if (!plen) 1604 tb->tb_num_default--; 1605 1606 fib_remove_alias(t, tp, l, fa_to_delete); 1607 1608 if (fa_to_delete->fa_state & FA_S_ACCESSED) 1609 rt_cache_flush(cfg->fc_nlinfo.nl_net); 1610 1611 fib_release_info(fa_to_delete->fa_info); 1612 alias_free_mem_rcu(fa_to_delete); 1613 return 0; 1614 } 1615 1616 /* Scan for the next leaf starting at the provided key value */ 1617 static struct key_vector *leaf_walk_rcu(struct key_vector **tn, t_key key) 1618 { 1619 struct key_vector *pn, *n = *tn; 1620 unsigned long cindex; 1621 1622 /* this loop is meant to try and find the key in the trie */ 1623 do { 1624 /* record parent and next child index */ 1625 pn = n; 1626 cindex = (key > pn->key) ? get_index(key, pn) : 0; 1627 1628 if (cindex >> pn->bits) 1629 break; 1630 1631 /* descend into the next child */ 1632 n = get_child_rcu(pn, cindex++); 1633 if (!n) 1634 break; 1635 1636 /* guarantee forward progress on the keys */ 1637 if (IS_LEAF(n) && (n->key >= key)) 1638 goto found; 1639 } while (IS_TNODE(n)); 1640 1641 /* this loop will search for the next leaf with a greater key */ 1642 while (!IS_TRIE(pn)) { 1643 /* if we exhausted the parent node we will need to climb */ 1644 if (cindex >= (1ul << pn->bits)) { 1645 t_key pkey = pn->key; 1646 1647 pn = node_parent_rcu(pn); 1648 cindex = get_index(pkey, pn) + 1; 1649 continue; 1650 } 1651 1652 /* grab the next available node */ 1653 n = get_child_rcu(pn, cindex++); 1654 if (!n) 1655 continue; 1656 1657 /* no need to compare keys since we bumped the index */ 1658 if (IS_LEAF(n)) 1659 goto found; 1660 1661 /* Rescan start scanning in new node */ 1662 pn = n; 1663 cindex = 0; 1664 } 1665 1666 *tn = pn; 1667 return NULL; /* Root of trie */ 1668 found: 1669 /* if we are at the limit for keys just return NULL for the tnode */ 1670 *tn = pn; 1671 return n; 1672 } 1673 1674 static void fib_trie_free(struct fib_table *tb) 1675 { 1676 struct trie *t = (struct trie *)tb->tb_data; 1677 struct key_vector *pn = t->kv; 1678 unsigned long cindex = 1; 1679 struct hlist_node *tmp; 1680 struct fib_alias *fa; 1681 1682 /* walk trie in reverse order and free everything */ 1683 for (;;) { 1684 struct key_vector *n; 1685 1686 if (!(cindex--)) { 1687 t_key pkey = pn->key; 1688 1689 if (IS_TRIE(pn)) 1690 break; 1691 1692 n = pn; 1693 pn = node_parent(pn); 1694 1695 /* drop emptied tnode */ 1696 put_child_root(pn, n->key, NULL); 1697 node_free(n); 1698 1699 cindex = get_index(pkey, pn); 1700 1701 continue; 1702 } 1703 1704 /* grab the next available node */ 1705 n = get_child(pn, cindex); 1706 if (!n) 1707 continue; 1708 1709 if (IS_TNODE(n)) { 1710 /* record pn and cindex for leaf walking */ 1711 pn = n; 1712 cindex = 1ul << n->bits; 1713 1714 continue; 1715 } 1716 1717 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) { 1718 hlist_del_rcu(&fa->fa_list); 1719 alias_free_mem_rcu(fa); 1720 } 1721 1722 put_child_root(pn, n->key, NULL); 1723 node_free(n); 1724 } 1725 1726 #ifdef CONFIG_IP_FIB_TRIE_STATS 1727 free_percpu(t->stats); 1728 #endif 1729 kfree(tb); 1730 } 1731 1732 struct fib_table *fib_trie_unmerge(struct fib_table *oldtb) 1733 { 1734 struct trie *ot = (struct trie *)oldtb->tb_data; 1735 struct key_vector *l, *tp = ot->kv; 1736 struct fib_table *local_tb; 1737 struct fib_alias *fa; 1738 struct trie *lt; 1739 t_key key = 0; 1740 1741 if (oldtb->tb_data == oldtb->__data) 1742 return oldtb; 1743 1744 local_tb = fib_trie_table(RT_TABLE_LOCAL, NULL); 1745 if (!local_tb) 1746 return NULL; 1747 1748 lt = (struct trie *)local_tb->tb_data; 1749 1750 while ((l = leaf_walk_rcu(&tp, key)) != NULL) { 1751 struct key_vector *local_l = NULL, *local_tp; 1752 1753 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) { 1754 struct fib_alias *new_fa; 1755 1756 if (local_tb->tb_id != fa->tb_id) 1757 continue; 1758 1759 /* clone fa for new local table */ 1760 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL); 1761 if (!new_fa) 1762 goto out; 1763 1764 memcpy(new_fa, fa, sizeof(*fa)); 1765 1766 /* insert clone into table */ 1767 if (!local_l) 1768 local_l = fib_find_node(lt, &local_tp, l->key); 1769 1770 if (fib_insert_alias(lt, local_tp, local_l, new_fa, 1771 NULL, l->key)) { 1772 kmem_cache_free(fn_alias_kmem, new_fa); 1773 goto out; 1774 } 1775 } 1776 1777 /* stop loop if key wrapped back to 0 */ 1778 key = l->key + 1; 1779 if (key < l->key) 1780 break; 1781 } 1782 1783 return local_tb; 1784 out: 1785 fib_trie_free(local_tb); 1786 1787 return NULL; 1788 } 1789 1790 /* Caller must hold RTNL */ 1791 void fib_table_flush_external(struct fib_table *tb) 1792 { 1793 struct trie *t = (struct trie *)tb->tb_data; 1794 struct key_vector *pn = t->kv; 1795 unsigned long cindex = 1; 1796 struct hlist_node *tmp; 1797 struct fib_alias *fa; 1798 1799 /* walk trie in reverse order */ 1800 for (;;) { 1801 unsigned char slen = 0; 1802 struct key_vector *n; 1803 1804 if (!(cindex--)) { 1805 t_key pkey = pn->key; 1806 1807 /* cannot resize the trie vector */ 1808 if (IS_TRIE(pn)) 1809 break; 1810 1811 /* update the suffix to address pulled leaves */ 1812 if (pn->slen > pn->pos) 1813 update_suffix(pn); 1814 1815 /* resize completed node */ 1816 pn = resize(t, pn); 1817 cindex = get_index(pkey, pn); 1818 1819 continue; 1820 } 1821 1822 /* grab the next available node */ 1823 n = get_child(pn, cindex); 1824 if (!n) 1825 continue; 1826 1827 if (IS_TNODE(n)) { 1828 /* record pn and cindex for leaf walking */ 1829 pn = n; 1830 cindex = 1ul << n->bits; 1831 1832 continue; 1833 } 1834 1835 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) { 1836 /* if alias was cloned to local then we just 1837 * need to remove the local copy from main 1838 */ 1839 if (tb->tb_id != fa->tb_id) { 1840 hlist_del_rcu(&fa->fa_list); 1841 alias_free_mem_rcu(fa); 1842 continue; 1843 } 1844 1845 /* record local slen */ 1846 slen = fa->fa_slen; 1847 } 1848 1849 /* update leaf slen */ 1850 n->slen = slen; 1851 1852 if (hlist_empty(&n->leaf)) { 1853 put_child_root(pn, n->key, NULL); 1854 node_free(n); 1855 } 1856 } 1857 } 1858 1859 /* Caller must hold RTNL. */ 1860 int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all) 1861 { 1862 struct trie *t = (struct trie *)tb->tb_data; 1863 struct key_vector *pn = t->kv; 1864 unsigned long cindex = 1; 1865 struct hlist_node *tmp; 1866 struct fib_alias *fa; 1867 int found = 0; 1868 1869 /* walk trie in reverse order */ 1870 for (;;) { 1871 unsigned char slen = 0; 1872 struct key_vector *n; 1873 1874 if (!(cindex--)) { 1875 t_key pkey = pn->key; 1876 1877 /* cannot resize the trie vector */ 1878 if (IS_TRIE(pn)) 1879 break; 1880 1881 /* update the suffix to address pulled leaves */ 1882 if (pn->slen > pn->pos) 1883 update_suffix(pn); 1884 1885 /* resize completed node */ 1886 pn = resize(t, pn); 1887 cindex = get_index(pkey, pn); 1888 1889 continue; 1890 } 1891 1892 /* grab the next available node */ 1893 n = get_child(pn, cindex); 1894 if (!n) 1895 continue; 1896 1897 if (IS_TNODE(n)) { 1898 /* record pn and cindex for leaf walking */ 1899 pn = n; 1900 cindex = 1ul << n->bits; 1901 1902 continue; 1903 } 1904 1905 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) { 1906 struct fib_info *fi = fa->fa_info; 1907 1908 if (!fi || tb->tb_id != fa->tb_id || 1909 (!(fi->fib_flags & RTNH_F_DEAD) && 1910 !fib_props[fa->fa_type].error)) { 1911 slen = fa->fa_slen; 1912 continue; 1913 } 1914 1915 /* Do not flush error routes if network namespace is 1916 * not being dismantled 1917 */ 1918 if (!flush_all && fib_props[fa->fa_type].error) { 1919 slen = fa->fa_slen; 1920 continue; 1921 } 1922 1923 call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, 1924 n->key, 1925 KEYLENGTH - fa->fa_slen, fa, 1926 NULL); 1927 hlist_del_rcu(&fa->fa_list); 1928 fib_release_info(fa->fa_info); 1929 alias_free_mem_rcu(fa); 1930 found++; 1931 } 1932 1933 /* update leaf slen */ 1934 n->slen = slen; 1935 1936 if (hlist_empty(&n->leaf)) { 1937 put_child_root(pn, n->key, NULL); 1938 node_free(n); 1939 } 1940 } 1941 1942 pr_debug("trie_flush found=%d\n", found); 1943 return found; 1944 } 1945 1946 static void fib_leaf_notify(struct net *net, struct key_vector *l, 1947 struct fib_table *tb, struct notifier_block *nb) 1948 { 1949 struct fib_alias *fa; 1950 1951 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) { 1952 struct fib_info *fi = fa->fa_info; 1953 1954 if (!fi) 1955 continue; 1956 1957 /* local and main table can share the same trie, 1958 * so don't notify twice for the same entry. 1959 */ 1960 if (tb->tb_id != fa->tb_id) 1961 continue; 1962 1963 call_fib_entry_notifier(nb, net, FIB_EVENT_ENTRY_ADD, l->key, 1964 KEYLENGTH - fa->fa_slen, fa); 1965 } 1966 } 1967 1968 static void fib_table_notify(struct net *net, struct fib_table *tb, 1969 struct notifier_block *nb) 1970 { 1971 struct trie *t = (struct trie *)tb->tb_data; 1972 struct key_vector *l, *tp = t->kv; 1973 t_key key = 0; 1974 1975 while ((l = leaf_walk_rcu(&tp, key)) != NULL) { 1976 fib_leaf_notify(net, l, tb, nb); 1977 1978 key = l->key + 1; 1979 /* stop in case of wrap around */ 1980 if (key < l->key) 1981 break; 1982 } 1983 } 1984 1985 void fib_notify(struct net *net, struct notifier_block *nb) 1986 { 1987 unsigned int h; 1988 1989 for (h = 0; h < FIB_TABLE_HASHSZ; h++) { 1990 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; 1991 struct fib_table *tb; 1992 1993 hlist_for_each_entry_rcu(tb, head, tb_hlist) 1994 fib_table_notify(net, tb, nb); 1995 } 1996 } 1997 1998 static void __trie_free_rcu(struct rcu_head *head) 1999 { 2000 struct fib_table *tb = container_of(head, struct fib_table, rcu); 2001 #ifdef CONFIG_IP_FIB_TRIE_STATS 2002 struct trie *t = (struct trie *)tb->tb_data; 2003 2004 if (tb->tb_data == tb->__data) 2005 free_percpu(t->stats); 2006 #endif /* CONFIG_IP_FIB_TRIE_STATS */ 2007 kfree(tb); 2008 } 2009 2010 void fib_free_table(struct fib_table *tb) 2011 { 2012 call_rcu(&tb->rcu, __trie_free_rcu); 2013 } 2014 2015 static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb, 2016 struct sk_buff *skb, struct netlink_callback *cb, 2017 struct fib_dump_filter *filter) 2018 { 2019 unsigned int flags = NLM_F_MULTI; 2020 __be32 xkey = htonl(l->key); 2021 struct fib_alias *fa; 2022 int i, s_i; 2023 2024 if (filter->filter_set) 2025 flags |= NLM_F_DUMP_FILTERED; 2026 2027 s_i = cb->args[4]; 2028 i = 0; 2029 2030 /* rcu_read_lock is hold by caller */ 2031 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) { 2032 int err; 2033 2034 if (i < s_i) 2035 goto next; 2036 2037 if (tb->tb_id != fa->tb_id) 2038 goto next; 2039 2040 if (filter->filter_set) { 2041 if (filter->rt_type && fa->fa_type != filter->rt_type) 2042 goto next; 2043 2044 if ((filter->protocol && 2045 fa->fa_info->fib_protocol != filter->protocol)) 2046 goto next; 2047 2048 if (filter->dev && 2049 !fib_info_nh_uses_dev(fa->fa_info, filter->dev)) 2050 goto next; 2051 } 2052 2053 err = fib_dump_info(skb, NETLINK_CB(cb->skb).portid, 2054 cb->nlh->nlmsg_seq, RTM_NEWROUTE, 2055 tb->tb_id, fa->fa_type, 2056 xkey, KEYLENGTH - fa->fa_slen, 2057 fa->fa_tos, fa->fa_info, flags); 2058 if (err < 0) { 2059 cb->args[4] = i; 2060 return err; 2061 } 2062 next: 2063 i++; 2064 } 2065 2066 cb->args[4] = i; 2067 return skb->len; 2068 } 2069 2070 /* rcu_read_lock needs to be hold by caller from readside */ 2071 int fib_table_dump(struct fib_table *tb, struct sk_buff *skb, 2072 struct netlink_callback *cb, struct fib_dump_filter *filter) 2073 { 2074 struct trie *t = (struct trie *)tb->tb_data; 2075 struct key_vector *l, *tp = t->kv; 2076 /* Dump starting at last key. 2077 * Note: 0.0.0.0/0 (ie default) is first key. 2078 */ 2079 int count = cb->args[2]; 2080 t_key key = cb->args[3]; 2081 2082 while ((l = leaf_walk_rcu(&tp, key)) != NULL) { 2083 int err; 2084 2085 err = fn_trie_dump_leaf(l, tb, skb, cb, filter); 2086 if (err < 0) { 2087 cb->args[3] = key; 2088 cb->args[2] = count; 2089 return err; 2090 } 2091 2092 ++count; 2093 key = l->key + 1; 2094 2095 memset(&cb->args[4], 0, 2096 sizeof(cb->args) - 4*sizeof(cb->args[0])); 2097 2098 /* stop loop if key wrapped back to 0 */ 2099 if (key < l->key) 2100 break; 2101 } 2102 2103 cb->args[3] = key; 2104 cb->args[2] = count; 2105 2106 return skb->len; 2107 } 2108 2109 void __init fib_trie_init(void) 2110 { 2111 fn_alias_kmem = kmem_cache_create("ip_fib_alias", 2112 sizeof(struct fib_alias), 2113 0, SLAB_PANIC, NULL); 2114 2115 trie_leaf_kmem = kmem_cache_create("ip_fib_trie", 2116 LEAF_SIZE, 2117 0, SLAB_PANIC, NULL); 2118 } 2119 2120 struct fib_table *fib_trie_table(u32 id, struct fib_table *alias) 2121 { 2122 struct fib_table *tb; 2123 struct trie *t; 2124 size_t sz = sizeof(*tb); 2125 2126 if (!alias) 2127 sz += sizeof(struct trie); 2128 2129 tb = kzalloc(sz, GFP_KERNEL); 2130 if (!tb) 2131 return NULL; 2132 2133 tb->tb_id = id; 2134 tb->tb_num_default = 0; 2135 tb->tb_data = (alias ? alias->__data : tb->__data); 2136 2137 if (alias) 2138 return tb; 2139 2140 t = (struct trie *) tb->tb_data; 2141 t->kv[0].pos = KEYLENGTH; 2142 t->kv[0].slen = KEYLENGTH; 2143 #ifdef CONFIG_IP_FIB_TRIE_STATS 2144 t->stats = alloc_percpu(struct trie_use_stats); 2145 if (!t->stats) { 2146 kfree(tb); 2147 tb = NULL; 2148 } 2149 #endif 2150 2151 return tb; 2152 } 2153 2154 #ifdef CONFIG_PROC_FS 2155 /* Depth first Trie walk iterator */ 2156 struct fib_trie_iter { 2157 struct seq_net_private p; 2158 struct fib_table *tb; 2159 struct key_vector *tnode; 2160 unsigned int index; 2161 unsigned int depth; 2162 }; 2163 2164 static struct key_vector *fib_trie_get_next(struct fib_trie_iter *iter) 2165 { 2166 unsigned long cindex = iter->index; 2167 struct key_vector *pn = iter->tnode; 2168 t_key pkey; 2169 2170 pr_debug("get_next iter={node=%p index=%d depth=%d}\n", 2171 iter->tnode, iter->index, iter->depth); 2172 2173 while (!IS_TRIE(pn)) { 2174 while (cindex < child_length(pn)) { 2175 struct key_vector *n = get_child_rcu(pn, cindex++); 2176 2177 if (!n) 2178 continue; 2179 2180 if (IS_LEAF(n)) { 2181 iter->tnode = pn; 2182 iter->index = cindex; 2183 } else { 2184 /* push down one level */ 2185 iter->tnode = n; 2186 iter->index = 0; 2187 ++iter->depth; 2188 } 2189 2190 return n; 2191 } 2192 2193 /* Current node exhausted, pop back up */ 2194 pkey = pn->key; 2195 pn = node_parent_rcu(pn); 2196 cindex = get_index(pkey, pn) + 1; 2197 --iter->depth; 2198 } 2199 2200 /* record root node so further searches know we are done */ 2201 iter->tnode = pn; 2202 iter->index = 0; 2203 2204 return NULL; 2205 } 2206 2207 static struct key_vector *fib_trie_get_first(struct fib_trie_iter *iter, 2208 struct trie *t) 2209 { 2210 struct key_vector *n, *pn; 2211 2212 if (!t) 2213 return NULL; 2214 2215 pn = t->kv; 2216 n = rcu_dereference(pn->tnode[0]); 2217 if (!n) 2218 return NULL; 2219 2220 if (IS_TNODE(n)) { 2221 iter->tnode = n; 2222 iter->index = 0; 2223 iter->depth = 1; 2224 } else { 2225 iter->tnode = pn; 2226 iter->index = 0; 2227 iter->depth = 0; 2228 } 2229 2230 return n; 2231 } 2232 2233 static void trie_collect_stats(struct trie *t, struct trie_stat *s) 2234 { 2235 struct key_vector *n; 2236 struct fib_trie_iter iter; 2237 2238 memset(s, 0, sizeof(*s)); 2239 2240 rcu_read_lock(); 2241 for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) { 2242 if (IS_LEAF(n)) { 2243 struct fib_alias *fa; 2244 2245 s->leaves++; 2246 s->totdepth += iter.depth; 2247 if (iter.depth > s->maxdepth) 2248 s->maxdepth = iter.depth; 2249 2250 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) 2251 ++s->prefixes; 2252 } else { 2253 s->tnodes++; 2254 if (n->bits < MAX_STAT_DEPTH) 2255 s->nodesizes[n->bits]++; 2256 s->nullpointers += tn_info(n)->empty_children; 2257 } 2258 } 2259 rcu_read_unlock(); 2260 } 2261 2262 /* 2263 * This outputs /proc/net/fib_triestats 2264 */ 2265 static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat) 2266 { 2267 unsigned int i, max, pointers, bytes, avdepth; 2268 2269 if (stat->leaves) 2270 avdepth = stat->totdepth*100 / stat->leaves; 2271 else 2272 avdepth = 0; 2273 2274 seq_printf(seq, "\tAver depth: %u.%02d\n", 2275 avdepth / 100, avdepth % 100); 2276 seq_printf(seq, "\tMax depth: %u\n", stat->maxdepth); 2277 2278 seq_printf(seq, "\tLeaves: %u\n", stat->leaves); 2279 bytes = LEAF_SIZE * stat->leaves; 2280 2281 seq_printf(seq, "\tPrefixes: %u\n", stat->prefixes); 2282 bytes += sizeof(struct fib_alias) * stat->prefixes; 2283 2284 seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes); 2285 bytes += TNODE_SIZE(0) * stat->tnodes; 2286 2287 max = MAX_STAT_DEPTH; 2288 while (max > 0 && stat->nodesizes[max-1] == 0) 2289 max--; 2290 2291 pointers = 0; 2292 for (i = 1; i < max; i++) 2293 if (stat->nodesizes[i] != 0) { 2294 seq_printf(seq, " %u: %u", i, stat->nodesizes[i]); 2295 pointers += (1<<i) * stat->nodesizes[i]; 2296 } 2297 seq_putc(seq, '\n'); 2298 seq_printf(seq, "\tPointers: %u\n", pointers); 2299 2300 bytes += sizeof(struct key_vector *) * pointers; 2301 seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers); 2302 seq_printf(seq, "Total size: %u kB\n", (bytes + 1023) / 1024); 2303 } 2304 2305 #ifdef CONFIG_IP_FIB_TRIE_STATS 2306 static void trie_show_usage(struct seq_file *seq, 2307 const struct trie_use_stats __percpu *stats) 2308 { 2309 struct trie_use_stats s = { 0 }; 2310 int cpu; 2311 2312 /* loop through all of the CPUs and gather up the stats */ 2313 for_each_possible_cpu(cpu) { 2314 const struct trie_use_stats *pcpu = per_cpu_ptr(stats, cpu); 2315 2316 s.gets += pcpu->gets; 2317 s.backtrack += pcpu->backtrack; 2318 s.semantic_match_passed += pcpu->semantic_match_passed; 2319 s.semantic_match_miss += pcpu->semantic_match_miss; 2320 s.null_node_hit += pcpu->null_node_hit; 2321 s.resize_node_skipped += pcpu->resize_node_skipped; 2322 } 2323 2324 seq_printf(seq, "\nCounters:\n---------\n"); 2325 seq_printf(seq, "gets = %u\n", s.gets); 2326 seq_printf(seq, "backtracks = %u\n", s.backtrack); 2327 seq_printf(seq, "semantic match passed = %u\n", 2328 s.semantic_match_passed); 2329 seq_printf(seq, "semantic match miss = %u\n", s.semantic_match_miss); 2330 seq_printf(seq, "null node hit= %u\n", s.null_node_hit); 2331 seq_printf(seq, "skipped node resize = %u\n\n", s.resize_node_skipped); 2332 } 2333 #endif /* CONFIG_IP_FIB_TRIE_STATS */ 2334 2335 static void fib_table_print(struct seq_file *seq, struct fib_table *tb) 2336 { 2337 if (tb->tb_id == RT_TABLE_LOCAL) 2338 seq_puts(seq, "Local:\n"); 2339 else if (tb->tb_id == RT_TABLE_MAIN) 2340 seq_puts(seq, "Main:\n"); 2341 else 2342 seq_printf(seq, "Id %d:\n", tb->tb_id); 2343 } 2344 2345 2346 static int fib_triestat_seq_show(struct seq_file *seq, void *v) 2347 { 2348 struct net *net = (struct net *)seq->private; 2349 unsigned int h; 2350 2351 seq_printf(seq, 2352 "Basic info: size of leaf:" 2353 " %zd bytes, size of tnode: %zd bytes.\n", 2354 LEAF_SIZE, TNODE_SIZE(0)); 2355 2356 for (h = 0; h < FIB_TABLE_HASHSZ; h++) { 2357 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; 2358 struct fib_table *tb; 2359 2360 hlist_for_each_entry_rcu(tb, head, tb_hlist) { 2361 struct trie *t = (struct trie *) tb->tb_data; 2362 struct trie_stat stat; 2363 2364 if (!t) 2365 continue; 2366 2367 fib_table_print(seq, tb); 2368 2369 trie_collect_stats(t, &stat); 2370 trie_show_stats(seq, &stat); 2371 #ifdef CONFIG_IP_FIB_TRIE_STATS 2372 trie_show_usage(seq, t->stats); 2373 #endif 2374 } 2375 } 2376 2377 return 0; 2378 } 2379 2380 static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos) 2381 { 2382 struct fib_trie_iter *iter = seq->private; 2383 struct net *net = seq_file_net(seq); 2384 loff_t idx = 0; 2385 unsigned int h; 2386 2387 for (h = 0; h < FIB_TABLE_HASHSZ; h++) { 2388 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; 2389 struct fib_table *tb; 2390 2391 hlist_for_each_entry_rcu(tb, head, tb_hlist) { 2392 struct key_vector *n; 2393 2394 for (n = fib_trie_get_first(iter, 2395 (struct trie *) tb->tb_data); 2396 n; n = fib_trie_get_next(iter)) 2397 if (pos == idx++) { 2398 iter->tb = tb; 2399 return n; 2400 } 2401 } 2402 } 2403 2404 return NULL; 2405 } 2406 2407 static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos) 2408 __acquires(RCU) 2409 { 2410 rcu_read_lock(); 2411 return fib_trie_get_idx(seq, *pos); 2412 } 2413 2414 static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2415 { 2416 struct fib_trie_iter *iter = seq->private; 2417 struct net *net = seq_file_net(seq); 2418 struct fib_table *tb = iter->tb; 2419 struct hlist_node *tb_node; 2420 unsigned int h; 2421 struct key_vector *n; 2422 2423 ++*pos; 2424 /* next node in same table */ 2425 n = fib_trie_get_next(iter); 2426 if (n) 2427 return n; 2428 2429 /* walk rest of this hash chain */ 2430 h = tb->tb_id & (FIB_TABLE_HASHSZ - 1); 2431 while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) { 2432 tb = hlist_entry(tb_node, struct fib_table, tb_hlist); 2433 n = fib_trie_get_first(iter, (struct trie *) tb->tb_data); 2434 if (n) 2435 goto found; 2436 } 2437 2438 /* new hash chain */ 2439 while (++h < FIB_TABLE_HASHSZ) { 2440 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; 2441 hlist_for_each_entry_rcu(tb, head, tb_hlist) { 2442 n = fib_trie_get_first(iter, (struct trie *) tb->tb_data); 2443 if (n) 2444 goto found; 2445 } 2446 } 2447 return NULL; 2448 2449 found: 2450 iter->tb = tb; 2451 return n; 2452 } 2453 2454 static void fib_trie_seq_stop(struct seq_file *seq, void *v) 2455 __releases(RCU) 2456 { 2457 rcu_read_unlock(); 2458 } 2459 2460 static void seq_indent(struct seq_file *seq, int n) 2461 { 2462 while (n-- > 0) 2463 seq_puts(seq, " "); 2464 } 2465 2466 static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s) 2467 { 2468 switch (s) { 2469 case RT_SCOPE_UNIVERSE: return "universe"; 2470 case RT_SCOPE_SITE: return "site"; 2471 case RT_SCOPE_LINK: return "link"; 2472 case RT_SCOPE_HOST: return "host"; 2473 case RT_SCOPE_NOWHERE: return "nowhere"; 2474 default: 2475 snprintf(buf, len, "scope=%d", s); 2476 return buf; 2477 } 2478 } 2479 2480 static const char *const rtn_type_names[__RTN_MAX] = { 2481 [RTN_UNSPEC] = "UNSPEC", 2482 [RTN_UNICAST] = "UNICAST", 2483 [RTN_LOCAL] = "LOCAL", 2484 [RTN_BROADCAST] = "BROADCAST", 2485 [RTN_ANYCAST] = "ANYCAST", 2486 [RTN_MULTICAST] = "MULTICAST", 2487 [RTN_BLACKHOLE] = "BLACKHOLE", 2488 [RTN_UNREACHABLE] = "UNREACHABLE", 2489 [RTN_PROHIBIT] = "PROHIBIT", 2490 [RTN_THROW] = "THROW", 2491 [RTN_NAT] = "NAT", 2492 [RTN_XRESOLVE] = "XRESOLVE", 2493 }; 2494 2495 static inline const char *rtn_type(char *buf, size_t len, unsigned int t) 2496 { 2497 if (t < __RTN_MAX && rtn_type_names[t]) 2498 return rtn_type_names[t]; 2499 snprintf(buf, len, "type %u", t); 2500 return buf; 2501 } 2502 2503 /* Pretty print the trie */ 2504 static int fib_trie_seq_show(struct seq_file *seq, void *v) 2505 { 2506 const struct fib_trie_iter *iter = seq->private; 2507 struct key_vector *n = v; 2508 2509 if (IS_TRIE(node_parent_rcu(n))) 2510 fib_table_print(seq, iter->tb); 2511 2512 if (IS_TNODE(n)) { 2513 __be32 prf = htonl(n->key); 2514 2515 seq_indent(seq, iter->depth-1); 2516 seq_printf(seq, " +-- %pI4/%zu %u %u %u\n", 2517 &prf, KEYLENGTH - n->pos - n->bits, n->bits, 2518 tn_info(n)->full_children, 2519 tn_info(n)->empty_children); 2520 } else { 2521 __be32 val = htonl(n->key); 2522 struct fib_alias *fa; 2523 2524 seq_indent(seq, iter->depth); 2525 seq_printf(seq, " |-- %pI4\n", &val); 2526 2527 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) { 2528 char buf1[32], buf2[32]; 2529 2530 seq_indent(seq, iter->depth + 1); 2531 seq_printf(seq, " /%zu %s %s", 2532 KEYLENGTH - fa->fa_slen, 2533 rtn_scope(buf1, sizeof(buf1), 2534 fa->fa_info->fib_scope), 2535 rtn_type(buf2, sizeof(buf2), 2536 fa->fa_type)); 2537 if (fa->fa_tos) 2538 seq_printf(seq, " tos=%d", fa->fa_tos); 2539 seq_putc(seq, '\n'); 2540 } 2541 } 2542 2543 return 0; 2544 } 2545 2546 static const struct seq_operations fib_trie_seq_ops = { 2547 .start = fib_trie_seq_start, 2548 .next = fib_trie_seq_next, 2549 .stop = fib_trie_seq_stop, 2550 .show = fib_trie_seq_show, 2551 }; 2552 2553 struct fib_route_iter { 2554 struct seq_net_private p; 2555 struct fib_table *main_tb; 2556 struct key_vector *tnode; 2557 loff_t pos; 2558 t_key key; 2559 }; 2560 2561 static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter, 2562 loff_t pos) 2563 { 2564 struct key_vector *l, **tp = &iter->tnode; 2565 t_key key; 2566 2567 /* use cached location of previously found key */ 2568 if (iter->pos > 0 && pos >= iter->pos) { 2569 key = iter->key; 2570 } else { 2571 iter->pos = 1; 2572 key = 0; 2573 } 2574 2575 pos -= iter->pos; 2576 2577 while ((l = leaf_walk_rcu(tp, key)) && (pos-- > 0)) { 2578 key = l->key + 1; 2579 iter->pos++; 2580 l = NULL; 2581 2582 /* handle unlikely case of a key wrap */ 2583 if (!key) 2584 break; 2585 } 2586 2587 if (l) 2588 iter->key = l->key; /* remember it */ 2589 else 2590 iter->pos = 0; /* forget it */ 2591 2592 return l; 2593 } 2594 2595 static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos) 2596 __acquires(RCU) 2597 { 2598 struct fib_route_iter *iter = seq->private; 2599 struct fib_table *tb; 2600 struct trie *t; 2601 2602 rcu_read_lock(); 2603 2604 tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN); 2605 if (!tb) 2606 return NULL; 2607 2608 iter->main_tb = tb; 2609 t = (struct trie *)tb->tb_data; 2610 iter->tnode = t->kv; 2611 2612 if (*pos != 0) 2613 return fib_route_get_idx(iter, *pos); 2614 2615 iter->pos = 0; 2616 iter->key = KEY_MAX; 2617 2618 return SEQ_START_TOKEN; 2619 } 2620 2621 static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2622 { 2623 struct fib_route_iter *iter = seq->private; 2624 struct key_vector *l = NULL; 2625 t_key key = iter->key + 1; 2626 2627 ++*pos; 2628 2629 /* only allow key of 0 for start of sequence */ 2630 if ((v == SEQ_START_TOKEN) || key) 2631 l = leaf_walk_rcu(&iter->tnode, key); 2632 2633 if (l) { 2634 iter->key = l->key; 2635 iter->pos++; 2636 } else { 2637 iter->pos = 0; 2638 } 2639 2640 return l; 2641 } 2642 2643 static void fib_route_seq_stop(struct seq_file *seq, void *v) 2644 __releases(RCU) 2645 { 2646 rcu_read_unlock(); 2647 } 2648 2649 static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi) 2650 { 2651 unsigned int flags = 0; 2652 2653 if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT) 2654 flags = RTF_REJECT; 2655 if (fi && fi->fib_nh->fib_nh_gw4) 2656 flags |= RTF_GATEWAY; 2657 if (mask == htonl(0xFFFFFFFF)) 2658 flags |= RTF_HOST; 2659 flags |= RTF_UP; 2660 return flags; 2661 } 2662 2663 /* 2664 * This outputs /proc/net/route. 2665 * The format of the file is not supposed to be changed 2666 * and needs to be same as fib_hash output to avoid breaking 2667 * legacy utilities 2668 */ 2669 static int fib_route_seq_show(struct seq_file *seq, void *v) 2670 { 2671 struct fib_route_iter *iter = seq->private; 2672 struct fib_table *tb = iter->main_tb; 2673 struct fib_alias *fa; 2674 struct key_vector *l = v; 2675 __be32 prefix; 2676 2677 if (v == SEQ_START_TOKEN) { 2678 seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway " 2679 "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU" 2680 "\tWindow\tIRTT"); 2681 return 0; 2682 } 2683 2684 prefix = htonl(l->key); 2685 2686 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) { 2687 const struct fib_info *fi = fa->fa_info; 2688 __be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen); 2689 unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi); 2690 2691 if ((fa->fa_type == RTN_BROADCAST) || 2692 (fa->fa_type == RTN_MULTICAST)) 2693 continue; 2694 2695 if (fa->tb_id != tb->tb_id) 2696 continue; 2697 2698 seq_setwidth(seq, 127); 2699 2700 if (fi) 2701 seq_printf(seq, 2702 "%s\t%08X\t%08X\t%04X\t%d\t%u\t" 2703 "%d\t%08X\t%d\t%u\t%u", 2704 fi->fib_dev ? fi->fib_dev->name : "*", 2705 prefix, 2706 fi->fib_nh->fib_nh_gw4, flags, 0, 0, 2707 fi->fib_priority, 2708 mask, 2709 (fi->fib_advmss ? 2710 fi->fib_advmss + 40 : 0), 2711 fi->fib_window, 2712 fi->fib_rtt >> 3); 2713 else 2714 seq_printf(seq, 2715 "*\t%08X\t%08X\t%04X\t%d\t%u\t" 2716 "%d\t%08X\t%d\t%u\t%u", 2717 prefix, 0, flags, 0, 0, 0, 2718 mask, 0, 0, 0); 2719 2720 seq_pad(seq, '\n'); 2721 } 2722 2723 return 0; 2724 } 2725 2726 static const struct seq_operations fib_route_seq_ops = { 2727 .start = fib_route_seq_start, 2728 .next = fib_route_seq_next, 2729 .stop = fib_route_seq_stop, 2730 .show = fib_route_seq_show, 2731 }; 2732 2733 int __net_init fib_proc_init(struct net *net) 2734 { 2735 if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, 2736 sizeof(struct fib_trie_iter))) 2737 goto out1; 2738 2739 if (!proc_create_net_single("fib_triestat", 0444, net->proc_net, 2740 fib_triestat_seq_show, NULL)) 2741 goto out2; 2742 2743 if (!proc_create_net("route", 0444, net->proc_net, &fib_route_seq_ops, 2744 sizeof(struct fib_route_iter))) 2745 goto out3; 2746 2747 return 0; 2748 2749 out3: 2750 remove_proc_entry("fib_triestat", net->proc_net); 2751 out2: 2752 remove_proc_entry("fib_trie", net->proc_net); 2753 out1: 2754 return -ENOMEM; 2755 } 2756 2757 void __net_exit fib_proc_exit(struct net *net) 2758 { 2759 remove_proc_entry("fib_trie", net->proc_net); 2760 remove_proc_entry("fib_triestat", net->proc_net); 2761 remove_proc_entry("route", net->proc_net); 2762 } 2763 2764 #endif /* CONFIG_PROC_FS */ 2765