linux/include/net/ip_fib.h
<<
>>
Prefs
   1/*
   2 * INET         An implementation of the TCP/IP protocol suite for the LINUX
   3 *              operating system.  INET  is implemented using the  BSD Socket
   4 *              interface as the means of communication with the user level.
   5 *
   6 *              Definitions for the Forwarding Information Base.
   7 *
   8 * Authors:     A.N.Kuznetsov, <kuznet@ms2.inr.ac.ru>
   9 *
  10 *              This program is free software; you can redistribute it and/or
  11 *              modify it under the terms of the GNU General Public License
  12 *              as published by the Free Software Foundation; either version
  13 *              2 of the License, or (at your option) any later version.
  14 */
  15
  16#ifndef _NET_IP_FIB_H
  17#define _NET_IP_FIB_H
  18
  19#include <net/flow.h>
  20#include <linux/seq_file.h>
  21#include <net/fib_rules.h>
  22
  23struct fib_config {
  24        u8                      fc_dst_len;
  25        u8                      fc_tos;
  26        u8                      fc_protocol;
  27        u8                      fc_scope;
  28        u8                      fc_type;
  29        /* 3 bytes unused */
  30        u32                     fc_table;
  31        __be32                  fc_dst;
  32        __be32                  fc_gw;
  33        int                     fc_oif;
  34        u32                     fc_flags;
  35        u32                     fc_priority;
  36        __be32                  fc_prefsrc;
  37        struct nlattr           *fc_mx;
  38        struct rtnexthop        *fc_mp;
  39        int                     fc_mx_len;
  40        int                     fc_mp_len;
  41        u32                     fc_flow;
  42        u32                     fc_nlflags;
  43        struct nl_info          fc_nlinfo;
  44 };
  45
  46struct fib_info;
  47
  48struct fib_nh {
  49        struct net_device       *nh_dev;
  50        struct hlist_node       nh_hash;
  51        struct fib_info         *nh_parent;
  52        unsigned                nh_flags;
  53        unsigned char           nh_scope;
  54#ifdef CONFIG_IP_ROUTE_MULTIPATH
  55        int                     nh_weight;
  56        int                     nh_power;
  57#endif
  58#ifdef CONFIG_NET_CLS_ROUTE
  59        __u32                   nh_tclassid;
  60#endif
  61        int                     nh_oif;
  62        __be32                  nh_gw;
  63};
  64
  65/*
  66 * This structure contains data shared by many of routes.
  67 */
  68
  69struct fib_info {
  70        struct hlist_node       fib_hash;
  71        struct hlist_node       fib_lhash;
  72        struct net              *fib_net;
  73        int                     fib_treeref;
  74        atomic_t                fib_clntref;
  75        int                     fib_dead;
  76        unsigned                fib_flags;
  77        int                     fib_protocol;
  78        __be32                  fib_prefsrc;
  79        u32                     fib_priority;
  80        u32                     fib_metrics[RTAX_MAX];
  81#define fib_mtu fib_metrics[RTAX_MTU-1]
  82#define fib_window fib_metrics[RTAX_WINDOW-1]
  83#define fib_rtt fib_metrics[RTAX_RTT-1]
  84#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
  85        int                     fib_nhs;
  86#ifdef CONFIG_IP_ROUTE_MULTIPATH
  87        int                     fib_power;
  88#endif
  89        struct fib_nh           fib_nh[0];
  90#define fib_dev         fib_nh[0].nh_dev
  91};
  92
  93
  94#ifdef CONFIG_IP_MULTIPLE_TABLES
  95struct fib_rule;
  96#endif
  97
  98struct fib_result {
  99        unsigned char   prefixlen;
 100        unsigned char   nh_sel;
 101        unsigned char   type;
 102        unsigned char   scope;
 103        struct fib_info *fi;
 104#ifdef CONFIG_IP_MULTIPLE_TABLES
 105        struct fib_rule *r;
 106#endif
 107};
 108
 109struct fib_result_nl {
 110        __be32          fl_addr;   /* To be looked up*/
 111        u32             fl_mark;
 112        unsigned char   fl_tos;
 113        unsigned char   fl_scope;
 114        unsigned char   tb_id_in;
 115
 116        unsigned char   tb_id;      /* Results */
 117        unsigned char   prefixlen;
 118        unsigned char   nh_sel;
 119        unsigned char   type;
 120        unsigned char   scope;
 121        int             err;      
 122};
 123
 124#ifdef CONFIG_IP_ROUTE_MULTIPATH
 125
 126#define FIB_RES_NH(res)         ((res).fi->fib_nh[(res).nh_sel])
 127
 128#define FIB_TABLE_HASHSZ 2
 129
 130#else /* CONFIG_IP_ROUTE_MULTIPATH */
 131
 132#define FIB_RES_NH(res)         ((res).fi->fib_nh[0])
 133
 134#define FIB_TABLE_HASHSZ 256
 135
 136#endif /* CONFIG_IP_ROUTE_MULTIPATH */
 137
 138#define FIB_RES_PREFSRC(res)            ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res))
 139#define FIB_RES_GW(res)                 (FIB_RES_NH(res).nh_gw)
 140#define FIB_RES_DEV(res)                (FIB_RES_NH(res).nh_dev)
 141#define FIB_RES_OIF(res)                (FIB_RES_NH(res).nh_oif)
 142
 143struct fib_table {
 144        struct hlist_node tb_hlist;
 145        u32             tb_id;
 146        int             tb_default;
 147        int             (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
 148        int             (*tb_insert)(struct fib_table *, struct fib_config *);
 149        int             (*tb_delete)(struct fib_table *, struct fib_config *);
 150        int             (*tb_dump)(struct fib_table *table, struct sk_buff *skb,
 151                                     struct netlink_callback *cb);
 152        int             (*tb_flush)(struct fib_table *table);
 153        void            (*tb_select_default)(struct fib_table *table,
 154                                             const struct flowi *flp, struct fib_result *res);
 155
 156        unsigned char   tb_data[0];
 157};
 158
 159#ifndef CONFIG_IP_MULTIPLE_TABLES
 160
 161#define TABLE_LOCAL_INDEX       0
 162#define TABLE_MAIN_INDEX        1
 163
 164static inline struct fib_table *fib_get_table(struct net *net, u32 id)
 165{
 166        struct hlist_head *ptr;
 167
 168        ptr = id == RT_TABLE_LOCAL ?
 169                &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX] :
 170                &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX];
 171        return hlist_entry(ptr->first, struct fib_table, tb_hlist);
 172}
 173
 174static inline struct fib_table *fib_new_table(struct net *net, u32 id)
 175{
 176        return fib_get_table(net, id);
 177}
 178
 179static inline int fib_lookup(struct net *net, const struct flowi *flp,
 180                             struct fib_result *res)
 181{
 182        struct fib_table *table;
 183
 184        table = fib_get_table(net, RT_TABLE_LOCAL);
 185        if (!table->tb_lookup(table, flp, res))
 186                return 0;
 187
 188        table = fib_get_table(net, RT_TABLE_MAIN);
 189        if (!table->tb_lookup(table, flp, res))
 190                return 0;
 191        return -ENETUNREACH;
 192}
 193
 194#else /* CONFIG_IP_MULTIPLE_TABLES */
 195extern int __net_init fib4_rules_init(struct net *net);
 196extern void __net_exit fib4_rules_exit(struct net *net);
 197
 198#ifdef CONFIG_NET_CLS_ROUTE
 199extern u32 fib_rules_tclass(struct fib_result *res);
 200#endif
 201
 202extern int fib_lookup(struct net *n, struct flowi *flp, struct fib_result *res);
 203
 204extern struct fib_table *fib_new_table(struct net *net, u32 id);
 205extern struct fib_table *fib_get_table(struct net *net, u32 id);
 206
 207#endif /* CONFIG_IP_MULTIPLE_TABLES */
 208
 209/* Exported by fib_frontend.c */
 210extern const struct nla_policy rtm_ipv4_policy[];
 211extern void             ip_fib_init(void);
 212extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
 213                               struct net_device *dev, __be32 *spec_dst, u32 *itag);
 214extern void fib_select_default(struct net *net, const struct flowi *flp,
 215                               struct fib_result *res);
 216
 217/* Exported by fib_semantics.c */
 218extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
 219extern int fib_sync_down_dev(struct net_device *dev, int force);
 220extern int fib_sync_down_addr(struct net *net, __be32 local);
 221extern int fib_sync_up(struct net_device *dev);
 222extern __be32  __fib_res_prefsrc(struct fib_result *res);
 223extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
 224
 225/* Exported by fib_{hash|trie}.c */
 226extern void fib_hash_init(void);
 227extern struct fib_table *fib_hash_table(u32 id);
 228
 229static inline void fib_combine_itag(u32 *itag, struct fib_result *res)
 230{
 231#ifdef CONFIG_NET_CLS_ROUTE
 232#ifdef CONFIG_IP_MULTIPLE_TABLES
 233        u32 rtag;
 234#endif
 235        *itag = FIB_RES_NH(*res).nh_tclassid<<16;
 236#ifdef CONFIG_IP_MULTIPLE_TABLES
 237        rtag = fib_rules_tclass(res);
 238        if (*itag == 0)
 239                *itag = (rtag<<16);
 240        *itag |= (rtag>>16);
 241#endif
 242#endif
 243}
 244
 245extern void free_fib_info(struct fib_info *fi);
 246
 247static inline void fib_info_put(struct fib_info *fi)
 248{
 249        if (atomic_dec_and_test(&fi->fib_clntref))
 250                free_fib_info(fi);
 251}
 252
 253static inline void fib_res_put(struct fib_result *res)
 254{
 255        if (res->fi)
 256                fib_info_put(res->fi);
 257#ifdef CONFIG_IP_MULTIPLE_TABLES
 258        if (res->r)
 259                fib_rule_put(res->r);
 260#endif
 261}
 262
 263#ifdef CONFIG_PROC_FS
 264extern int __net_init  fib_proc_init(struct net *net);
 265extern void __net_exit fib_proc_exit(struct net *net);
 266#else
 267static inline int fib_proc_init(struct net *net)
 268{
 269        return 0;
 270}
 271static inline void fib_proc_exit(struct net *net)
 272{
 273}
 274#endif
 275
 276#endif  /* _NET_FIB_H */
 277
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.