LCOV - code coverage report
Current view: top level - include/net - ip6_fib.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 27 57 47.4 %
Date: 2022-04-01 13:59:58 Functions: 1 1 100.0 %
Branches: 11 94 11.7 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2                 :            : /*
       3                 :            :  *      Linux INET6 implementation 
       4                 :            :  *
       5                 :            :  *      Authors:
       6                 :            :  *      Pedro Roque             <roque@di.fc.ul.pt>       
       7                 :            :  */
       8                 :            : 
       9                 :            : #ifndef _IP6_FIB_H
      10                 :            : #define _IP6_FIB_H
      11                 :            : 
      12                 :            : #include <linux/ipv6_route.h>
      13                 :            : #include <linux/rtnetlink.h>
      14                 :            : #include <linux/spinlock.h>
      15                 :            : #include <linux/notifier.h>
      16                 :            : #include <net/dst.h>
      17                 :            : #include <net/flow.h>
      18                 :            : #include <net/ip_fib.h>
      19                 :            : #include <net/netlink.h>
      20                 :            : #include <net/inetpeer.h>
      21                 :            : #include <net/fib_notifier.h>
      22                 :            : 
      23                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
      24                 :            : #define FIB6_TABLE_HASHSZ 256
      25                 :            : #else
      26                 :            : #define FIB6_TABLE_HASHSZ 1
      27                 :            : #endif
      28                 :            : 
      29                 :            : #define RT6_DEBUG 2
      30                 :            : 
      31                 :            : #if RT6_DEBUG >= 3
      32                 :            : #define RT6_TRACE(x...) pr_debug(x)
      33                 :            : #else
      34                 :            : #define RT6_TRACE(x...) do { ; } while (0)
      35                 :            : #endif
      36                 :            : 
      37                 :            : struct rt6_info;
      38                 :            : struct fib6_info;
      39                 :            : 
      40                 :            : struct fib6_config {
      41                 :            :         u32             fc_table;
      42                 :            :         u32             fc_metric;
      43                 :            :         int             fc_dst_len;
      44                 :            :         int             fc_src_len;
      45                 :            :         int             fc_ifindex;
      46                 :            :         u32             fc_flags;
      47                 :            :         u32             fc_protocol;
      48                 :            :         u16             fc_type;        /* only 8 bits are used */
      49                 :            :         u16             fc_delete_all_nh : 1,
      50                 :            :                         fc_ignore_dev_down:1,
      51                 :            :                         __unused : 14;
      52                 :            :         u32             fc_nh_id;
      53                 :            : 
      54                 :            :         struct in6_addr fc_dst;
      55                 :            :         struct in6_addr fc_src;
      56                 :            :         struct in6_addr fc_prefsrc;
      57                 :            :         struct in6_addr fc_gateway;
      58                 :            : 
      59                 :            :         unsigned long   fc_expires;
      60                 :            :         struct nlattr   *fc_mx;
      61                 :            :         int             fc_mx_len;
      62                 :            :         int             fc_mp_len;
      63                 :            :         struct nlattr   *fc_mp;
      64                 :            : 
      65                 :            :         struct nl_info  fc_nlinfo;
      66                 :            :         struct nlattr   *fc_encap;
      67                 :            :         u16             fc_encap_type;
      68                 :            : };
      69                 :            : 
      70                 :            : struct fib6_node {
      71                 :            :         struct fib6_node __rcu  *parent;
      72                 :            :         struct fib6_node __rcu  *left;
      73                 :            :         struct fib6_node __rcu  *right;
      74                 :            : #ifdef CONFIG_IPV6_SUBTREES
      75                 :            :         struct fib6_node __rcu  *subtree;
      76                 :            : #endif
      77                 :            :         struct fib6_info __rcu  *leaf;
      78                 :            : 
      79                 :            :         __u16                   fn_bit;         /* bit key */
      80                 :            :         __u16                   fn_flags;
      81                 :            :         int                     fn_sernum;
      82                 :            :         struct fib6_info __rcu  *rr_ptr;
      83                 :            :         struct rcu_head         rcu;
      84                 :            : };
      85                 :            : 
      86                 :            : struct fib6_gc_args {
      87                 :            :         int                     timeout;
      88                 :            :         int                     more;
      89                 :            : };
      90                 :            : 
      91                 :            : #ifndef CONFIG_IPV6_SUBTREES
      92                 :            : #define FIB6_SUBTREE(fn)        NULL
      93                 :            : 
      94                 :            : static inline bool fib6_routes_require_src(const struct net *net)
      95                 :            : {
      96                 :            :         return false;
      97                 :            : }
      98                 :            : 
      99                 :            : static inline void fib6_routes_require_src_inc(struct net *net) {}
     100                 :            : static inline void fib6_routes_require_src_dec(struct net *net) {}
     101                 :            : 
     102                 :            : #else
     103                 :            : 
     104                 :            : static inline bool fib6_routes_require_src(const struct net *net)
     105                 :            : {
     106                 :            :         return net->ipv6.fib6_routes_require_src > 0;
     107                 :            : }
     108                 :            : 
     109                 :            : static inline void fib6_routes_require_src_inc(struct net *net)
     110                 :            : {
     111                 :            :         net->ipv6.fib6_routes_require_src++;
     112                 :            : }
     113                 :            : 
     114                 :            : static inline void fib6_routes_require_src_dec(struct net *net)
     115                 :            : {
     116                 :            :         net->ipv6.fib6_routes_require_src--;
     117                 :            : }
     118                 :            : 
     119                 :            : #define FIB6_SUBTREE(fn)        (rcu_dereference_protected((fn)->subtree, 1))
     120                 :            : #endif
     121                 :            : 
     122                 :            : /*
     123                 :            :  *      routing information
     124                 :            :  *
     125                 :            :  */
     126                 :            : 
     127                 :            : struct rt6key {
     128                 :            :         struct in6_addr addr;
     129                 :            :         int             plen;
     130                 :            : };
     131                 :            : 
     132                 :            : struct fib6_table;
     133                 :            : 
     134                 :            : struct rt6_exception_bucket {
     135                 :            :         struct hlist_head       chain;
     136                 :            :         int                     depth;
     137                 :            : };
     138                 :            : 
     139                 :            : struct rt6_exception {
     140                 :            :         struct hlist_node       hlist;
     141                 :            :         struct rt6_info         *rt6i;
     142                 :            :         unsigned long           stamp;
     143                 :            :         struct rcu_head         rcu;
     144                 :            : };
     145                 :            : 
     146                 :            : #define FIB6_EXCEPTION_BUCKET_SIZE_SHIFT 10
     147                 :            : #define FIB6_EXCEPTION_BUCKET_SIZE (1 << FIB6_EXCEPTION_BUCKET_SIZE_SHIFT)
     148                 :            : #define FIB6_MAX_DEPTH 5
     149                 :            : 
     150                 :            : struct fib6_nh {
     151                 :            :         struct fib_nh_common    nh_common;
     152                 :            : 
     153                 :            : #ifdef CONFIG_IPV6_ROUTER_PREF
     154                 :            :         unsigned long           last_probe;
     155                 :            : #endif
     156                 :            : 
     157                 :            :         struct rt6_info * __percpu *rt6i_pcpu;
     158                 :            :         struct rt6_exception_bucket __rcu *rt6i_exception_bucket;
     159                 :            : };
     160                 :            : 
     161                 :            : struct fib6_info {
     162                 :            :         struct fib6_table               *fib6_table;
     163                 :            :         struct fib6_info __rcu          *fib6_next;
     164                 :            :         struct fib6_node __rcu          *fib6_node;
     165                 :            : 
     166                 :            :         /* Multipath routes:
     167                 :            :          * siblings is a list of fib6_info that have the the same metric/weight,
     168                 :            :          * destination, but not the same gateway. nsiblings is just a cache
     169                 :            :          * to speed up lookup.
     170                 :            :          */
     171                 :            :         union {
     172                 :            :                 struct list_head        fib6_siblings;
     173                 :            :                 struct list_head        nh_list;
     174                 :            :         };
     175                 :            :         unsigned int                    fib6_nsiblings;
     176                 :            : 
     177                 :            :         refcount_t                      fib6_ref;
     178                 :            :         unsigned long                   expires;
     179                 :            :         struct dst_metrics              *fib6_metrics;
     180                 :            : #define fib6_pmtu               fib6_metrics->metrics[RTAX_MTU-1]
     181                 :            : 
     182                 :            :         struct rt6key                   fib6_dst;
     183                 :            :         u32                             fib6_flags;
     184                 :            :         struct rt6key                   fib6_src;
     185                 :            :         struct rt6key                   fib6_prefsrc;
     186                 :            : 
     187                 :            :         u32                             fib6_metric;
     188                 :            :         u8                              fib6_protocol;
     189                 :            :         u8                              fib6_type;
     190                 :            :         u8                              should_flush:1,
     191                 :            :                                         dst_nocount:1,
     192                 :            :                                         dst_nopolicy:1,
     193                 :            :                                         dst_host:1,
     194                 :            :                                         fib6_destroying:1,
     195                 :            :                                         offload:1,
     196                 :            :                                         trap:1,
     197                 :            :                                         unused:1;
     198                 :            : 
     199                 :            :         struct rcu_head                 rcu;
     200                 :            :         struct nexthop                  *nh;
     201                 :            :         struct fib6_nh                  fib6_nh[0];
     202                 :            : };
     203                 :            : 
     204                 :            : struct rt6_info {
     205                 :            :         struct dst_entry                dst;
     206                 :            :         struct fib6_info __rcu          *from;
     207                 :            : 
     208                 :            :         struct rt6key                   rt6i_dst;
     209                 :            :         struct rt6key                   rt6i_src;
     210                 :            :         struct in6_addr                 rt6i_gateway;
     211                 :            :         struct inet6_dev                *rt6i_idev;
     212                 :            :         u32                             rt6i_flags;
     213                 :            : 
     214                 :            :         struct list_head                rt6i_uncached;
     215                 :            :         struct uncached_list            *rt6i_uncached_list;
     216                 :            : 
     217                 :            :         /* more non-fragment space at head required */
     218                 :            :         unsigned short                  rt6i_nfheader_len;
     219                 :            : };
     220                 :            : 
     221                 :            : struct fib6_result {
     222                 :            :         struct fib6_nh          *nh;
     223                 :            :         struct fib6_info        *f6i;
     224                 :            :         u32                     fib6_flags;
     225                 :            :         u8                      fib6_type;
     226                 :            :         struct rt6_info         *rt6;
     227                 :            : };
     228                 :            : 
     229                 :            : #define for_each_fib6_node_rt_rcu(fn)                                   \
     230                 :            :         for (rt = rcu_dereference((fn)->leaf); rt;                   \
     231                 :            :              rt = rcu_dereference(rt->fib6_next))
     232                 :            : 
     233                 :            : #define for_each_fib6_walker_rt(w)                                      \
     234                 :            :         for (rt = (w)->leaf; rt;                                     \
     235                 :            :              rt = rcu_dereference_protected(rt->fib6_next, 1))
     236                 :            : 
     237                 :        332 : static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
     238                 :            : {
     239   [ -  -  -  -  :        332 :         return ((struct rt6_info *)dst)->rt6i_idev;
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  +  -  
                   -  - ]
     240                 :            : }
     241                 :            : 
     242                 :          0 : static inline bool fib6_requires_src(const struct fib6_info *rt)
     243                 :            : {
     244                 :          0 :         return rt->fib6_src.plen > 0;
     245                 :            : }
     246                 :            : 
     247                 :        396 : static inline void fib6_clean_expires(struct fib6_info *f6i)
     248                 :            : {
     249                 :        396 :         f6i->fib6_flags &= ~RTF_EXPIRES;
     250                 :        396 :         f6i->expires = 0;
     251                 :        396 : }
     252                 :            : 
     253                 :          0 : static inline void fib6_set_expires(struct fib6_info *f6i,
     254                 :            :                                     unsigned long expires)
     255                 :            : {
     256                 :          0 :         f6i->expires = expires;
     257                 :          0 :         f6i->fib6_flags |= RTF_EXPIRES;
     258                 :          0 : }
     259                 :            : 
     260                 :        468 : static inline bool fib6_check_expired(const struct fib6_info *f6i)
     261                 :            : {
     262   [ -  -  -  +  :        468 :         if (f6i->fib6_flags & RTF_EXPIRES)
             -  +  -  - ]
     263   [ #  #  #  #  :          0 :                 return time_after(jiffies, f6i->expires);
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     264                 :            :         return false;
     265                 :            : }
     266                 :            : 
     267                 :            : /* Function to safely get fn->sernum for passed in rt
     268                 :            :  * and store result in passed in cookie.
     269                 :            :  * Return true if we can get cookie safely
     270                 :            :  * Return false if not
     271                 :            :  */
     272                 :        312 : static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
     273                 :            :                                         u32 *cookie)
     274                 :            : {
     275                 :        312 :         struct fib6_node *fn;
     276                 :        312 :         bool status = false;
     277                 :            : 
     278   [ -  -  +  - ]:        312 :         fn = rcu_dereference(f6i->fib6_node);
     279                 :            : 
     280   [ -  -  +  - ]:        312 :         if (fn) {
     281                 :        312 :                 *cookie = fn->fn_sernum;
     282                 :            :                 /* pairs with smp_wmb() in fib6_update_sernum_upto_root() */
     283                 :        312 :                 smp_rmb();
     284                 :        312 :                 status = true;
     285                 :            :         }
     286                 :            : 
     287   [ -  -  +  - ]:        312 :         return status;
     288                 :            : }
     289                 :            : 
     290                 :          0 : static inline u32 rt6_get_cookie(const struct rt6_info *rt)
     291                 :            : {
     292                 :          0 :         struct fib6_info *from;
     293                 :          0 :         u32 cookie = 0;
     294                 :            : 
     295                 :          0 :         rcu_read_lock();
     296                 :            : 
     297   [ #  #  #  # ]:          0 :         from = rcu_dereference(rt->from);
     298   [ #  #  #  # ]:          0 :         if (from)
     299   [ #  #  #  # ]:          0 :                 fib6_get_cookie_safe(from, &cookie);
     300                 :            : 
     301                 :          0 :         rcu_read_unlock();
     302                 :            : 
     303                 :          0 :         return cookie;
     304                 :            : }
     305                 :            : 
     306                 :          0 : static inline void ip6_rt_put(struct rt6_info *rt)
     307                 :            : {
     308                 :            :         /* dst_release() accepts a NULL parameter.
     309                 :            :          * We rely on dst being first structure in struct rt6_info
     310                 :            :          */
     311                 :          0 :         BUILD_BUG_ON(offsetof(struct rt6_info, dst) != 0);
     312                 :          0 :         dst_release(&rt->dst);
     313                 :          0 : }
     314                 :            : 
     315                 :            : struct fib6_info *fib6_info_alloc(gfp_t gfp_flags, bool with_fib6_nh);
     316                 :            : void fib6_info_destroy_rcu(struct rcu_head *head);
     317                 :            : 
     318                 :        240 : static inline void fib6_info_hold(struct fib6_info *f6i)
     319                 :            : {
     320                 :        240 :         refcount_inc(&f6i->fib6_ref);
     321                 :            : }
     322                 :            : 
     323                 :         78 : static inline bool fib6_info_hold_safe(struct fib6_info *f6i)
     324                 :            : {
     325                 :         78 :         return refcount_inc_not_zero(&f6i->fib6_ref);
     326                 :            : }
     327                 :            : 
     328                 :        439 : static inline void fib6_info_release(struct fib6_info *f6i)
     329                 :            : {
     330   [ +  +  +  + ]:        439 :         if (f6i && refcount_dec_and_test(&f6i->fib6_ref))
     331                 :        156 :                 call_rcu(&f6i->rcu, fib6_info_destroy_rcu);
     332                 :        439 : }
     333                 :            : 
     334                 :            : static inline void fib6_info_hw_flags_set(struct fib6_info *f6i, bool offload,
     335                 :            :                                           bool trap)
     336                 :            : {
     337                 :            :         f6i->offload = offload;
     338                 :            :         f6i->trap = trap;
     339                 :            : }
     340                 :            : 
     341                 :            : enum fib6_walk_state {
     342                 :            : #ifdef CONFIG_IPV6_SUBTREES
     343                 :            :         FWS_S,
     344                 :            : #endif
     345                 :            :         FWS_L,
     346                 :            :         FWS_R,
     347                 :            :         FWS_C,
     348                 :            :         FWS_U
     349                 :            : };
     350                 :            : 
     351                 :            : struct fib6_walker {
     352                 :            :         struct list_head lh;
     353                 :            :         struct fib6_node *root, *node;
     354                 :            :         struct fib6_info *leaf;
     355                 :            :         enum fib6_walk_state state;
     356                 :            :         unsigned int skip;
     357                 :            :         unsigned int count;
     358                 :            :         unsigned int skip_in_node;
     359                 :            :         int (*func)(struct fib6_walker *);
     360                 :            :         void *args;
     361                 :            : };
     362                 :            : 
     363                 :            : struct rt6_statistics {
     364                 :            :         __u32           fib_nodes;              /* all fib6 nodes */
     365                 :            :         __u32           fib_route_nodes;        /* intermediate nodes */
     366                 :            :         __u32           fib_rt_entries;         /* rt entries in fib table */
     367                 :            :         __u32           fib_rt_cache;           /* cached rt entries in exception table */
     368                 :            :         __u32           fib_discarded_routes;   /* total number of routes delete */
     369                 :            : 
     370                 :            :         /* The following stats are not protected by any lock */
     371                 :            :         atomic_t        fib_rt_alloc;           /* total number of routes alloced */
     372                 :            :         atomic_t        fib_rt_uncache;         /* rt entries in uncached list */
     373                 :            : };
     374                 :            : 
     375                 :            : #define RTN_TL_ROOT     0x0001
     376                 :            : #define RTN_ROOT        0x0002          /* tree root node               */
     377                 :            : #define RTN_RTINFO      0x0004          /* node with valid routing info */
     378                 :            : 
     379                 :            : /*
     380                 :            :  *      priority levels (or metrics)
     381                 :            :  *
     382                 :            :  */
     383                 :            : 
     384                 :            : 
     385                 :            : struct fib6_table {
     386                 :            :         struct hlist_node       tb6_hlist;
     387                 :            :         u32                     tb6_id;
     388                 :            :         spinlock_t              tb6_lock;
     389                 :            :         struct fib6_node        tb6_root;
     390                 :            :         struct inet_peer_base   tb6_peers;
     391                 :            :         unsigned int            flags;
     392                 :            :         unsigned int            fib_seq;
     393                 :            : #define RT6_TABLE_HAS_DFLT_ROUTER       BIT(0)
     394                 :            : };
     395                 :            : 
     396                 :            : #define RT6_TABLE_UNSPEC        RT_TABLE_UNSPEC
     397                 :            : #define RT6_TABLE_MAIN          RT_TABLE_MAIN
     398                 :            : #define RT6_TABLE_DFLT          RT6_TABLE_MAIN
     399                 :            : #define RT6_TABLE_INFO          RT6_TABLE_MAIN
     400                 :            : #define RT6_TABLE_PREFIX        RT6_TABLE_MAIN
     401                 :            : 
     402                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
     403                 :            : #define FIB6_TABLE_MIN          1
     404                 :            : #define FIB6_TABLE_MAX          RT_TABLE_MAX
     405                 :            : #define RT6_TABLE_LOCAL         RT_TABLE_LOCAL
     406                 :            : #else
     407                 :            : #define FIB6_TABLE_MIN          RT_TABLE_MAIN
     408                 :            : #define FIB6_TABLE_MAX          FIB6_TABLE_MIN
     409                 :            : #define RT6_TABLE_LOCAL         RT6_TABLE_MAIN
     410                 :            : #endif
     411                 :            : 
     412                 :            : typedef struct rt6_info *(*pol_lookup_t)(struct net *,
     413                 :            :                                          struct fib6_table *,
     414                 :            :                                          struct flowi6 *,
     415                 :            :                                          const struct sk_buff *, int);
     416                 :            : 
     417                 :            : struct fib6_entry_notifier_info {
     418                 :            :         struct fib_notifier_info info; /* must be first */
     419                 :            :         struct fib6_info *rt;
     420                 :            :         unsigned int nsiblings;
     421                 :            : };
     422                 :            : 
     423                 :            : /*
     424                 :            :  *      exported functions
     425                 :            :  */
     426                 :            : 
     427                 :            : struct fib6_table *fib6_get_table(struct net *net, u32 id);
     428                 :            : struct fib6_table *fib6_new_table(struct net *net, u32 id);
     429                 :            : struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
     430                 :            :                                    const struct sk_buff *skb,
     431                 :            :                                    int flags, pol_lookup_t lookup);
     432                 :            : 
     433                 :            : /* called with rcu lock held; can return error pointer
     434                 :            :  * caller needs to select path
     435                 :            :  */
     436                 :            : int fib6_lookup(struct net *net, int oif, struct flowi6 *fl6,
     437                 :            :                 struct fib6_result *res, int flags);
     438                 :            : 
     439                 :            : /* called with rcu lock held; caller needs to select path */
     440                 :            : int fib6_table_lookup(struct net *net, struct fib6_table *table,
     441                 :            :                       int oif, struct flowi6 *fl6, struct fib6_result *res,
     442                 :            :                       int strict);
     443                 :            : 
     444                 :            : void fib6_select_path(const struct net *net, struct fib6_result *res,
     445                 :            :                       struct flowi6 *fl6, int oif, bool have_oif_match,
     446                 :            :                       const struct sk_buff *skb, int strict);
     447                 :            : struct fib6_node *fib6_node_lookup(struct fib6_node *root,
     448                 :            :                                    const struct in6_addr *daddr,
     449                 :            :                                    const struct in6_addr *saddr);
     450                 :            : 
     451                 :            : struct fib6_node *fib6_locate(struct fib6_node *root,
     452                 :            :                               const struct in6_addr *daddr, int dst_len,
     453                 :            :                               const struct in6_addr *saddr, int src_len,
     454                 :            :                               bool exact_match);
     455                 :            : 
     456                 :            : void fib6_clean_all(struct net *net, int (*func)(struct fib6_info *, void *arg),
     457                 :            :                     void *arg);
     458                 :            : void fib6_clean_all_skip_notify(struct net *net,
     459                 :            :                                 int (*func)(struct fib6_info *, void *arg),
     460                 :            :                                 void *arg);
     461                 :            : 
     462                 :            : int fib6_add(struct fib6_node *root, struct fib6_info *rt,
     463                 :            :              struct nl_info *info, struct netlink_ext_ack *extack);
     464                 :            : int fib6_del(struct fib6_info *rt, struct nl_info *info);
     465                 :            : 
     466                 :            : static inline
     467                 :            : void rt6_get_prefsrc(const struct rt6_info *rt, struct in6_addr *addr)
     468                 :            : {
     469                 :            :         const struct fib6_info *from;
     470                 :            : 
     471                 :            :         rcu_read_lock();
     472                 :            : 
     473                 :            :         from = rcu_dereference(rt->from);
     474                 :            :         if (from) {
     475                 :            :                 *addr = from->fib6_prefsrc.addr;
     476                 :            :         } else {
     477                 :            :                 struct in6_addr in6_zero = {};
     478                 :            : 
     479                 :            :                 *addr = in6_zero;
     480                 :            :         }
     481                 :            : 
     482                 :            :         rcu_read_unlock();
     483                 :            : }
     484                 :            : 
     485                 :            : int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
     486                 :            :                  struct fib6_config *cfg, gfp_t gfp_flags,
     487                 :            :                  struct netlink_ext_ack *extack);
     488                 :            : void fib6_nh_release(struct fib6_nh *fib6_nh);
     489                 :            : 
     490                 :            : int call_fib6_entry_notifiers(struct net *net,
     491                 :            :                               enum fib_event_type event_type,
     492                 :            :                               struct fib6_info *rt,
     493                 :            :                               struct netlink_ext_ack *extack);
     494                 :            : int call_fib6_multipath_entry_notifiers(struct net *net,
     495                 :            :                                         enum fib_event_type event_type,
     496                 :            :                                         struct fib6_info *rt,
     497                 :            :                                         unsigned int nsiblings,
     498                 :            :                                         struct netlink_ext_ack *extack);
     499                 :            : int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt);
     500                 :            : void fib6_rt_update(struct net *net, struct fib6_info *rt,
     501                 :            :                     struct nl_info *info);
     502                 :            : void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
     503                 :            :                      unsigned int flags);
     504                 :            : 
     505                 :            : void fib6_run_gc(unsigned long expires, struct net *net, bool force);
     506                 :            : 
     507                 :            : void fib6_gc_cleanup(void);
     508                 :            : 
     509                 :            : int fib6_init(void);
     510                 :            : 
     511                 :            : struct ipv6_route_iter {
     512                 :            :         struct seq_net_private p;
     513                 :            :         struct fib6_walker w;
     514                 :            :         loff_t skip;
     515                 :            :         struct fib6_table *tbl;
     516                 :            :         int sernum;
     517                 :            : };
     518                 :            : 
     519                 :            : extern const struct seq_operations ipv6_route_seq_ops;
     520                 :            : 
     521                 :            : int call_fib6_notifier(struct notifier_block *nb,
     522                 :            :                        enum fib_event_type event_type,
     523                 :            :                        struct fib_notifier_info *info);
     524                 :            : int call_fib6_notifiers(struct net *net, enum fib_event_type event_type,
     525                 :            :                         struct fib_notifier_info *info);
     526                 :            : 
     527                 :            : int __net_init fib6_notifier_init(struct net *net);
     528                 :            : void __net_exit fib6_notifier_exit(struct net *net);
     529                 :            : 
     530                 :            : unsigned int fib6_tables_seq_read(struct net *net);
     531                 :            : int fib6_tables_dump(struct net *net, struct notifier_block *nb,
     532                 :            :                      struct netlink_ext_ack *extack);
     533                 :            : 
     534                 :            : void fib6_update_sernum(struct net *net, struct fib6_info *rt);
     535                 :            : void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt);
     536                 :            : void fib6_update_sernum_stub(struct net *net, struct fib6_info *f6i);
     537                 :            : 
     538                 :            : void fib6_metric_set(struct fib6_info *f6i, int metric, u32 val);
     539                 :          0 : static inline bool fib6_metric_locked(struct fib6_info *f6i, int metric)
     540                 :            : {
     541   [ #  #  #  # ]:          0 :         return !!(f6i->fib6_metrics->metrics[RTAX_LOCK - 1] & (1 << metric));
     542                 :            : }
     543                 :            : 
     544                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
     545                 :            : static inline bool fib6_has_custom_rules(const struct net *net)
     546                 :            : {
     547                 :            :         return net->ipv6.fib6_has_custom_rules;
     548                 :            : }
     549                 :            : 
     550                 :            : int fib6_rules_init(void);
     551                 :            : void fib6_rules_cleanup(void);
     552                 :            : bool fib6_rule_default(const struct fib_rule *rule);
     553                 :            : int fib6_rules_dump(struct net *net, struct notifier_block *nb,
     554                 :            :                     struct netlink_ext_ack *extack);
     555                 :            : unsigned int fib6_rules_seq_read(struct net *net);
     556                 :            : 
     557                 :            : static inline bool fib6_rules_early_flow_dissect(struct net *net,
     558                 :            :                                                  struct sk_buff *skb,
     559                 :            :                                                  struct flowi6 *fl6,
     560                 :            :                                                  struct flow_keys *flkeys)
     561                 :            : {
     562                 :            :         unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
     563                 :            : 
     564                 :            :         if (!net->ipv6.fib6_rules_require_fldissect)
     565                 :            :                 return false;
     566                 :            : 
     567                 :            :         skb_flow_dissect_flow_keys(skb, flkeys, flag);
     568                 :            :         fl6->fl6_sport = flkeys->ports.src;
     569                 :            :         fl6->fl6_dport = flkeys->ports.dst;
     570                 :            :         fl6->flowi6_proto = flkeys->basic.ip_proto;
     571                 :            : 
     572                 :            :         return true;
     573                 :            : }
     574                 :            : #else
     575                 :            : static inline bool fib6_has_custom_rules(const struct net *net)
     576                 :            : {
     577                 :            :         return false;
     578                 :            : }
     579                 :         78 : static inline int               fib6_rules_init(void)
     580                 :            : {
     581                 :         78 :         return 0;
     582                 :            : }
     583                 :          0 : static inline void              fib6_rules_cleanup(void)
     584                 :            : {
     585                 :          0 :         return ;
     586                 :            : }
     587                 :            : static inline bool fib6_rule_default(const struct fib_rule *rule)
     588                 :            : {
     589                 :            :         return true;
     590                 :            : }
     591                 :          0 : static inline int fib6_rules_dump(struct net *net, struct notifier_block *nb,
     592                 :            :                                   struct netlink_ext_ack *extack)
     593                 :            : {
     594                 :          0 :         return 0;
     595                 :            : }
     596                 :          0 : static inline unsigned int fib6_rules_seq_read(struct net *net)
     597                 :            : {
     598                 :          0 :         return 0;
     599                 :            : }
     600                 :          0 : static inline bool fib6_rules_early_flow_dissect(struct net *net,
     601                 :            :                                                  struct sk_buff *skb,
     602                 :            :                                                  struct flowi6 *fl6,
     603                 :            :                                                  struct flow_keys *flkeys)
     604                 :            : {
     605         [ #  # ]:          0 :         return false;
     606                 :            : }
     607                 :            : #endif
     608                 :            : #endif

Generated by: LCOV version 1.14