Lines Matching full:fn

59 					 struct fib6_node *fn);
62 struct fib6_node *fn);
109 struct fib6_node *fn; in fib6_update_sernum() local
111 fn = rcu_dereference_protected(f6i->fib6_node, in fib6_update_sernum()
113 if (fn) in fib6_update_sernum()
114 WRITE_ONCE(fn->fn_sernum, fib6_new_sernum(net)); in fib6_update_sernum()
186 struct fib6_node *fn; in node_alloc() local
188 fn = kmem_cache_zalloc(fib6_node_kmem, GFP_ATOMIC); in node_alloc()
189 if (fn) in node_alloc()
192 return fn; in node_alloc()
195 static void node_free_immediate(struct net *net, struct fib6_node *fn) in node_free_immediate() argument
197 kmem_cache_free(fib6_node_kmem, fn); in node_free_immediate()
201 static void node_free(struct net *net, struct fib6_node *fn) in node_free() argument
203 kfree_rcu(fn, rcu); in node_free()
770 struct fib6_node *fn, *in, *ln; in fib6_add_1() local
778 fn = root; in fib6_add_1()
781 struct fib6_info *leaf = rcu_dereference_protected(fn->leaf, in fib6_add_1()
788 if (plen < fn->fn_bit || in fib6_add_1()
789 !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit)) { in fib6_add_1()
806 if (plen == fn->fn_bit) { in fib6_add_1()
808 if (!(fn->fn_flags & RTN_RTINFO)) { in fib6_add_1()
809 RCU_INIT_POINTER(fn->leaf, NULL); in fib6_add_1()
812 } else if (fn->fn_flags & RTN_TL_ROOT && in fib6_add_1()
813 rcu_access_pointer(fn->leaf) == in fib6_add_1()
815 RCU_INIT_POINTER(fn->leaf, NULL); in fib6_add_1()
818 return fn; in fib6_add_1()
826 dir = addr_bit_set(addr, fn->fn_bit); in fib6_add_1()
827 pn = fn; in fib6_add_1()
828 fn = dir ? in fib6_add_1()
829 rcu_dereference_protected(fn->right, in fib6_add_1()
831 rcu_dereference_protected(fn->left, in fib6_add_1()
833 } while (fn); in fib6_add_1()
882 pn = rcu_dereference_protected(fn->parent, in fib6_add_1()
896 * (new leaf node)[ln] (old node)[fn] in fib6_add_1()
921 in->leaf = fn->leaf; in fib6_add_1()
934 rcu_assign_pointer(fn->parent, in); in fib6_add_1()
938 rcu_assign_pointer(in->left, fn); in fib6_add_1()
941 rcu_assign_pointer(in->right, fn); in fib6_add_1()
948 * (old node)[fn] NULL in fib6_add_1()
961 RCU_INIT_POINTER(ln->right, fn); in fib6_add_1()
963 RCU_INIT_POINTER(ln->left, fn); in fib6_add_1()
965 rcu_assign_pointer(fn->parent, ln); in fib6_add_1()
1039 static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn, in fib6_purge_rt() argument
1064 while (fn) { in fib6_purge_rt()
1065 struct fib6_info *leaf = rcu_dereference_protected(fn->leaf, in fib6_purge_rt()
1068 if (!(fn->fn_flags & RTN_RTINFO) && leaf == rt) { in fib6_purge_rt()
1069 new_leaf = fib6_find_prefix(net, table, fn); in fib6_purge_rt()
1072 rcu_assign_pointer(fn->leaf, new_leaf); in fib6_purge_rt()
1075 fn = rcu_dereference_protected(fn->parent, in fib6_purge_rt()
1088 static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, in fib6_add_rt2node() argument
1092 struct fib6_info *leaf = rcu_dereference_protected(fn->leaf, in fib6_add_rt2node()
1110 ins = &fn->leaf; in fib6_add_rt2node()
1195 if (ins == &fn->leaf) in fib6_add_rt2node()
1196 fn->rr_ptr = NULL; in fib6_add_rt2node()
1250 (notify_sibling_rt || ins == &fn->leaf)) { in fib6_add_rt2node()
1285 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1291 if (!(fn->fn_flags & RTN_RTINFO)) { in fib6_add_rt2node()
1293 fn->fn_flags |= RTN_RTINFO; in fib6_add_rt2node()
1306 if (!info->skip_notify_kernel && ins == &fn->leaf) { in fib6_add_rt2node()
1315 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1320 if (!(fn->fn_flags & RTN_RTINFO)) { in fib6_add_rt2node()
1322 fn->fn_flags |= RTN_RTINFO; in fib6_add_rt2node()
1327 if (rcu_access_pointer(fn->rr_ptr) == iter) in fib6_add_rt2node()
1328 fn->rr_ptr = NULL; in fib6_add_rt2node()
1342 if (rcu_access_pointer(fn->rr_ptr) == iter) in fib6_add_rt2node()
1343 fn->rr_ptr = NULL; in fib6_add_rt2node()
1359 static int fib6_add_rt2node_nh(struct fib6_node *fn, struct fib6_info *rt, in fib6_add_rt2node_nh() argument
1371 err = fib6_add_rt2node(fn, rt, info, extack, purge_list); in fib6_add_rt2node_nh()
1399 struct fib6_node *fn = rcu_dereference_protected(rt->fib6_node, in __fib6_update_sernum_upto_root() local
1404 while (fn) { in __fib6_update_sernum_upto_root()
1405 WRITE_ONCE(fn->fn_sernum, sernum); in __fib6_update_sernum_upto_root()
1406 fn = rcu_dereference_protected(fn->parent, in __fib6_update_sernum_upto_root()
1436 struct fib6_node *fn; in fib6_add() local
1453 fn = fib6_add_1(info->nl_net, table, root, in fib6_add()
1457 if (IS_ERR(fn)) { in fib6_add()
1458 err = PTR_ERR(fn); in fib6_add()
1459 fn = NULL; in fib6_add()
1464 pn = fn; in fib6_add()
1469 if (!rcu_access_pointer(fn->subtree)) { in fib6_add()
1475 * fn[main tree] in fib6_add()
1510 rcu_assign_pointer(sfn->parent, fn); in fib6_add()
1511 rcu_assign_pointer(fn->subtree, sfn); in fib6_add()
1513 sn = fib6_add_1(info->nl_net, table, FIB6_SUBTREE(fn), in fib6_add()
1524 if (!rcu_access_pointer(fn->leaf)) { in fib6_add()
1525 if (fn->fn_flags & RTN_TL_ROOT) { in fib6_add()
1527 rcu_assign_pointer(fn->leaf, in fib6_add()
1531 rcu_assign_pointer(fn->leaf, rt); in fib6_add()
1534 fn = sn; in fib6_add()
1539 err = fib6_add_rt2node_nh(fn, rt, info, extack, &purge_list); in fib6_add()
1541 err = fib6_add_rt2node(fn, rt, info, extack, &purge_list); in fib6_add()
1547 fib6_purge_rt(iter, fn, info->nl_net); in fib6_add()
1566 if (pn != fn) { in fib6_add()
1593 /* fn->leaf could be NULL and fib6_repair_tree() needs to be called if: in fib6_add()
1594 * 1. fn is an intermediate node and we failed to add the new in fib6_add()
1597 * 2. fn is the root node in the table and we fail to add the first in fib6_add()
1600 if (fn && in fib6_add()
1601 (!(fn->fn_flags & (RTN_RTINFO|RTN_ROOT)) || in fib6_add()
1602 (fn->fn_flags & RTN_TL_ROOT && in fib6_add()
1603 !rcu_access_pointer(fn->leaf)))) in fib6_add()
1604 fib6_repair_tree(info->nl_net, table, fn); in fib6_add()
1621 struct fib6_node *fn; in fib6_node_lookup_1() local
1631 fn = root; in fib6_node_lookup_1()
1636 dir = addr_bit_set(args->addr, fn->fn_bit); in fib6_node_lookup_1()
1638 next = dir ? rcu_dereference(fn->right) : in fib6_node_lookup_1()
1639 rcu_dereference(fn->left); in fib6_node_lookup_1()
1642 fn = next; in fib6_node_lookup_1()
1648 while (fn) { in fib6_node_lookup_1()
1649 struct fib6_node *subtree = FIB6_SUBTREE(fn); in fib6_node_lookup_1()
1651 if (subtree || fn->fn_flags & RTN_RTINFO) { in fib6_node_lookup_1()
1652 struct fib6_info *leaf = rcu_dereference(fn->leaf); in fib6_node_lookup_1()
1668 fn = sfn; in fib6_node_lookup_1()
1671 if (fn->fn_flags & RTN_RTINFO) in fib6_node_lookup_1()
1672 return fn; in fib6_node_lookup_1()
1676 if (fn->fn_flags & RTN_ROOT) in fib6_node_lookup_1()
1679 fn = rcu_dereference(fn->parent); in fib6_node_lookup_1()
1691 struct fib6_node *fn; in fib6_node_lookup() local
1708 fn = fib6_node_lookup_1(root, daddr ? args : args + 1); in fib6_node_lookup()
1709 if (!fn || fn->fn_flags & RTN_TL_ROOT) in fib6_node_lookup()
1710 fn = root; in fib6_node_lookup()
1712 return fn; in fib6_node_lookup()
1718 * exact_match == true means we try to find fn with exact match of
1720 * exact_match == false means we try to find fn with longest prefix
1721 * match of the passed in prefix addr. This is useful for finding fn
1732 struct fib6_node *fn, *prev = NULL; in fib6_locate_1() local
1734 for (fn = root; fn ; ) { in fib6_locate_1()
1735 struct fib6_info *leaf = rcu_dereference(fn->leaf); in fib6_locate_1()
1740 if (plen <= fn->fn_bit) in fib6_locate_1()
1751 if (plen < fn->fn_bit || in fib6_locate_1()
1752 !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit)) in fib6_locate_1()
1755 if (plen == fn->fn_bit) in fib6_locate_1()
1756 return fn; in fib6_locate_1()
1758 if (fn->fn_flags & RTN_RTINFO) in fib6_locate_1()
1759 prev = fn; in fib6_locate_1()
1765 if (addr_bit_set(addr, fn->fn_bit)) in fib6_locate_1()
1766 fn = rcu_dereference(fn->right); in fib6_locate_1()
1768 fn = rcu_dereference(fn->left); in fib6_locate_1()
1782 struct fib6_node *fn; in fib6_locate() local
1784 fn = fib6_locate_1(root, daddr, dst_len, in fib6_locate()
1791 if (fn) { in fib6_locate()
1792 struct fib6_node *subtree = FIB6_SUBTREE(fn); in fib6_locate()
1795 fn = fib6_locate_1(subtree, saddr, src_len, in fib6_locate()
1803 if (fn && fn->fn_flags & RTN_RTINFO) in fib6_locate()
1804 return fn; in fib6_locate()
1817 struct fib6_node *fn) in fib6_find_prefix() argument
1821 if (fn->fn_flags & RTN_ROOT) in fib6_find_prefix()
1824 while (fn) { in fib6_find_prefix()
1825 child_left = rcu_dereference_protected(fn->left, in fib6_find_prefix()
1827 child_right = rcu_dereference_protected(fn->right, in fib6_find_prefix()
1836 fn = FIB6_SUBTREE(fn); in fib6_find_prefix()
1842 * Called to trim the tree of intermediate nodes when possible. "fn"
1849 struct fib6_node *fn) in fib6_repair_tree() argument
1857 /* Set fn->leaf to null_entry for root node. */ in fib6_repair_tree()
1858 if (fn->fn_flags & RTN_TL_ROOT) { in fib6_repair_tree()
1859 rcu_assign_pointer(fn->leaf, net->ipv6.fib6_null_entry); in fib6_repair_tree()
1860 return fn; in fib6_repair_tree()
1864 struct fib6_node *fn_r = rcu_dereference_protected(fn->right, in fib6_repair_tree()
1866 struct fib6_node *fn_l = rcu_dereference_protected(fn->left, in fib6_repair_tree()
1868 struct fib6_node *pn = rcu_dereference_protected(fn->parent, in fib6_repair_tree()
1874 struct fib6_info *fn_leaf = rcu_dereference_protected(fn->leaf, in fib6_repair_tree()
1880 pr_debug("fixing tree: plen=%d iter=%d\n", fn->fn_bit, iter); in fib6_repair_tree()
1883 WARN_ON(fn->fn_flags & RTN_RTINFO); in fib6_repair_tree()
1884 WARN_ON(fn->fn_flags & RTN_TL_ROOT); in fib6_repair_tree()
1898 if (children == 3 || FIB6_SUBTREE(fn) in fib6_repair_tree()
1900 /* Subtree root (i.e. fn) may have one child */ in fib6_repair_tree()
1901 || (children && fn->fn_flags & RTN_ROOT) in fib6_repair_tree()
1904 new_fn_leaf = fib6_find_prefix(net, table, fn); in fib6_repair_tree()
1912 rcu_assign_pointer(fn->leaf, new_fn_leaf); in fib6_repair_tree()
1917 if (FIB6_SUBTREE(pn) == fn) { in fib6_repair_tree()
1918 WARN_ON(!(fn->fn_flags & RTN_ROOT)); in fib6_repair_tree()
1922 WARN_ON(fn->fn_flags & RTN_ROOT); in fib6_repair_tree()
1924 if (pn_r == fn) in fib6_repair_tree()
1926 else if (pn_l == fn) in fib6_repair_tree()
1942 if (w->node == fn) { in fib6_repair_tree()
1949 if (w->node == fn) { in fib6_repair_tree()
1965 node_free(net, fn); in fib6_repair_tree()
1971 fn = pn; in fib6_repair_tree()
1975 static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, in fib6_del_route() argument
1989 leaf = rcu_dereference_protected(fn->leaf, in fib6_del_route()
2006 if (rcu_access_pointer(fn->rr_ptr) == rt) in fib6_del_route()
2007 fn->rr_ptr = NULL; in fib6_del_route()
2047 if (!rcu_access_pointer(fn->leaf)) { in fib6_del_route()
2048 if (!(fn->fn_flags & RTN_TL_ROOT)) { in fib6_del_route()
2049 fn->fn_flags &= ~RTN_RTINFO; in fib6_del_route()
2052 fn = fib6_repair_tree(net, table, fn); in fib6_del_route()
2055 fib6_purge_rt(rt, fn, net); in fib6_del_route()
2077 struct fib6_node *fn; in fib6_del() local
2083 fn = rcu_dereference_protected(rt->fib6_node, in fib6_del()
2085 if (!fn) in fib6_del()
2088 WARN_ON(!(fn->fn_flags & RTN_RTINFO)); in fib6_del()
2094 for (rtp = &fn->leaf; *rtp; rtp = rtp_next) { in fib6_del()
2100 fib6_del_route(table, fn, rtp, info); in fib6_del()
2136 struct fib6_node *fn, *pn, *left, *right; in fib6_walk_continue() local
2142 fn = w->node; in fib6_walk_continue()
2143 if (!fn) in fib6_walk_continue()
2149 if (FIB6_SUBTREE(fn)) { in fib6_walk_continue()
2150 w->node = FIB6_SUBTREE(fn); in fib6_walk_continue()
2157 left = rcu_dereference_protected(fn->left, 1); in fib6_walk_continue()
2166 right = rcu_dereference_protected(fn->right, 1); in fib6_walk_continue()
2173 w->leaf = rcu_dereference_protected(fn->leaf, 1); in fib6_walk_continue()
2176 if (w->leaf && fn->fn_flags & RTN_RTINFO) { in fib6_walk_continue()
2195 if (fn == w->root) in fib6_walk_continue()
2197 pn = rcu_dereference_protected(fn->parent, 1); in fib6_walk_continue()
2202 if (FIB6_SUBTREE(pn) == fn) { in fib6_walk_continue()
2203 WARN_ON(!(fn->fn_flags & RTN_ROOT)); in fib6_walk_continue()
2208 if (left == fn) { in fib6_walk_continue()
2212 if (right == fn) { in fib6_walk_continue()