LCOV - code coverage report
Current view: top level - net/ipv4 - fib_trie.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 378 1175 32.2 %
Date: 2022-04-01 14:35:51 Functions: 19 56 33.9 %
Branches: 179 824 21.7 %

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

Generated by: LCOV version 1.14