home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / ip6_fib.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  4.0 KB  |  189 lines

  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.  
  20. #include <net/dst.h>
  21. #include <net/flow.h>
  22. #include <linux/rtnetlink.h>
  23. #include <linux/spinlock.h>
  24.  
  25. struct rt6_info;
  26.  
  27. struct fib6_node
  28. {
  29.     struct fib6_node    *parent;
  30.     struct fib6_node    *left;
  31.     struct fib6_node    *right;
  32.  
  33.     struct fib6_node    *subtree;
  34.  
  35.     struct rt6_info        *leaf;
  36.  
  37.     __u16            fn_bit;        /* bit key */
  38.     __u16            fn_flags;
  39.     __u32            fn_sernum;
  40. };
  41.  
  42.  
  43. /*
  44.  *    routing information
  45.  *
  46.  */
  47.  
  48. struct rt6key
  49. {
  50.     struct in6_addr    addr;
  51.     int        plen;
  52. };
  53.  
  54. struct rt6_info
  55. {
  56.     union {
  57.         struct dst_entry    dst;
  58.         struct rt6_info        *next;
  59.     } u;
  60.  
  61.     struct inet6_dev        *rt6i_idev;
  62.  
  63. #define rt6i_dev            u.dst.dev
  64. #define rt6i_nexthop            u.dst.neighbour
  65. #define rt6i_expires            u.dst.expires
  66.  
  67.     struct fib6_node        *rt6i_node;
  68.  
  69.     struct in6_addr            rt6i_gateway;
  70.     
  71.     u32                rt6i_flags;
  72.     u32                rt6i_metric;
  73.     atomic_t            rt6i_ref;
  74.  
  75.     struct rt6key            rt6i_dst;
  76.     struct rt6key            rt6i_src;
  77.  
  78.     u8                rt6i_protocol;
  79. };
  80.  
  81. struct fib6_walker_t
  82. {
  83.     struct fib6_walker_t *prev, *next;
  84.     struct fib6_node *root, *node;
  85.     struct rt6_info *leaf;
  86.     unsigned char state;
  87.     unsigned char prune;
  88.     int (*func)(struct fib6_walker_t *);
  89.     void *args;
  90. };
  91.  
  92. extern struct fib6_walker_t fib6_walker_list;
  93. extern rwlock_t fib6_walker_lock;
  94.  
  95. static inline void fib6_walker_link(struct fib6_walker_t *w)
  96. {
  97.     write_lock_bh(&fib6_walker_lock);
  98.     w->next = fib6_walker_list.next;
  99.     w->prev = &fib6_walker_list;
  100.     w->next->prev = w;
  101.     w->prev->next = w;
  102.     write_unlock_bh(&fib6_walker_lock);
  103. }
  104.  
  105. static inline void fib6_walker_unlink(struct fib6_walker_t *w)
  106. {
  107.     write_lock_bh(&fib6_walker_lock);
  108.     w->next->prev = w->prev;
  109.     w->prev->next = w->next;
  110.     w->prev = w->next = w;
  111.     write_unlock_bh(&fib6_walker_lock);
  112. }
  113.  
  114. struct rt6_statistics {
  115.     __u32        fib_nodes;
  116.     __u32        fib_route_nodes;
  117.     __u32        fib_rt_alloc;        /* permanent routes    */
  118.     __u32        fib_rt_entries;        /* rt entries in table    */
  119.     __u32        fib_rt_cache;        /* cache routes        */
  120.     __u32        fib_discarded_routes;
  121. };
  122.  
  123. #define RTN_TL_ROOT    0x0001
  124. #define RTN_ROOT    0x0002        /* tree root node        */
  125. #define RTN_RTINFO    0x0004        /* node with valid routing info    */
  126.  
  127. /*
  128.  *    priority levels (or metrics)
  129.  *
  130.  */
  131.  
  132. #define RTPRI_FIREWALL    8        /* Firewall control information    */
  133. #define RTPRI_FLOW    16        /* Flow based forwarding rules    */
  134. #define RTPRI_KERN_CTL    32        /* Kernel control routes    */
  135.  
  136. #define RTPRI_USER_MIN    256        /* Mimimum user priority    */
  137. #define RTPRI_USER_MAX    1024        /* Maximum user priority    */
  138.  
  139. #define RTPRI_KERN_DFLT    4096        /* Kernel default routes    */
  140.  
  141. #define    MAX_FLOW_BACKTRACE    32
  142.  
  143.  
  144. typedef void            (*f_pnode)(struct fib6_node *fn, void *);
  145.  
  146. extern struct fib6_node        ip6_routing_table;
  147.  
  148. /*
  149.  *    exported functions
  150.  */
  151.  
  152. extern struct fib6_node        *fib6_lookup(struct fib6_node *root,
  153.                          struct in6_addr *daddr,
  154.                          struct in6_addr *saddr);
  155.  
  156. struct fib6_node        *fib6_locate(struct fib6_node *root,
  157.                          struct in6_addr *daddr, int dst_len,
  158.                          struct in6_addr *saddr, int src_len);
  159.  
  160. extern void            fib6_clean_tree(struct fib6_node *root,
  161.                         int (*func)(struct rt6_info *, void *arg),
  162.                         int prune, void *arg);
  163.  
  164. extern int            fib6_walk(struct fib6_walker_t *w);
  165. extern int            fib6_walk_continue(struct fib6_walker_t *w);
  166.  
  167. extern int            fib6_add(struct fib6_node *root,
  168.                      struct rt6_info *rt,
  169.                      struct nlmsghdr *nlh,
  170.                      void *rtattr,
  171.                      struct netlink_skb_parms *req);
  172.  
  173. extern int            fib6_del(struct rt6_info *rt,
  174.                      struct nlmsghdr *nlh,
  175.                      void *rtattr,
  176.                      struct netlink_skb_parms *req);
  177.  
  178. extern void            inet6_rt_notify(int event, struct rt6_info *rt,
  179.                         struct nlmsghdr *nlh,
  180.                         struct netlink_skb_parms *req);
  181.  
  182. extern void            fib6_run_gc(unsigned long dummy);
  183.  
  184. extern void            fib6_gc_cleanup(void);
  185.  
  186. extern void            fib6_init(void);
  187. #endif
  188. #endif
  189.