LCOV - code coverage report
Current view: top level - include/net - ip6_fib.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 5 15 33.3 %
Date: 2014-04-07 Functions: 0 0 -
Branches: 0 6 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *      Linux INET6 implementation 
       3                 :            :  *
       4                 :            :  *      Authors:
       5                 :            :  *      Pedro Roque             <roque@di.fc.ul.pt>       
       6                 :            :  *
       7                 :            :  *      This program is free software; you can redistribute it and/or
       8                 :            :  *      modify it under the terms of the GNU General Public License
       9                 :            :  *      as published by the Free Software Foundation; either version
      10                 :            :  *      2 of the License, or (at your option) any later version.
      11                 :            :  */
      12                 :            : 
      13                 :            : #ifndef _IP6_FIB_H
      14                 :            : #define _IP6_FIB_H
      15                 :            : 
      16                 :            : #include <linux/ipv6_route.h>
      17                 :            : #include <linux/rtnetlink.h>
      18                 :            : #include <linux/spinlock.h>
      19                 :            : #include <net/dst.h>
      20                 :            : #include <net/flow.h>
      21                 :            : #include <net/netlink.h>
      22                 :            : #include <net/inetpeer.h>
      23                 :            : 
      24                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
      25                 :            : #define FIB6_TABLE_HASHSZ 256
      26                 :            : #else
      27                 :            : #define FIB6_TABLE_HASHSZ 1
      28                 :            : #endif
      29                 :            : 
      30                 :            : struct rt6_info;
      31                 :            : 
      32                 :            : struct fib6_config {
      33                 :            :         u32             fc_table;
      34                 :            :         u32             fc_metric;
      35                 :            :         int             fc_dst_len;
      36                 :            :         int             fc_src_len;
      37                 :            :         int             fc_ifindex;
      38                 :            :         u32             fc_flags;
      39                 :            :         u32             fc_protocol;
      40                 :            :         u32             fc_type;        /* only 8 bits are used */
      41                 :            : 
      42                 :            :         struct in6_addr fc_dst;
      43                 :            :         struct in6_addr fc_src;
      44                 :            :         struct in6_addr fc_prefsrc;
      45                 :            :         struct in6_addr fc_gateway;
      46                 :            : 
      47                 :            :         unsigned long   fc_expires;
      48                 :            :         struct nlattr   *fc_mx;
      49                 :            :         int             fc_mx_len;
      50                 :            :         int             fc_mp_len;
      51                 :            :         struct nlattr   *fc_mp;
      52                 :            : 
      53                 :            :         struct nl_info  fc_nlinfo;
      54                 :            : };
      55                 :            : 
      56                 :            : struct fib6_node {
      57                 :            :         struct fib6_node        *parent;
      58                 :            :         struct fib6_node        *left;
      59                 :            :         struct fib6_node        *right;
      60                 :            : #ifdef CONFIG_IPV6_SUBTREES
      61                 :            :         struct fib6_node        *subtree;
      62                 :            : #endif
      63                 :            :         struct rt6_info         *leaf;
      64                 :            : 
      65                 :            :         __u16                   fn_bit;         /* bit key */
      66                 :            :         __u16                   fn_flags;
      67                 :            :         __u32                   fn_sernum;
      68                 :            :         struct rt6_info         *rr_ptr;
      69                 :            : };
      70                 :            : 
      71                 :            : #ifndef CONFIG_IPV6_SUBTREES
      72                 :            : #define FIB6_SUBTREE(fn)        NULL
      73                 :            : #else
      74                 :            : #define FIB6_SUBTREE(fn)        ((fn)->subtree)
      75                 :            : #endif
      76                 :            : 
      77                 :            : /*
      78                 :            :  *      routing information
      79                 :            :  *
      80                 :            :  */
      81                 :            : 
      82                 :            : struct rt6key {
      83                 :            :         struct in6_addr addr;
      84                 :            :         int             plen;
      85                 :            : };
      86                 :            : 
      87                 :            : struct fib6_table;
      88                 :            : 
      89                 :            : struct rt6_info {
      90                 :            :         struct dst_entry                dst;
      91                 :            : 
      92                 :            :         /*
      93                 :            :          * Tail elements of dst_entry (__refcnt etc.)
      94                 :            :          * and these elements (rarely used in hot path) are in
      95                 :            :          * the same cache line.
      96                 :            :          */
      97                 :            :         struct fib6_table               *rt6i_table;
      98                 :            :         struct fib6_node                *rt6i_node;
      99                 :            : 
     100                 :            :         struct in6_addr                 rt6i_gateway;
     101                 :            : 
     102                 :            :         /* Multipath routes:
     103                 :            :          * siblings is a list of rt6_info that have the the same metric/weight,
     104                 :            :          * destination, but not the same gateway. nsiblings is just a cache
     105                 :            :          * to speed up lookup.
     106                 :            :          */
     107                 :            :         struct list_head                rt6i_siblings;
     108                 :            :         unsigned int                    rt6i_nsiblings;
     109                 :            : 
     110                 :            :         atomic_t                        rt6i_ref;
     111                 :            : 
     112                 :            :         /* These are in a separate cache line. */
     113                 :            :         struct rt6key                   rt6i_dst ____cacheline_aligned_in_smp;
     114                 :            :         u32                             rt6i_flags;
     115                 :            :         struct rt6key                   rt6i_src;
     116                 :            :         struct rt6key                   rt6i_prefsrc;
     117                 :            :         u32                             rt6i_metric;
     118                 :            : 
     119                 :            :         struct inet6_dev                *rt6i_idev;
     120                 :            :         unsigned long                   _rt6i_peer;
     121                 :            : 
     122                 :            :         u32                             rt6i_genid;
     123                 :            : 
     124                 :            :         /* more non-fragment space at head required */
     125                 :            :         unsigned short                  rt6i_nfheader_len;
     126                 :            : 
     127                 :            :         u8                              rt6i_protocol;
     128                 :            : };
     129                 :            : 
     130                 :            : static inline struct inet_peer *rt6_peer_ptr(struct rt6_info *rt)
     131                 :            : {
     132                 :            :         return inetpeer_ptr(rt->_rt6i_peer);
     133                 :            : }
     134                 :            : 
     135                 :            : static inline bool rt6_has_peer(struct rt6_info *rt)
     136                 :            : {
     137                 :            :         return inetpeer_ptr_is_peer(rt->_rt6i_peer);
     138                 :            : }
     139                 :            : 
     140                 :            : static inline void __rt6_set_peer(struct rt6_info *rt, struct inet_peer *peer)
     141                 :            : {
     142                 :            :         __inetpeer_ptr_set_peer(&rt->_rt6i_peer, peer);
     143                 :            : }
     144                 :            : 
     145                 :            : static inline bool rt6_set_peer(struct rt6_info *rt, struct inet_peer *peer)
     146                 :            : {
     147                 :        105 :         return inetpeer_ptr_set_peer(&rt->_rt6i_peer, peer);
     148                 :            : }
     149                 :            : 
     150                 :            : static inline void rt6_init_peer(struct rt6_info *rt, struct inet_peer_base *base)
     151                 :            : {
     152                 :            :         inetpeer_init_ptr(&rt->_rt6i_peer, base);
     153                 :            : }
     154                 :            : 
     155                 :            : static inline void rt6_transfer_peer(struct rt6_info *rt, struct rt6_info *ort)
     156                 :            : {
     157                 :          0 :         inetpeer_transfer_peer(&rt->_rt6i_peer, &ort->_rt6i_peer);
     158                 :            : }
     159                 :            : 
     160                 :            : static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
     161                 :            : {
     162                 :        207 :         return ((struct rt6_info *)dst)->rt6i_idev;
     163                 :            : }
     164                 :            : 
     165                 :            : static inline void rt6_clean_expires(struct rt6_info *rt)
     166                 :            : {
     167                 :          0 :         rt->rt6i_flags &= ~RTF_EXPIRES;
     168                 :          0 :         rt->dst.expires = 0;
     169                 :            : }
     170                 :            : 
     171                 :            : static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)
     172                 :            : {
     173                 :          0 :         rt->dst.expires = expires;
     174                 :          0 :         rt->rt6i_flags |= RTF_EXPIRES;
     175                 :            : }
     176                 :            : 
     177                 :            : static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)
     178                 :            : {
     179                 :            :         struct rt6_info *rt;
     180                 :            : 
     181 [ #  # ][ #  # ]:          0 :         for (rt = rt0; rt && !(rt->rt6i_flags & RTF_EXPIRES);
     182                 :          0 :              rt = (struct rt6_info *)rt->dst.from);
     183         [ #  # ]:          0 :         if (rt && rt != rt0)
     184                 :          0 :                 rt0->dst.expires = rt->dst.expires;
     185                 :            : 
     186                 :            :         dst_set_expires(&rt0->dst, timeout);
     187                 :          0 :         rt0->rt6i_flags |= RTF_EXPIRES;
     188                 :            : }
     189                 :            : 
     190                 :            : static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from)
     191                 :            : {
     192                 :            :         struct dst_entry *new = (struct dst_entry *) from;
     193                 :            : 
     194                 :        105 :         rt->rt6i_flags &= ~RTF_EXPIRES;
     195                 :            :         dst_hold(new);
     196                 :        105 :         rt->dst.from = new;
     197                 :            : }
     198                 :            : 
     199                 :            : static inline void ip6_rt_put(struct rt6_info *rt)
     200                 :            : {
     201                 :            :         /* dst_release() accepts a NULL parameter.
     202                 :            :          * We rely on dst being first structure in struct rt6_info
     203                 :            :          */
     204                 :            :         BUILD_BUG_ON(offsetof(struct rt6_info, dst) != 0);
     205                 :        105 :         dst_release(&rt->dst);
     206                 :            : }
     207                 :            : 
     208                 :            : struct fib6_walker_t {
     209                 :            :         struct list_head lh;
     210                 :            :         struct fib6_node *root, *node;
     211                 :            :         struct rt6_info *leaf;
     212                 :            :         unsigned char state;
     213                 :            :         unsigned char prune;
     214                 :            :         unsigned int skip;
     215                 :            :         unsigned int count;
     216                 :            :         int (*func)(struct fib6_walker_t *);
     217                 :            :         void *args;
     218                 :            : };
     219                 :            : 
     220                 :            : struct rt6_statistics {
     221                 :            :         __u32           fib_nodes;
     222                 :            :         __u32           fib_route_nodes;
     223                 :            :         __u32           fib_rt_alloc;           /* permanent routes     */
     224                 :            :         __u32           fib_rt_entries;         /* rt entries in table  */
     225                 :            :         __u32           fib_rt_cache;           /* cache routes         */
     226                 :            :         __u32           fib_discarded_routes;
     227                 :            : };
     228                 :            : 
     229                 :            : #define RTN_TL_ROOT     0x0001
     230                 :            : #define RTN_ROOT        0x0002          /* tree root node               */
     231                 :            : #define RTN_RTINFO      0x0004          /* node with valid routing info */
     232                 :            : 
     233                 :            : /*
     234                 :            :  *      priority levels (or metrics)
     235                 :            :  *
     236                 :            :  */
     237                 :            : 
     238                 :            : 
     239                 :            : struct fib6_table {
     240                 :            :         struct hlist_node       tb6_hlist;
     241                 :            :         u32                     tb6_id;
     242                 :            :         rwlock_t                tb6_lock;
     243                 :            :         struct fib6_node        tb6_root;
     244                 :            :         struct inet_peer_base   tb6_peers;
     245                 :            : };
     246                 :            : 
     247                 :            : #define RT6_TABLE_UNSPEC        RT_TABLE_UNSPEC
     248                 :            : #define RT6_TABLE_MAIN          RT_TABLE_MAIN
     249                 :            : #define RT6_TABLE_DFLT          RT6_TABLE_MAIN
     250                 :            : #define RT6_TABLE_INFO          RT6_TABLE_MAIN
     251                 :            : #define RT6_TABLE_PREFIX        RT6_TABLE_MAIN
     252                 :            : 
     253                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
     254                 :            : #define FIB6_TABLE_MIN          1
     255                 :            : #define FIB6_TABLE_MAX          RT_TABLE_MAX
     256                 :            : #define RT6_TABLE_LOCAL         RT_TABLE_LOCAL
     257                 :            : #else
     258                 :            : #define FIB6_TABLE_MIN          RT_TABLE_MAIN
     259                 :            : #define FIB6_TABLE_MAX          FIB6_TABLE_MIN
     260                 :            : #define RT6_TABLE_LOCAL         RT6_TABLE_MAIN
     261                 :            : #endif
     262                 :            : 
     263                 :            : typedef struct rt6_info *(*pol_lookup_t)(struct net *,
     264                 :            :                                          struct fib6_table *,
     265                 :            :                                          struct flowi6 *, int);
     266                 :            : 
     267                 :            : /*
     268                 :            :  *      exported functions
     269                 :            :  */
     270                 :            : 
     271                 :            : struct fib6_table *fib6_get_table(struct net *net, u32 id);
     272                 :            : struct fib6_table *fib6_new_table(struct net *net, u32 id);
     273                 :            : struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
     274                 :            :                                    int flags, pol_lookup_t lookup);
     275                 :            : 
     276                 :            : struct fib6_node *fib6_lookup(struct fib6_node *root,
     277                 :            :                               const struct in6_addr *daddr,
     278                 :            :                               const struct in6_addr *saddr);
     279                 :            : 
     280                 :            : struct fib6_node *fib6_locate(struct fib6_node *root,
     281                 :            :                               const struct in6_addr *daddr, int dst_len,
     282                 :            :                               const struct in6_addr *saddr, int src_len);
     283                 :            : 
     284                 :            : void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg),
     285                 :            :                     int prune, void *arg);
     286                 :            : 
     287                 :            : int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info);
     288                 :            : 
     289                 :            : int fib6_del(struct rt6_info *rt, struct nl_info *info);
     290                 :            : 
     291                 :            : void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info);
     292                 :            : 
     293                 :            : void fib6_run_gc(unsigned long expires, struct net *net, bool force);
     294                 :            : 
     295                 :            : void fib6_gc_cleanup(void);
     296                 :            : 
     297                 :            : int fib6_init(void);
     298                 :            : 
     299                 :            : int ipv6_route_open(struct inode *inode, struct file *file);
     300                 :            : 
     301                 :            : #ifdef CONFIG_IPV6_MULTIPLE_TABLES
     302                 :            : int fib6_rules_init(void);
     303                 :            : void fib6_rules_cleanup(void);
     304                 :            : #else
     305                 :            : static inline int               fib6_rules_init(void)
     306                 :            : {
     307                 :            :         return 0;
     308                 :            : }
     309                 :            : static inline void              fib6_rules_cleanup(void)
     310                 :            : {
     311                 :            :         return ;
     312                 :            : }
     313                 :            : #endif
     314                 :            : #endif

Generated by: LCOV version 1.9