1 /* 2 * Linux INET6 implementation 3 * Forwarding Information Database 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 11 * 2 of the License, or (at your option) any later version. 12 */ 13 14 /* 15 * Changes: 16 * Yuji SEKIYA @USAGI: Support default route on router node; 17 * remove ip6_null_entry from the top of 18 * routing table. 19 * Ville Nuorvala: Fixed routing subtrees. 20 */ 21 #include <linux/errno.h> 22 #include <linux/types.h> 23 #include <linux/net.h> 24 #include <linux/route.h> 25 #include <linux/netdevice.h> 26 #include <linux/in6.h> 27 #include <linux/init.h> 28 #include <linux/list.h> 29 30 #ifdef CONFIG_PROC_FS 31 #include <linux/proc_fs.h> 32 #endif 33 34 #include <net/ipv6.h> 35 #include <net/ndisc.h> 36 #include <net/addrconf.h> 37 38 #include <net/ip6_fib.h> 39 #include <net/ip6_route.h> 40 41 #define RT6_DEBUG 2 42 43 #if RT6_DEBUG >= 3 44 #define RT6_TRACE(x...) printk(KERN_DEBUG x) 45 #else 46 #define RT6_TRACE(x...) do { ; } while (0) 47 #endif 48 49 static struct kmem_cache * fib6_node_kmem __read_mostly; 50 51 enum fib_walk_state_t 52 { 53 #ifdef CONFIG_IPV6_SUBTREES 54 FWS_S, 55 #endif 56 FWS_L, 57 FWS_R, 58 FWS_C, 59 FWS_U 60 }; 61 62 struct fib6_cleaner_t 63 { 64 struct fib6_walker_t w; 65 struct net *net; 66 int (*func)(struct rt6_info *, void *arg); 67 void *arg; 68 }; 69 70 static DEFINE_RWLOCK(fib6_walker_lock); 71 72 #ifdef CONFIG_IPV6_SUBTREES 73 #define FWS_INIT FWS_S 74 #else 75 #define FWS_INIT FWS_L 76 #endif 77 78 static void fib6_prune_clones(struct net *net, struct fib6_node *fn, 79 struct rt6_info *rt); 80 static struct rt6_info *fib6_find_prefix(struct net *net, struct fib6_node *fn); 81 static struct fib6_node *fib6_repair_tree(struct net *net, struct fib6_node *fn); 82 static int fib6_walk(struct fib6_walker_t *w); 83 static int fib6_walk_continue(struct fib6_walker_t *w); 84 85 /* 86 * A routing update causes an increase of the serial number on the 87 * affected subtree. This allows for cached routes to be asynchronously 88 * tested when modifications are made to the destination cache as a 89 * result of redirects, path MTU changes, etc. 90 */ 91 92 static __u32 rt_sernum; 93 94 static void fib6_gc_timer_cb(unsigned long arg); 95 96 static struct fib6_walker_t fib6_walker_list = { 97 .prev = &fib6_walker_list, 98 .next = &fib6_walker_list, 99 }; 100 101 #define FOR_WALKERS(w) for ((w)=fib6_walker_list.next; (w) != &fib6_walker_list; (w)=(w)->next) 102 103 static inline void fib6_walker_link(struct fib6_walker_t *w) 104 { 105 write_lock_bh(&fib6_walker_lock); 106 w->next = fib6_walker_list.next; 107 w->prev = &fib6_walker_list; 108 w->next->prev = w; 109 w->prev->next = w; 110 write_unlock_bh(&fib6_walker_lock); 111 } 112 113 static inline void fib6_walker_unlink(struct fib6_walker_t *w) 114 { 115 write_lock_bh(&fib6_walker_lock); 116 w->next->prev = w->prev; 117 w->prev->next = w->next; 118 w->prev = w->next = w; 119 write_unlock_bh(&fib6_walker_lock); 120 } 121 static __inline__ u32 fib6_new_sernum(void) 122 { 123 u32 n = ++rt_sernum; 124 if ((__s32)n <= 0) 125 rt_sernum = n = 1; 126 return n; 127 } 128 129 /* 130 * Auxiliary address test functions for the radix tree. 131 * 132 * These assume a 32bit processor (although it will work on 133 * 64bit processors) 134 */ 135 136 /* 137 * test bit 138 */ 139 140 static __inline__ __be32 addr_bit_set(void *token, int fn_bit) 141 { 142 __be32 *addr = token; 143 144 return htonl(1 << ((~fn_bit)&0x1F)) & addr[fn_bit>>5]; 145 } 146 147 static __inline__ struct fib6_node * node_alloc(void) 148 { 149 struct fib6_node *fn; 150 151 fn = kmem_cache_zalloc(fib6_node_kmem, GFP_ATOMIC); 152 153 return fn; 154 } 155 156 static __inline__ void node_free(struct fib6_node * fn) 157 { 158 kmem_cache_free(fib6_node_kmem, fn); 159 } 160 161 static __inline__ void rt6_release(struct rt6_info *rt) 162 { 163 if (atomic_dec_and_test(&rt->rt6i_ref)) 164 dst_free(&rt->u.dst); 165 } 166 167 static void fib6_link_table(struct net *net, struct fib6_table *tb) 168 { 169 unsigned int h; 170 171 /* 172 * Initialize table lock at a single place to give lockdep a key, 173 * tables aren't visible prior to being linked to the list. 174 */ 175 rwlock_init(&tb->tb6_lock); 176 177 h = tb->tb6_id & (FIB6_TABLE_HASHSZ - 1); 178 179 /* 180 * No protection necessary, this is the only list mutatation 181 * operation, tables never disappear once they exist. 182 */ 183 hlist_add_head_rcu(&tb->tb6_hlist, &net->ipv6.fib_table_hash[h]); 184 } 185 186 #ifdef CONFIG_IPV6_MULTIPLE_TABLES 187 188 static struct fib6_table *fib6_alloc_table(struct net *net, u32 id) 189 { 190 struct fib6_table *table; 191 192 table = kzalloc(sizeof(*table), GFP_ATOMIC); 193 if (table != NULL) { 194 table->tb6_id = id; 195 table->tb6_root.leaf = net->ipv6.ip6_null_entry; 196 table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; 197 } 198 199 return table; 200 } 201 202 struct fib6_table *fib6_new_table(struct net *net, u32 id) 203 { 204 struct fib6_table *tb; 205 206 if (id == 0) 207 id = RT6_TABLE_MAIN; 208 tb = fib6_get_table(net, id); 209 if (tb) 210 return tb; 211 212 tb = fib6_alloc_table(net, id); 213 if (tb != NULL) 214 fib6_link_table(net, tb); 215 216 return tb; 217 } 218 219 struct fib6_table *fib6_get_table(struct net *net, u32 id) 220 { 221 struct fib6_table *tb; 222 struct hlist_head *head; 223 struct hlist_node *node; 224 unsigned int h; 225 226 if (id == 0) 227 id = RT6_TABLE_MAIN; 228 h = id & (FIB6_TABLE_HASHSZ - 1); 229 rcu_read_lock(); 230 head = &net->ipv6.fib_table_hash[h]; 231 hlist_for_each_entry_rcu(tb, node, head, tb6_hlist) { 232 if (tb->tb6_id == id) { 233 rcu_read_unlock(); 234 return tb; 235 } 236 } 237 rcu_read_unlock(); 238 239 return NULL; 240 } 241 242 static void fib6_tables_init(struct net *net) 243 { 244 fib6_link_table(net, net->ipv6.fib6_main_tbl); 245 fib6_link_table(net, net->ipv6.fib6_local_tbl); 246 } 247 #else 248 249 struct fib6_table *fib6_new_table(struct net *net, u32 id) 250 { 251 return fib6_get_table(net, id); 252 } 253 254 struct fib6_table *fib6_get_table(struct net *net, u32 id) 255 { 256 return net->ipv6.fib6_main_tbl; 257 } 258 259 struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi *fl, 260 int flags, pol_lookup_t lookup) 261 { 262 return (struct dst_entry *) lookup(net, net->ipv6.fib6_main_tbl, fl, flags); 263 } 264 265 static void fib6_tables_init(struct net *net) 266 { 267 fib6_link_table(net, net->ipv6.fib6_main_tbl); 268 } 269 270 #endif 271 272 static int fib6_dump_node(struct fib6_walker_t *w) 273 { 274 int res; 275 struct rt6_info *rt; 276 277 for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) { 278 res = rt6_dump_route(rt, w->args); 279 if (res < 0) { 280 /* Frame is full, suspend walking */ 281 w->leaf = rt; 282 return 1; 283 } 284 WARN_ON(res == 0); 285 } 286 w->leaf = NULL; 287 return 0; 288 } 289 290 static void fib6_dump_end(struct netlink_callback *cb) 291 { 292 struct fib6_walker_t *w = (void*)cb->args[2]; 293 294 if (w) { 295 if (cb->args[4]) { 296 cb->args[4] = 0; 297 fib6_walker_unlink(w); 298 } 299 cb->args[2] = 0; 300 kfree(w); 301 } 302 cb->done = (void*)cb->args[3]; 303 cb->args[1] = 3; 304 } 305 306 static int fib6_dump_done(struct netlink_callback *cb) 307 { 308 fib6_dump_end(cb); 309 return cb->done ? cb->done(cb) : 0; 310 } 311 312 static int fib6_dump_table(struct fib6_table *table, struct sk_buff *skb, 313 struct netlink_callback *cb) 314 { 315 struct fib6_walker_t *w; 316 int res; 317 318 w = (void *)cb->args[2]; 319 w->root = &table->tb6_root; 320 321 if (cb->args[4] == 0) { 322 read_lock_bh(&table->tb6_lock); 323 res = fib6_walk(w); 324 read_unlock_bh(&table->tb6_lock); 325 if (res > 0) 326 cb->args[4] = 1; 327 } else { 328 read_lock_bh(&table->tb6_lock); 329 res = fib6_walk_continue(w); 330 read_unlock_bh(&table->tb6_lock); 331 if (res <= 0) { 332 fib6_walker_unlink(w); 333 cb->args[4] = 0; 334 } 335 } 336 337 return res; 338 } 339 340 static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) 341 { 342 struct net *net = sock_net(skb->sk); 343 unsigned int h, s_h; 344 unsigned int e = 0, s_e; 345 struct rt6_rtnl_dump_arg arg; 346 struct fib6_walker_t *w; 347 struct fib6_table *tb; 348 struct hlist_node *node; 349 struct hlist_head *head; 350 int res = 0; 351 352 s_h = cb->args[0]; 353 s_e = cb->args[1]; 354 355 w = (void *)cb->args[2]; 356 if (w == NULL) { 357 /* New dump: 358 * 359 * 1. hook callback destructor. 360 */ 361 cb->args[3] = (long)cb->done; 362 cb->done = fib6_dump_done; 363 364 /* 365 * 2. allocate and initialize walker. 366 */ 367 w = kzalloc(sizeof(*w), GFP_ATOMIC); 368 if (w == NULL) 369 return -ENOMEM; 370 w->func = fib6_dump_node; 371 cb->args[2] = (long)w; 372 } 373 374 arg.skb = skb; 375 arg.cb = cb; 376 arg.net = net; 377 w->args = &arg; 378 379 for (h = s_h; h < FIB6_TABLE_HASHSZ; h++, s_e = 0) { 380 e = 0; 381 head = &net->ipv6.fib_table_hash[h]; 382 hlist_for_each_entry(tb, node, head, tb6_hlist) { 383 if (e < s_e) 384 goto next; 385 res = fib6_dump_table(tb, skb, cb); 386 if (res != 0) 387 goto out; 388 next: 389 e++; 390 } 391 } 392 out: 393 cb->args[1] = e; 394 cb->args[0] = h; 395 396 res = res < 0 ? res : skb->len; 397 if (res <= 0) 398 fib6_dump_end(cb); 399 return res; 400 } 401 402 /* 403 * Routing Table 404 * 405 * return the appropriate node for a routing tree "add" operation 406 * by either creating and inserting or by returning an existing 407 * node. 408 */ 409 410 static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr, 411 int addrlen, int plen, 412 int offset) 413 { 414 struct fib6_node *fn, *in, *ln; 415 struct fib6_node *pn = NULL; 416 struct rt6key *key; 417 int bit; 418 __be32 dir = 0; 419 __u32 sernum = fib6_new_sernum(); 420 421 RT6_TRACE("fib6_add_1\n"); 422 423 /* insert node in tree */ 424 425 fn = root; 426 427 do { 428 key = (struct rt6key *)((u8 *)fn->leaf + offset); 429 430 /* 431 * Prefix match 432 */ 433 if (plen < fn->fn_bit || 434 !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit)) 435 goto insert_above; 436 437 /* 438 * Exact match ? 439 */ 440 441 if (plen == fn->fn_bit) { 442 /* clean up an intermediate node */ 443 if ((fn->fn_flags & RTN_RTINFO) == 0) { 444 rt6_release(fn->leaf); 445 fn->leaf = NULL; 446 } 447 448 fn->fn_sernum = sernum; 449 450 return fn; 451 } 452 453 /* 454 * We have more bits to go 455 */ 456 457 /* Try to walk down on tree. */ 458 fn->fn_sernum = sernum; 459 dir = addr_bit_set(addr, fn->fn_bit); 460 pn = fn; 461 fn = dir ? fn->right: fn->left; 462 } while (fn); 463 464 /* 465 * We walked to the bottom of tree. 466 * Create new leaf node without children. 467 */ 468 469 ln = node_alloc(); 470 471 if (ln == NULL) 472 return NULL; 473 ln->fn_bit = plen; 474 475 ln->parent = pn; 476 ln->fn_sernum = sernum; 477 478 if (dir) 479 pn->right = ln; 480 else 481 pn->left = ln; 482 483 return ln; 484 485 486 insert_above: 487 /* 488 * split since we don't have a common prefix anymore or 489 * we have a less significant route. 490 * we've to insert an intermediate node on the list 491 * this new node will point to the one we need to create 492 * and the current 493 */ 494 495 pn = fn->parent; 496 497 /* find 1st bit in difference between the 2 addrs. 498 499 See comment in __ipv6_addr_diff: bit may be an invalid value, 500 but if it is >= plen, the value is ignored in any case. 501 */ 502 503 bit = __ipv6_addr_diff(addr, &key->addr, addrlen); 504 505 /* 506 * (intermediate)[in] 507 * / \ 508 * (new leaf node)[ln] (old node)[fn] 509 */ 510 if (plen > bit) { 511 in = node_alloc(); 512 ln = node_alloc(); 513 514 if (in == NULL || ln == NULL) { 515 if (in) 516 node_free(in); 517 if (ln) 518 node_free(ln); 519 return NULL; 520 } 521 522 /* 523 * new intermediate node. 524 * RTN_RTINFO will 525 * be off since that an address that chooses one of 526 * the branches would not match less specific routes 527 * in the other branch 528 */ 529 530 in->fn_bit = bit; 531 532 in->parent = pn; 533 in->leaf = fn->leaf; 534 atomic_inc(&in->leaf->rt6i_ref); 535 536 in->fn_sernum = sernum; 537 538 /* update parent pointer */ 539 if (dir) 540 pn->right = in; 541 else 542 pn->left = in; 543 544 ln->fn_bit = plen; 545 546 ln->parent = in; 547 fn->parent = in; 548 549 ln->fn_sernum = sernum; 550 551 if (addr_bit_set(addr, bit)) { 552 in->right = ln; 553 in->left = fn; 554 } else { 555 in->left = ln; 556 in->right = fn; 557 } 558 } else { /* plen <= bit */ 559 560 /* 561 * (new leaf node)[ln] 562 * / \ 563 * (old node)[fn] NULL 564 */ 565 566 ln = node_alloc(); 567 568 if (ln == NULL) 569 return NULL; 570 571 ln->fn_bit = plen; 572 573 ln->parent = pn; 574 575 ln->fn_sernum = sernum; 576 577 if (dir) 578 pn->right = ln; 579 else 580 pn->left = ln; 581 582 if (addr_bit_set(&key->addr, plen)) 583 ln->right = fn; 584 else 585 ln->left = fn; 586 587 fn->parent = ln; 588 } 589 return ln; 590 } 591 592 /* 593 * Insert routing information in a node. 594 */ 595 596 static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, 597 struct nl_info *info) 598 { 599 struct rt6_info *iter = NULL; 600 struct rt6_info **ins; 601 602 ins = &fn->leaf; 603 604 for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) { 605 /* 606 * Search for duplicates 607 */ 608 609 if (iter->rt6i_metric == rt->rt6i_metric) { 610 /* 611 * Same priority level 612 */ 613 614 if (iter->rt6i_dev == rt->rt6i_dev && 615 iter->rt6i_idev == rt->rt6i_idev && 616 ipv6_addr_equal(&iter->rt6i_gateway, 617 &rt->rt6i_gateway)) { 618 if (!(iter->rt6i_flags&RTF_EXPIRES)) 619 return -EEXIST; 620 iter->rt6i_expires = rt->rt6i_expires; 621 if (!(rt->rt6i_flags&RTF_EXPIRES)) { 622 iter->rt6i_flags &= ~RTF_EXPIRES; 623 iter->rt6i_expires = 0; 624 } 625 return -EEXIST; 626 } 627 } 628 629 if (iter->rt6i_metric > rt->rt6i_metric) 630 break; 631 632 ins = &iter->u.dst.rt6_next; 633 } 634 635 /* Reset round-robin state, if necessary */ 636 if (ins == &fn->leaf) 637 fn->rr_ptr = NULL; 638 639 /* 640 * insert node 641 */ 642 643 rt->u.dst.rt6_next = iter; 644 *ins = rt; 645 rt->rt6i_node = fn; 646 atomic_inc(&rt->rt6i_ref); 647 inet6_rt_notify(RTM_NEWROUTE, rt, info); 648 info->nl_net->ipv6.rt6_stats->fib_rt_entries++; 649 650 if ((fn->fn_flags & RTN_RTINFO) == 0) { 651 info->nl_net->ipv6.rt6_stats->fib_route_nodes++; 652 fn->fn_flags |= RTN_RTINFO; 653 } 654 655 return 0; 656 } 657 658 static __inline__ void fib6_start_gc(struct net *net, struct rt6_info *rt) 659 { 660 if (!timer_pending(&net->ipv6.ip6_fib_timer) && 661 (rt->rt6i_flags & (RTF_EXPIRES|RTF_CACHE))) 662 mod_timer(&net->ipv6.ip6_fib_timer, 663 jiffies + net->ipv6.sysctl.ip6_rt_gc_interval); 664 } 665 666 void fib6_force_start_gc(struct net *net) 667 { 668 if (!timer_pending(&net->ipv6.ip6_fib_timer)) 669 mod_timer(&net->ipv6.ip6_fib_timer, 670 jiffies + net->ipv6.sysctl.ip6_rt_gc_interval); 671 } 672 673 /* 674 * Add routing information to the routing tree. 675 * <destination addr>/<source addr> 676 * with source addr info in sub-trees 677 */ 678 679 int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info) 680 { 681 struct fib6_node *fn, *pn = NULL; 682 int err = -ENOMEM; 683 684 fn = fib6_add_1(root, &rt->rt6i_dst.addr, sizeof(struct in6_addr), 685 rt->rt6i_dst.plen, offsetof(struct rt6_info, rt6i_dst)); 686 687 if (fn == NULL) 688 goto out; 689 690 pn = fn; 691 692 #ifdef CONFIG_IPV6_SUBTREES 693 if (rt->rt6i_src.plen) { 694 struct fib6_node *sn; 695 696 if (fn->subtree == NULL) { 697 struct fib6_node *sfn; 698 699 /* 700 * Create subtree. 701 * 702 * fn[main tree] 703 * | 704 * sfn[subtree root] 705 * \ 706 * sn[new leaf node] 707 */ 708 709 /* Create subtree root node */ 710 sfn = node_alloc(); 711 if (sfn == NULL) 712 goto st_failure; 713 714 sfn->leaf = info->nl_net->ipv6.ip6_null_entry; 715 atomic_inc(&info->nl_net->ipv6.ip6_null_entry->rt6i_ref); 716 sfn->fn_flags = RTN_ROOT; 717 sfn->fn_sernum = fib6_new_sernum(); 718 719 /* Now add the first leaf node to new subtree */ 720 721 sn = fib6_add_1(sfn, &rt->rt6i_src.addr, 722 sizeof(struct in6_addr), rt->rt6i_src.plen, 723 offsetof(struct rt6_info, rt6i_src)); 724 725 if (sn == NULL) { 726 /* If it is failed, discard just allocated 727 root, and then (in st_failure) stale node 728 in main tree. 729 */ 730 node_free(sfn); 731 goto st_failure; 732 } 733 734 /* Now link new subtree to main tree */ 735 sfn->parent = fn; 736 fn->subtree = sfn; 737 } else { 738 sn = fib6_add_1(fn->subtree, &rt->rt6i_src.addr, 739 sizeof(struct in6_addr), rt->rt6i_src.plen, 740 offsetof(struct rt6_info, rt6i_src)); 741 742 if (sn == NULL) 743 goto st_failure; 744 } 745 746 if (fn->leaf == NULL) { 747 fn->leaf = rt; 748 atomic_inc(&rt->rt6i_ref); 749 } 750 fn = sn; 751 } 752 #endif 753 754 err = fib6_add_rt2node(fn, rt, info); 755 756 if (err == 0) { 757 fib6_start_gc(info->nl_net, rt); 758 if (!(rt->rt6i_flags&RTF_CACHE)) 759 fib6_prune_clones(info->nl_net, pn, rt); 760 } 761 762 out: 763 if (err) { 764 #ifdef CONFIG_IPV6_SUBTREES 765 /* 766 * If fib6_add_1 has cleared the old leaf pointer in the 767 * super-tree leaf node we have to find a new one for it. 768 */ 769 if (pn != fn && pn->leaf == rt) { 770 pn->leaf = NULL; 771 atomic_dec(&rt->rt6i_ref); 772 } 773 if (pn != fn && !pn->leaf && !(pn->fn_flags & RTN_RTINFO)) { 774 pn->leaf = fib6_find_prefix(info->nl_net, pn); 775 #if RT6_DEBUG >= 2 776 if (!pn->leaf) { 777 WARN_ON(pn->leaf == NULL); 778 pn->leaf = info->nl_net->ipv6.ip6_null_entry; 779 } 780 #endif 781 atomic_inc(&pn->leaf->rt6i_ref); 782 } 783 #endif 784 dst_free(&rt->u.dst); 785 } 786 return err; 787 788 #ifdef CONFIG_IPV6_SUBTREES 789 /* Subtree creation failed, probably main tree node 790 is orphan. If it is, shoot it. 791 */ 792 st_failure: 793 if (fn && !(fn->fn_flags & (RTN_RTINFO|RTN_ROOT))) 794 fib6_repair_tree(info->nl_net, fn); 795 dst_free(&rt->u.dst); 796 return err; 797 #endif 798 } 799 800 /* 801 * Routing tree lookup 802 * 803 */ 804 805 struct lookup_args { 806 int offset; /* key offset on rt6_info */ 807 struct in6_addr *addr; /* search key */ 808 }; 809 810 static struct fib6_node * fib6_lookup_1(struct fib6_node *root, 811 struct lookup_args *args) 812 { 813 struct fib6_node *fn; 814 __be32 dir; 815 816 if (unlikely(args->offset == 0)) 817 return NULL; 818 819 /* 820 * Descend on a tree 821 */ 822 823 fn = root; 824 825 for (;;) { 826 struct fib6_node *next; 827 828 dir = addr_bit_set(args->addr, fn->fn_bit); 829 830 next = dir ? fn->right : fn->left; 831 832 if (next) { 833 fn = next; 834 continue; 835 } 836 837 break; 838 } 839 840 while(fn) { 841 if (FIB6_SUBTREE(fn) || fn->fn_flags & RTN_RTINFO) { 842 struct rt6key *key; 843 844 key = (struct rt6key *) ((u8 *) fn->leaf + 845 args->offset); 846 847 if (ipv6_prefix_equal(&key->addr, args->addr, key->plen)) { 848 #ifdef CONFIG_IPV6_SUBTREES 849 if (fn->subtree) 850 fn = fib6_lookup_1(fn->subtree, args + 1); 851 #endif 852 if (!fn || fn->fn_flags & RTN_RTINFO) 853 return fn; 854 } 855 } 856 857 if (fn->fn_flags & RTN_ROOT) 858 break; 859 860 fn = fn->parent; 861 } 862 863 return NULL; 864 } 865 866 struct fib6_node * fib6_lookup(struct fib6_node *root, struct in6_addr *daddr, 867 struct in6_addr *saddr) 868 { 869 struct fib6_node *fn; 870 struct lookup_args args[] = { 871 { 872 .offset = offsetof(struct rt6_info, rt6i_dst), 873 .addr = daddr, 874 }, 875 #ifdef CONFIG_IPV6_SUBTREES 876 { 877 .offset = offsetof(struct rt6_info, rt6i_src), 878 .addr = saddr, 879 }, 880 #endif 881 { 882 .offset = 0, /* sentinel */ 883 } 884 }; 885 886 fn = fib6_lookup_1(root, daddr ? args : args + 1); 887 888 if (fn == NULL || fn->fn_flags & RTN_TL_ROOT) 889 fn = root; 890 891 return fn; 892 } 893 894 /* 895 * Get node with specified destination prefix (and source prefix, 896 * if subtrees are used) 897 */ 898 899 900 static struct fib6_node * fib6_locate_1(struct fib6_node *root, 901 struct in6_addr *addr, 902 int plen, int offset) 903 { 904 struct fib6_node *fn; 905 906 for (fn = root; fn ; ) { 907 struct rt6key *key = (struct rt6key *)((u8 *)fn->leaf + offset); 908 909 /* 910 * Prefix match 911 */ 912 if (plen < fn->fn_bit || 913 !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit)) 914 return NULL; 915 916 if (plen == fn->fn_bit) 917 return fn; 918 919 /* 920 * We have more bits to go 921 */ 922 if (addr_bit_set(addr, fn->fn_bit)) 923 fn = fn->right; 924 else 925 fn = fn->left; 926 } 927 return NULL; 928 } 929 930 struct fib6_node * fib6_locate(struct fib6_node *root, 931 struct in6_addr *daddr, int dst_len, 932 struct in6_addr *saddr, int src_len) 933 { 934 struct fib6_node *fn; 935 936 fn = fib6_locate_1(root, daddr, dst_len, 937 offsetof(struct rt6_info, rt6i_dst)); 938 939 #ifdef CONFIG_IPV6_SUBTREES 940 if (src_len) { 941 WARN_ON(saddr == NULL); 942 if (fn && fn->subtree) 943 fn = fib6_locate_1(fn->subtree, saddr, src_len, 944 offsetof(struct rt6_info, rt6i_src)); 945 } 946 #endif 947 948 if (fn && fn->fn_flags&RTN_RTINFO) 949 return fn; 950 951 return NULL; 952 } 953 954 955 /* 956 * Deletion 957 * 958 */ 959 960 static struct rt6_info *fib6_find_prefix(struct net *net, struct fib6_node *fn) 961 { 962 if (fn->fn_flags&RTN_ROOT) 963 return net->ipv6.ip6_null_entry; 964 965 while(fn) { 966 if(fn->left) 967 return fn->left->leaf; 968 969 if(fn->right) 970 return fn->right->leaf; 971 972 fn = FIB6_SUBTREE(fn); 973 } 974 return NULL; 975 } 976 977 /* 978 * Called to trim the tree of intermediate nodes when possible. "fn" 979 * is the node we want to try and remove. 980 */ 981 982 static struct fib6_node *fib6_repair_tree(struct net *net, 983 struct fib6_node *fn) 984 { 985 int children; 986 int nstate; 987 struct fib6_node *child, *pn; 988 struct fib6_walker_t *w; 989 int iter = 0; 990 991 for (;;) { 992 RT6_TRACE("fixing tree: plen=%d iter=%d\n", fn->fn_bit, iter); 993 iter++; 994 995 WARN_ON(fn->fn_flags & RTN_RTINFO); 996 WARN_ON(fn->fn_flags & RTN_TL_ROOT); 997 WARN_ON(fn->leaf != NULL); 998 999 children = 0; 1000 child = NULL; 1001 if (fn->right) child = fn->right, children |= 1; 1002 if (fn->left) child = fn->left, children |= 2; 1003 1004 if (children == 3 || FIB6_SUBTREE(fn) 1005 #ifdef CONFIG_IPV6_SUBTREES 1006 /* Subtree root (i.e. fn) may have one child */ 1007 || (children && fn->fn_flags&RTN_ROOT) 1008 #endif 1009 ) { 1010 fn->leaf = fib6_find_prefix(net, fn); 1011 #if RT6_DEBUG >= 2 1012 if (fn->leaf==NULL) { 1013 WARN_ON(!fn->leaf); 1014 fn->leaf = net->ipv6.ip6_null_entry; 1015 } 1016 #endif 1017 atomic_inc(&fn->leaf->rt6i_ref); 1018 return fn->parent; 1019 } 1020 1021 pn = fn->parent; 1022 #ifdef CONFIG_IPV6_SUBTREES 1023 if (FIB6_SUBTREE(pn) == fn) { 1024 WARN_ON(!(fn->fn_flags & RTN_ROOT)); 1025 FIB6_SUBTREE(pn) = NULL; 1026 nstate = FWS_L; 1027 } else { 1028 WARN_ON(fn->fn_flags & RTN_ROOT); 1029 #endif 1030 if (pn->right == fn) pn->right = child; 1031 else if (pn->left == fn) pn->left = child; 1032 #if RT6_DEBUG >= 2 1033 else 1034 WARN_ON(1); 1035 #endif 1036 if (child) 1037 child->parent = pn; 1038 nstate = FWS_R; 1039 #ifdef CONFIG_IPV6_SUBTREES 1040 } 1041 #endif 1042 1043 read_lock(&fib6_walker_lock); 1044 FOR_WALKERS(w) { 1045 if (child == NULL) { 1046 if (w->root == fn) { 1047 w->root = w->node = NULL; 1048 RT6_TRACE("W %p adjusted by delroot 1\n", w); 1049 } else if (w->node == fn) { 1050 RT6_TRACE("W %p adjusted by delnode 1, s=%d/%d\n", w, w->state, nstate); 1051 w->node = pn; 1052 w->state = nstate; 1053 } 1054 } else { 1055 if (w->root == fn) { 1056 w->root = child; 1057 RT6_TRACE("W %p adjusted by delroot 2\n", w); 1058 } 1059 if (w->node == fn) { 1060 w->node = child; 1061 if (children&2) { 1062 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); 1063 w->state = w->state>=FWS_R ? FWS_U : FWS_INIT; 1064 } else { 1065 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); 1066 w->state = w->state>=FWS_C ? FWS_U : FWS_INIT; 1067 } 1068 } 1069 } 1070 } 1071 read_unlock(&fib6_walker_lock); 1072 1073 node_free(fn); 1074 if (pn->fn_flags&RTN_RTINFO || FIB6_SUBTREE(pn)) 1075 return pn; 1076 1077 rt6_release(pn->leaf); 1078 pn->leaf = NULL; 1079 fn = pn; 1080 } 1081 } 1082 1083 static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, 1084 struct nl_info *info) 1085 { 1086 struct fib6_walker_t *w; 1087 struct rt6_info *rt = *rtp; 1088 struct net *net = info->nl_net; 1089 1090 RT6_TRACE("fib6_del_route\n"); 1091 1092 /* Unlink it */ 1093 *rtp = rt->u.dst.rt6_next; 1094 rt->rt6i_node = NULL; 1095 net->ipv6.rt6_stats->fib_rt_entries--; 1096 net->ipv6.rt6_stats->fib_discarded_routes++; 1097 1098 /* Reset round-robin state, if necessary */ 1099 if (fn->rr_ptr == rt) 1100 fn->rr_ptr = NULL; 1101 1102 /* Adjust walkers */ 1103 read_lock(&fib6_walker_lock); 1104 FOR_WALKERS(w) { 1105 if (w->state == FWS_C && w->leaf == rt) { 1106 RT6_TRACE("walker %p adjusted by delroute\n", w); 1107 w->leaf = rt->u.dst.rt6_next; 1108 if (w->leaf == NULL) 1109 w->state = FWS_U; 1110 } 1111 } 1112 read_unlock(&fib6_walker_lock); 1113 1114 rt->u.dst.rt6_next = NULL; 1115 1116 /* If it was last route, expunge its radix tree node */ 1117 if (fn->leaf == NULL) { 1118 fn->fn_flags &= ~RTN_RTINFO; 1119 net->ipv6.rt6_stats->fib_route_nodes--; 1120 fn = fib6_repair_tree(net, fn); 1121 } 1122 1123 if (atomic_read(&rt->rt6i_ref) != 1) { 1124 /* This route is used as dummy address holder in some split 1125 * nodes. It is not leaked, but it still holds other resources, 1126 * which must be released in time. So, scan ascendant nodes 1127 * and replace dummy references to this route with references 1128 * to still alive ones. 1129 */ 1130 while (fn) { 1131 if (!(fn->fn_flags&RTN_RTINFO) && fn->leaf == rt) { 1132 fn->leaf = fib6_find_prefix(net, fn); 1133 atomic_inc(&fn->leaf->rt6i_ref); 1134 rt6_release(rt); 1135 } 1136 fn = fn->parent; 1137 } 1138 /* No more references are possible at this point. */ 1139 BUG_ON(atomic_read(&rt->rt6i_ref) != 1); 1140 } 1141 1142 inet6_rt_notify(RTM_DELROUTE, rt, info); 1143 rt6_release(rt); 1144 } 1145 1146 int fib6_del(struct rt6_info *rt, struct nl_info *info) 1147 { 1148 struct net *net = info->nl_net; 1149 struct fib6_node *fn = rt->rt6i_node; 1150 struct rt6_info **rtp; 1151 1152 #if RT6_DEBUG >= 2 1153 if (rt->u.dst.obsolete>0) { 1154 WARN_ON(fn != NULL); 1155 return -ENOENT; 1156 } 1157 #endif 1158 if (fn == NULL || rt == net->ipv6.ip6_null_entry) 1159 return -ENOENT; 1160 1161 WARN_ON(!(fn->fn_flags & RTN_RTINFO)); 1162 1163 if (!(rt->rt6i_flags&RTF_CACHE)) { 1164 struct fib6_node *pn = fn; 1165 #ifdef CONFIG_IPV6_SUBTREES 1166 /* clones of this route might be in another subtree */ 1167 if (rt->rt6i_src.plen) { 1168 while (!(pn->fn_flags&RTN_ROOT)) 1169 pn = pn->parent; 1170 pn = pn->parent; 1171 } 1172 #endif 1173 fib6_prune_clones(info->nl_net, pn, rt); 1174 } 1175 1176 /* 1177 * Walk the leaf entries looking for ourself 1178 */ 1179 1180 for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.dst.rt6_next) { 1181 if (*rtp == rt) { 1182 fib6_del_route(fn, rtp, info); 1183 return 0; 1184 } 1185 } 1186 return -ENOENT; 1187 } 1188 1189 /* 1190 * Tree traversal function. 1191 * 1192 * Certainly, it is not interrupt safe. 1193 * However, it is internally reenterable wrt itself and fib6_add/fib6_del. 1194 * It means, that we can modify tree during walking 1195 * and use this function for garbage collection, clone pruning, 1196 * cleaning tree when a device goes down etc. etc. 1197 * 1198 * It guarantees that every node will be traversed, 1199 * and that it will be traversed only once. 1200 * 1201 * Callback function w->func may return: 1202 * 0 -> continue walking. 1203 * positive value -> walking is suspended (used by tree dumps, 1204 * and probably by gc, if it will be split to several slices) 1205 * negative value -> terminate walking. 1206 * 1207 * The function itself returns: 1208 * 0 -> walk is complete. 1209 * >0 -> walk is incomplete (i.e. suspended) 1210 * <0 -> walk is terminated by an error. 1211 */ 1212 1213 static int fib6_walk_continue(struct fib6_walker_t *w) 1214 { 1215 struct fib6_node *fn, *pn; 1216 1217 for (;;) { 1218 fn = w->node; 1219 if (fn == NULL) 1220 return 0; 1221 1222 if (w->prune && fn != w->root && 1223 fn->fn_flags&RTN_RTINFO && w->state < FWS_C) { 1224 w->state = FWS_C; 1225 w->leaf = fn->leaf; 1226 } 1227 switch (w->state) { 1228 #ifdef CONFIG_IPV6_SUBTREES 1229 case FWS_S: 1230 if (FIB6_SUBTREE(fn)) { 1231 w->node = FIB6_SUBTREE(fn); 1232 continue; 1233 } 1234 w->state = FWS_L; 1235 #endif 1236 case FWS_L: 1237 if (fn->left) { 1238 w->node = fn->left; 1239 w->state = FWS_INIT; 1240 continue; 1241 } 1242 w->state = FWS_R; 1243 case FWS_R: 1244 if (fn->right) { 1245 w->node = fn->right; 1246 w->state = FWS_INIT; 1247 continue; 1248 } 1249 w->state = FWS_C; 1250 w->leaf = fn->leaf; 1251 case FWS_C: 1252 if (w->leaf && fn->fn_flags&RTN_RTINFO) { 1253 int err = w->func(w); 1254 if (err) 1255 return err; 1256 continue; 1257 } 1258 w->state = FWS_U; 1259 case FWS_U: 1260 if (fn == w->root) 1261 return 0; 1262 pn = fn->parent; 1263 w->node = pn; 1264 #ifdef CONFIG_IPV6_SUBTREES 1265 if (FIB6_SUBTREE(pn) == fn) { 1266 WARN_ON(!(fn->fn_flags & RTN_ROOT)); 1267 w->state = FWS_L; 1268 continue; 1269 } 1270 #endif 1271 if (pn->left == fn) { 1272 w->state = FWS_R; 1273 continue; 1274 } 1275 if (pn->right == fn) { 1276 w->state = FWS_C; 1277 w->leaf = w->node->leaf; 1278 continue; 1279 } 1280 #if RT6_DEBUG >= 2 1281 WARN_ON(1); 1282 #endif 1283 } 1284 } 1285 } 1286 1287 static int fib6_walk(struct fib6_walker_t *w) 1288 { 1289 int res; 1290 1291 w->state = FWS_INIT; 1292 w->node = w->root; 1293 1294 fib6_walker_link(w); 1295 res = fib6_walk_continue(w); 1296 if (res <= 0) 1297 fib6_walker_unlink(w); 1298 return res; 1299 } 1300 1301 static int fib6_clean_node(struct fib6_walker_t *w) 1302 { 1303 int res; 1304 struct rt6_info *rt; 1305 struct fib6_cleaner_t *c = container_of(w, struct fib6_cleaner_t, w); 1306 struct nl_info info = { 1307 .nl_net = c->net, 1308 }; 1309 1310 for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) { 1311 res = c->func(rt, c->arg); 1312 if (res < 0) { 1313 w->leaf = rt; 1314 res = fib6_del(rt, &info); 1315 if (res) { 1316 #if RT6_DEBUG >= 2 1317 printk(KERN_DEBUG "fib6_clean_node: del failed: rt=%p@%p err=%d\n", rt, rt->rt6i_node, res); 1318 #endif 1319 continue; 1320 } 1321 return 0; 1322 } 1323 WARN_ON(res != 0); 1324 } 1325 w->leaf = rt; 1326 return 0; 1327 } 1328 1329 /* 1330 * Convenient frontend to tree walker. 1331 * 1332 * func is called on each route. 1333 * It may return -1 -> delete this route. 1334 * 0 -> continue walking 1335 * 1336 * prune==1 -> only immediate children of node (certainly, 1337 * ignoring pure split nodes) will be scanned. 1338 */ 1339 1340 static void fib6_clean_tree(struct net *net, struct fib6_node *root, 1341 int (*func)(struct rt6_info *, void *arg), 1342 int prune, void *arg) 1343 { 1344 struct fib6_cleaner_t c; 1345 1346 c.w.root = root; 1347 c.w.func = fib6_clean_node; 1348 c.w.prune = prune; 1349 c.func = func; 1350 c.arg = arg; 1351 c.net = net; 1352 1353 fib6_walk(&c.w); 1354 } 1355 1356 void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), 1357 int prune, void *arg) 1358 { 1359 struct fib6_table *table; 1360 struct hlist_node *node; 1361 struct hlist_head *head; 1362 unsigned int h; 1363 1364 rcu_read_lock(); 1365 for (h = 0; h < FIB6_TABLE_HASHSZ; h++) { 1366 head = &net->ipv6.fib_table_hash[h]; 1367 hlist_for_each_entry_rcu(table, node, head, tb6_hlist) { 1368 write_lock_bh(&table->tb6_lock); 1369 fib6_clean_tree(net, &table->tb6_root, 1370 func, prune, arg); 1371 write_unlock_bh(&table->tb6_lock); 1372 } 1373 } 1374 rcu_read_unlock(); 1375 } 1376 1377 static int fib6_prune_clone(struct rt6_info *rt, void *arg) 1378 { 1379 if (rt->rt6i_flags & RTF_CACHE) { 1380 RT6_TRACE("pruning clone %p\n", rt); 1381 return -1; 1382 } 1383 1384 return 0; 1385 } 1386 1387 static void fib6_prune_clones(struct net *net, struct fib6_node *fn, 1388 struct rt6_info *rt) 1389 { 1390 fib6_clean_tree(net, fn, fib6_prune_clone, 1, rt); 1391 } 1392 1393 /* 1394 * Garbage collection 1395 */ 1396 1397 static struct fib6_gc_args 1398 { 1399 int timeout; 1400 int more; 1401 } gc_args; 1402 1403 static int fib6_age(struct rt6_info *rt, void *arg) 1404 { 1405 unsigned long now = jiffies; 1406 1407 /* 1408 * check addrconf expiration here. 1409 * Routes are expired even if they are in use. 1410 * 1411 * Also age clones. Note, that clones are aged out 1412 * only if they are not in use now. 1413 */ 1414 1415 if (rt->rt6i_flags&RTF_EXPIRES && rt->rt6i_expires) { 1416 if (time_after(now, rt->rt6i_expires)) { 1417 RT6_TRACE("expiring %p\n", rt); 1418 return -1; 1419 } 1420 gc_args.more++; 1421 } else if (rt->rt6i_flags & RTF_CACHE) { 1422 if (atomic_read(&rt->u.dst.__refcnt) == 0 && 1423 time_after_eq(now, rt->u.dst.lastuse + gc_args.timeout)) { 1424 RT6_TRACE("aging clone %p\n", rt); 1425 return -1; 1426 } else if ((rt->rt6i_flags & RTF_GATEWAY) && 1427 (!(rt->rt6i_nexthop->flags & NTF_ROUTER))) { 1428 RT6_TRACE("purging route %p via non-router but gateway\n", 1429 rt); 1430 return -1; 1431 } 1432 gc_args.more++; 1433 } 1434 1435 return 0; 1436 } 1437 1438 static DEFINE_SPINLOCK(fib6_gc_lock); 1439 1440 void fib6_run_gc(unsigned long expires, struct net *net) 1441 { 1442 if (expires != ~0UL) { 1443 spin_lock_bh(&fib6_gc_lock); 1444 gc_args.timeout = expires ? (int)expires : 1445 net->ipv6.sysctl.ip6_rt_gc_interval; 1446 } else { 1447 if (!spin_trylock_bh(&fib6_gc_lock)) { 1448 mod_timer(&net->ipv6.ip6_fib_timer, jiffies + HZ); 1449 return; 1450 } 1451 gc_args.timeout = net->ipv6.sysctl.ip6_rt_gc_interval; 1452 } 1453 1454 gc_args.more = icmp6_dst_gc(); 1455 1456 fib6_clean_all(net, fib6_age, 0, NULL); 1457 1458 if (gc_args.more) 1459 mod_timer(&net->ipv6.ip6_fib_timer, 1460 round_jiffies(jiffies 1461 + net->ipv6.sysctl.ip6_rt_gc_interval)); 1462 else 1463 del_timer(&net->ipv6.ip6_fib_timer); 1464 spin_unlock_bh(&fib6_gc_lock); 1465 } 1466 1467 static void fib6_gc_timer_cb(unsigned long arg) 1468 { 1469 fib6_run_gc(0, (struct net *)arg); 1470 } 1471 1472 static int fib6_net_init(struct net *net) 1473 { 1474 setup_timer(&net->ipv6.ip6_fib_timer, fib6_gc_timer_cb, (unsigned long)net); 1475 1476 net->ipv6.rt6_stats = kzalloc(sizeof(*net->ipv6.rt6_stats), GFP_KERNEL); 1477 if (!net->ipv6.rt6_stats) 1478 goto out_timer; 1479 1480 net->ipv6.fib_table_hash = kcalloc(FIB6_TABLE_HASHSZ, 1481 sizeof(*net->ipv6.fib_table_hash), 1482 GFP_KERNEL); 1483 if (!net->ipv6.fib_table_hash) 1484 goto out_rt6_stats; 1485 1486 net->ipv6.fib6_main_tbl = kzalloc(sizeof(*net->ipv6.fib6_main_tbl), 1487 GFP_KERNEL); 1488 if (!net->ipv6.fib6_main_tbl) 1489 goto out_fib_table_hash; 1490 1491 net->ipv6.fib6_main_tbl->tb6_id = RT6_TABLE_MAIN; 1492 net->ipv6.fib6_main_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry; 1493 net->ipv6.fib6_main_tbl->tb6_root.fn_flags = 1494 RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; 1495 1496 #ifdef CONFIG_IPV6_MULTIPLE_TABLES 1497 net->ipv6.fib6_local_tbl = kzalloc(sizeof(*net->ipv6.fib6_local_tbl), 1498 GFP_KERNEL); 1499 if (!net->ipv6.fib6_local_tbl) 1500 goto out_fib6_main_tbl; 1501 net->ipv6.fib6_local_tbl->tb6_id = RT6_TABLE_LOCAL; 1502 net->ipv6.fib6_local_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry; 1503 net->ipv6.fib6_local_tbl->tb6_root.fn_flags = 1504 RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; 1505 #endif 1506 fib6_tables_init(net); 1507 1508 return 0; 1509 1510 #ifdef CONFIG_IPV6_MULTIPLE_TABLES 1511 out_fib6_main_tbl: 1512 kfree(net->ipv6.fib6_main_tbl); 1513 #endif 1514 out_fib_table_hash: 1515 kfree(net->ipv6.fib_table_hash); 1516 out_rt6_stats: 1517 kfree(net->ipv6.rt6_stats); 1518 out_timer: 1519 return -ENOMEM; 1520 } 1521 1522 static void fib6_net_exit(struct net *net) 1523 { 1524 rt6_ifdown(net, NULL); 1525 del_timer_sync(&net->ipv6.ip6_fib_timer); 1526 1527 #ifdef CONFIG_IPV6_MULTIPLE_TABLES 1528 kfree(net->ipv6.fib6_local_tbl); 1529 #endif 1530 kfree(net->ipv6.fib6_main_tbl); 1531 kfree(net->ipv6.fib_table_hash); 1532 kfree(net->ipv6.rt6_stats); 1533 } 1534 1535 static struct pernet_operations fib6_net_ops = { 1536 .init = fib6_net_init, 1537 .exit = fib6_net_exit, 1538 }; 1539 1540 int __init fib6_init(void) 1541 { 1542 int ret = -ENOMEM; 1543 1544 fib6_node_kmem = kmem_cache_create("fib6_nodes", 1545 sizeof(struct fib6_node), 1546 0, SLAB_HWCACHE_ALIGN, 1547 NULL); 1548 if (!fib6_node_kmem) 1549 goto out; 1550 1551 ret = register_pernet_subsys(&fib6_net_ops); 1552 if (ret) 1553 goto out_kmem_cache_create; 1554 1555 ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib); 1556 if (ret) 1557 goto out_unregister_subsys; 1558 out: 1559 return ret; 1560 1561 out_unregister_subsys: 1562 unregister_pernet_subsys(&fib6_net_ops); 1563 out_kmem_cache_create: 1564 kmem_cache_destroy(fib6_node_kmem); 1565 goto out; 1566 } 1567 1568 void fib6_gc_cleanup(void) 1569 { 1570 unregister_pernet_subsys(&fib6_net_ops); 1571 kmem_cache_destroy(fib6_node_kmem); 1572 } 1573