linux/include/net/ip6_fib.h
<<
>>
Prefs
   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#ifdef __KERNEL__
  17
  18#include <linux/ipv6_route.h>
  19#include <linux/rtnetlink.h>
  20#include <linux/spinlock.h>
  21#include <net/dst.h>
  22#include <net/flow.h>
  23#include <net/netlink.h>
  24
  25struct rt6_info;
  26
  27struct fib6_config
  28{
  29        u32             fc_table;
  30        u32             fc_metric;
  31        int             fc_dst_len;
  32        int             fc_src_len;
  33        int             fc_ifindex;
  34        u32             fc_flags;
  35        u32             fc_protocol;
  36
  37        struct in6_addr fc_dst;
  38        struct in6_addr fc_src;
  39        struct in6_addr fc_gateway;
  40
  41        unsigned long   fc_expires;
  42        struct nlattr   *fc_mx;
  43        int             fc_mx_len;
  44
  45        struct nl_info  fc_nlinfo;
  46};
  47
  48struct fib6_node
  49{
  50        struct fib6_node        *parent;
  51        struct fib6_node        *left;
  52        struct fib6_node        *right;
  53#ifdef CONFIG_IPV6_SUBTREES
  54        struct fib6_node        *subtree;
  55#endif
  56        struct rt6_info         *leaf;
  57
  58        __u16                   fn_bit;         /* bit key */
  59        __u16                   fn_flags;
  60        __u32                   fn_sernum;
  61        struct rt6_info         *rr_ptr;
  62};
  63
  64#ifndef CONFIG_IPV6_SUBTREES
  65#define FIB6_SUBTREE(fn)        NULL
  66#else
  67#define FIB6_SUBTREE(fn)        ((fn)->subtree)
  68#endif
  69
  70/*
  71 *      routing information
  72 *
  73 */
  74
  75struct rt6key
  76{
  77        struct in6_addr addr;
  78        int             plen;
  79};
  80
  81struct fib6_table;
  82
  83struct rt6_info
  84{
  85        union {
  86                struct dst_entry        dst;
  87        } u;
  88
  89        struct inet6_dev                *rt6i_idev;
  90
  91#define rt6i_dev                        u.dst.dev
  92#define rt6i_nexthop                    u.dst.neighbour
  93#define rt6i_expires                    u.dst.expires
  94
  95        struct fib6_node                *rt6i_node;
  96
  97        struct in6_addr                 rt6i_gateway;
  98        
  99        u32                             rt6i_flags;
 100        u32                             rt6i_metric;
 101        atomic_t                        rt6i_ref;
 102
 103        /* more non-fragment space at head required */
 104        unsigned short                  rt6i_nfheader_len;
 105
 106        u8                              rt6i_protocol;
 107
 108        struct fib6_table               *rt6i_table;
 109
 110        struct rt6key                   rt6i_dst;
 111
 112#ifdef CONFIG_XFRM
 113        u32                             rt6i_flow_cache_genid;
 114#endif
 115
 116        struct rt6key                   rt6i_src;
 117};
 118
 119static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
 120{
 121        return ((struct rt6_info *)dst)->rt6i_idev;
 122}
 123
 124struct fib6_walker_t
 125{
 126        struct fib6_walker_t *prev, *next;
 127        struct fib6_node *root, *node;
 128        struct rt6_info *leaf;
 129        unsigned char state;
 130        unsigned char prune;
 131        int (*func)(struct fib6_walker_t *);
 132        void *args;
 133};
 134
 135struct rt6_statistics {
 136        __u32           fib_nodes;
 137        __u32           fib_route_nodes;
 138        __u32           fib_rt_alloc;           /* permanent routes     */
 139        __u32           fib_rt_entries;         /* rt entries in table  */
 140        __u32           fib_rt_cache;           /* cache routes         */
 141        __u32           fib_discarded_routes;
 142};
 143
 144#define RTN_TL_ROOT     0x0001
 145#define RTN_ROOT        0x0002          /* tree root node               */
 146#define RTN_RTINFO      0x0004          /* node with valid routing info */
 147
 148/*
 149 *      priority levels (or metrics)
 150 *
 151 */
 152
 153
 154struct fib6_table {
 155        struct hlist_node       tb6_hlist;
 156        u32                     tb6_id;
 157        rwlock_t                tb6_lock;
 158        struct fib6_node        tb6_root;
 159};
 160
 161#define RT6_TABLE_UNSPEC        RT_TABLE_UNSPEC
 162#define RT6_TABLE_MAIN          RT_TABLE_MAIN
 163#define RT6_TABLE_DFLT          RT6_TABLE_MAIN
 164#define RT6_TABLE_INFO          RT6_TABLE_MAIN
 165#define RT6_TABLE_PREFIX        RT6_TABLE_MAIN
 166
 167#ifdef CONFIG_IPV6_MULTIPLE_TABLES
 168#define FIB6_TABLE_MIN          1
 169#define FIB6_TABLE_MAX          RT_TABLE_MAX
 170#define RT6_TABLE_LOCAL         RT_TABLE_LOCAL
 171#else
 172#define FIB6_TABLE_MIN          RT_TABLE_MAIN
 173#define FIB6_TABLE_MAX          FIB6_TABLE_MIN
 174#define RT6_TABLE_LOCAL         RT6_TABLE_MAIN
 175#endif
 176
 177typedef struct rt6_info *(*pol_lookup_t)(struct net *,
 178                                         struct fib6_table *,
 179                                         struct flowi *, int);
 180
 181/*
 182 *      exported functions
 183 */
 184
 185extern struct fib6_table        *fib6_get_table(struct net *net, u32 id);
 186extern struct fib6_table        *fib6_new_table(struct net *net, u32 id);
 187extern struct dst_entry         *fib6_rule_lookup(struct net *net,
 188                                                  struct flowi *fl, int flags,
 189                                                  pol_lookup_t lookup);
 190
 191extern struct fib6_node         *fib6_lookup(struct fib6_node *root,
 192                                             struct in6_addr *daddr,
 193                                             struct in6_addr *saddr);
 194
 195struct fib6_node                *fib6_locate(struct fib6_node *root,
 196                                             struct in6_addr *daddr, int dst_len,
 197                                             struct in6_addr *saddr, int src_len);
 198
 199extern void                     fib6_clean_all(struct net *net,
 200                                               int (*func)(struct rt6_info *, void *arg),
 201                                               int prune, void *arg);
 202
 203extern int                      fib6_add(struct fib6_node *root,
 204                                         struct rt6_info *rt,
 205                                         struct nl_info *info);
 206
 207extern int                      fib6_del(struct rt6_info *rt,
 208                                         struct nl_info *info);
 209
 210extern void                     inet6_rt_notify(int event, struct rt6_info *rt,
 211                                                struct nl_info *info);
 212
 213extern void                     fib6_run_gc(unsigned long expires,
 214                                            struct net *net);
 215
 216extern void                     fib6_gc_cleanup(void);
 217
 218extern int                      fib6_init(void);
 219
 220#ifdef CONFIG_IPV6_MULTIPLE_TABLES
 221extern int                      fib6_rules_init(void);
 222extern void                     fib6_rules_cleanup(void);
 223#else
 224static inline int               fib6_rules_init(void)
 225{
 226        return 0;
 227}
 228static inline void              fib6_rules_cleanup(void)
 229{
 230        return ;
 231}
 232#endif
 233#endif
 234#endif
 235
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.