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