ip_fib.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. #ifndef _NET_IP_FIB_H
  16. #define _NET_IP_FIB_H
  17. #include <linux/config.h>
  18. struct kern_rta
  19. {
  20. void *rta_dst;
  21. void *rta_src;
  22. int *rta_iif;
  23. int *rta_oif;
  24. void *rta_gw;
  25. u32 *rta_priority;
  26. void *rta_prefsrc;
  27. struct rtattr *rta_mx;
  28. struct rtattr *rta_mp;
  29. unsigned char *rta_protoinfo;
  30. unsigned char *rta_flow;
  31. struct rta_cacheinfo *rta_ci;
  32. };
  33. struct fib_nh
  34. {
  35. struct net_device *nh_dev;
  36. unsigned nh_flags;
  37. unsigned char nh_scope;
  38. #ifdef CONFIG_IP_ROUTE_MULTIPATH
  39. int nh_weight;
  40. int nh_power;
  41. #endif
  42. #ifdef CONFIG_NET_CLS_ROUTE
  43. __u32 nh_tclassid;
  44. #endif
  45. int nh_oif;
  46. u32 nh_gw;
  47. };
  48. /*
  49.  * This structure contains data shared by many of routes.
  50.  */
  51. struct fib_info
  52. {
  53. struct fib_info *fib_next;
  54. struct fib_info *fib_prev;
  55. int fib_treeref;
  56. atomic_t fib_clntref;
  57. int fib_dead;
  58. unsigned fib_flags;
  59. int fib_protocol;
  60. u32 fib_prefsrc;
  61. u32 fib_priority;
  62. unsigned fib_metrics[RTAX_MAX];
  63. #define fib_mtu fib_metrics[RTAX_MTU-1]
  64. #define fib_window fib_metrics[RTAX_WINDOW-1]
  65. #define fib_rtt fib_metrics[RTAX_RTT-1]
  66. #define fib_advmss fib_metrics[RTAX_ADVMSS-1]
  67. int fib_nhs;
  68. #ifdef CONFIG_IP_ROUTE_MULTIPATH
  69. int fib_power;
  70. #endif
  71. struct fib_nh fib_nh[0];
  72. #define fib_dev fib_nh[0].nh_dev
  73. };
  74. #ifdef CONFIG_IP_MULTIPLE_TABLES
  75. struct fib_rule;
  76. #endif
  77. struct fib_result
  78. {
  79. unsigned char prefixlen;
  80. unsigned char nh_sel;
  81. unsigned char type;
  82. unsigned char scope;
  83. struct fib_info *fi;
  84. #ifdef CONFIG_IP_MULTIPLE_TABLES
  85. struct fib_rule *r;
  86. #endif
  87. };
  88. #ifdef CONFIG_IP_ROUTE_MULTIPATH
  89. #define FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel])
  90. #define FIB_RES_RESET(res) ((res).nh_sel = 0)
  91. #else /* CONFIG_IP_ROUTE_MULTIPATH */
  92. #define FIB_RES_NH(res) ((res).fi->fib_nh[0])
  93. #define FIB_RES_RESET(res)
  94. #endif /* CONFIG_IP_ROUTE_MULTIPATH */
  95. #define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res))
  96. #define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw)
  97. #define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev)
  98. #define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif)
  99. struct fib_table
  100. {
  101. unsigned char tb_id;
  102. unsigned tb_stamp;
  103. int (*tb_lookup)(struct fib_table *tb, const struct rt_key *key, struct fib_result *res);
  104. int (*tb_insert)(struct fib_table *table, struct rtmsg *r,
  105.      struct kern_rta *rta, struct nlmsghdr *n,
  106.      struct netlink_skb_parms *req);
  107. int (*tb_delete)(struct fib_table *table, struct rtmsg *r,
  108.      struct kern_rta *rta, struct nlmsghdr *n,
  109.      struct netlink_skb_parms *req);
  110. int (*tb_dump)(struct fib_table *table, struct sk_buff *skb,
  111.      struct netlink_callback *cb);
  112. int (*tb_flush)(struct fib_table *table);
  113. int (*tb_get_info)(struct fib_table *table, char *buf,
  114.        int first, int count);
  115. void (*tb_select_default)(struct fib_table *table,
  116.      const struct rt_key *key, struct fib_result *res);
  117. unsigned char tb_data[0];
  118. };
  119. #ifndef CONFIG_IP_MULTIPLE_TABLES
  120. extern struct fib_table *local_table;
  121. extern struct fib_table *main_table;
  122. static inline struct fib_table *fib_get_table(int id)
  123. {
  124. if (id != RT_TABLE_LOCAL)
  125. return main_table;
  126. return local_table;
  127. }
  128. static inline struct fib_table *fib_new_table(int id)
  129. {
  130. return fib_get_table(id);
  131. }
  132. static inline int fib_lookup(const struct rt_key *key, struct fib_result *res)
  133. {
  134. if (local_table->tb_lookup(local_table, key, res) &&
  135.     main_table->tb_lookup(main_table, key, res))
  136. return -ENETUNREACH;
  137. return 0;
  138. }
  139. static inline void fib_select_default(const struct rt_key *key, struct fib_result *res)
  140. {
  141. if (FIB_RES_GW(*res) && FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
  142. main_table->tb_select_default(main_table, key, res);
  143. }
  144. #else /* CONFIG_IP_MULTIPLE_TABLES */
  145. #define local_table (fib_tables[RT_TABLE_LOCAL])
  146. #define main_table (fib_tables[RT_TABLE_MAIN])
  147. extern struct fib_table * fib_tables[RT_TABLE_MAX+1];
  148. extern int fib_lookup(const struct rt_key *key, struct fib_result *res);
  149. extern struct fib_table *__fib_new_table(int id);
  150. extern void fib_rule_put(struct fib_rule *r);
  151. static inline struct fib_table *fib_get_table(int id)
  152. {
  153. if (id == 0)
  154. id = RT_TABLE_MAIN;
  155. return fib_tables[id];
  156. }
  157. static inline struct fib_table *fib_new_table(int id)
  158. {
  159. if (id == 0)
  160. id = RT_TABLE_MAIN;
  161. return fib_tables[id] ? : __fib_new_table(id);
  162. }
  163. extern void fib_select_default(const struct rt_key *key, struct fib_result *res);
  164. #endif /* CONFIG_IP_MULTIPLE_TABLES */
  165. /* Exported by fib_frontend.c */
  166. extern void ip_fib_init(void);
  167. extern void fib_flush(void);
  168. extern int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
  169. extern int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
  170. extern int inet_rtm_getroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
  171. extern int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb);
  172. extern int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
  173.        struct net_device *dev, u32 *spec_dst, u32 *itag);
  174. extern void fib_select_multipath(const struct rt_key *key, struct fib_result *res);
  175. /* Exported by fib_semantics.c */
  176. extern int  ip_fib_check_default(u32 gw, struct net_device *dev);
  177. extern void fib_release_info(struct fib_info *);
  178. extern int fib_semantic_match(int type, struct fib_info *,
  179.    const struct rt_key *, struct fib_result*);
  180. extern struct fib_info *fib_create_info(const struct rtmsg *r, struct kern_rta *rta,
  181.  const struct nlmsghdr *, int *err);
  182. extern int fib_nh_match(struct rtmsg *r, struct nlmsghdr *, struct kern_rta *rta, struct fib_info *fi);
  183. extern int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
  184.  u8 tb_id, u8 type, u8 scope, void *dst, int dst_len, u8 tos,
  185.  struct fib_info *fi);
  186. extern int fib_sync_down(u32 local, struct net_device *dev, int force);
  187. extern int fib_sync_up(struct net_device *dev);
  188. extern int fib_convert_rtentry(int cmd, struct nlmsghdr *nl, struct rtmsg *rtm,
  189.        struct kern_rta *rta, struct rtentry *r);
  190. extern void fib_node_get_info(int type, int dead, struct fib_info *fi, u32 prefix, u32 mask, char *buffer);
  191. extern u32  __fib_res_prefsrc(struct fib_result *res);
  192. /* Exported by fib_hash.c */
  193. extern struct fib_table *fib_hash_init(int id);
  194. #ifdef CONFIG_IP_MULTIPLE_TABLES
  195. /* Exported by fib_rules.c */
  196. extern int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
  197. extern int inet_rtm_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
  198. extern int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb);
  199. extern u32 fib_rules_map_destination(u32 daddr, struct fib_result *res);
  200. #ifdef CONFIG_NET_CLS_ROUTE
  201. extern u32 fib_rules_tclass(struct fib_result *res);
  202. #endif
  203. extern u32 fib_rules_policy(u32 saddr, struct fib_result *res, unsigned *flags);
  204. extern void fib_rules_init(void);
  205. #endif
  206. static inline void fib_combine_itag(u32 *itag, struct fib_result *res)
  207. {
  208. #ifdef CONFIG_NET_CLS_ROUTE
  209. #ifdef CONFIG_IP_MULTIPLE_TABLES
  210. u32 rtag;
  211. #endif
  212. *itag = FIB_RES_NH(*res).nh_tclassid<<16;
  213. #ifdef CONFIG_IP_MULTIPLE_TABLES
  214. rtag = fib_rules_tclass(res);
  215. if (*itag == 0)
  216. *itag = (rtag<<16);
  217. *itag |= (rtag>>16);
  218. #endif
  219. #endif
  220. }
  221. extern void free_fib_info(struct fib_info *fi);
  222. static inline void fib_info_put(struct fib_info *fi)
  223. {
  224. if (atomic_dec_and_test(&fi->fib_clntref))
  225. free_fib_info(fi);
  226. }
  227. static inline void fib_res_put(struct fib_result *res)
  228. {
  229. if (res->fi)
  230. fib_info_put(res->fi);
  231. #ifdef CONFIG_IP_MULTIPLE_TABLES
  232. if (res->r)
  233. fib_rule_put(res->r);
  234. #endif
  235. }
  236. #endif  /* _NET_FIB_H */