rib.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:6k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Routing Information Base header
  3.  * Copyright (C) 1997 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20.  * 02111-1307, USA.  
  21.  */
  22. #ifndef _ZEBRA_RIB_H
  23. #define _ZEBRA_RIB_H
  24. #define DISTANCE_INFINITY  255
  25. /* Routing information base. */
  26. struct rib
  27. {
  28.   /* Link list. */
  29.   struct rib *next;
  30.   struct rib *prev;
  31.   /* Type fo this route. */
  32.   int type;
  33.   /* Which routing table */
  34.   int table;
  35.   /* Distance. */
  36.   u_char distance;
  37.   /* Flags of this route.  This flag's definition is in lib/zebra.h
  38.      ZEBRA_FLAG_* */
  39.   u_char flags;
  40.   /* Metric */
  41.   u_int32_t metric;
  42.   /* Uptime. */
  43.   time_t uptime;
  44.   /* Refrence count. */
  45.   unsigned long refcnt;
  46.   /* Nexthop information. */
  47.   u_char nexthop_num;
  48.   u_char nexthop_active_num;
  49.   u_char nexthop_fib_num;
  50.   struct nexthop *nexthop;
  51. };
  52. /* Static route information. */
  53. struct static_ipv4
  54. {
  55.   /* For linked list. */
  56.   struct static_ipv4 *prev;
  57.   struct static_ipv4 *next;
  58.   /* Administrative distance. */
  59.   u_char distance;
  60.   /* Flag for this static route's type. */
  61.   u_char type;
  62. #define STATIC_IPV4_GATEWAY     1
  63. #define STATIC_IPV4_IFNAME      2
  64. #define STATIC_IPV4_BLACKHOLE   3
  65.   /* Nexthop value. */
  66.   union 
  67.   {
  68.     struct in_addr ipv4;
  69.     char *ifname;
  70.   } gate;
  71. };
  72. #ifdef HAVE_IPV6
  73. /* Static route information. */
  74. struct static_ipv6
  75. {
  76.   /* For linked list. */
  77.   struct static_ipv6 *prev;
  78.   struct static_ipv6 *next;
  79.   /* Administrative distance. */
  80.   u_char distance;
  81.   /* Flag for this static route's type. */
  82.   u_char type;
  83. #define STATIC_IPV6_GATEWAY          1
  84. #define STATIC_IPV6_GATEWAY_IFNAME   2
  85. #define STATIC_IPV6_IFNAME           3
  86. #define STATIC_IPV6_BLACKHOLE        4
  87.   /* Nexthop value. */
  88.   struct in6_addr ipv6;
  89.   char *ifname;
  90. };
  91. #endif /* HAVE_IPV6 */
  92. /* Nexthop structure. */
  93. struct nexthop
  94. {
  95.   struct nexthop *next;
  96.   struct nexthop *prev;
  97.   u_char type;
  98. #define NEXTHOP_TYPE_IFINDEX        1 /* Directly connected.  */
  99. #define NEXTHOP_TYPE_IFNAME         2 /* Interface route.  */
  100. #define NEXTHOP_TYPE_IPV4           3 /* IPv4 nexthop.  */
  101. #define NEXTHOP_TYPE_IPV4_IFINDEX   4 /* IPv4 nexthop with ifindex.  */
  102. #define NEXTHOP_TYPE_IPV4_IFNAME    5 /* IPv4 nexthop with ifname.  */
  103. #define NEXTHOP_TYPE_IPV6           6 /* IPv6 nexthop.  */
  104. #define NEXTHOP_TYPE_IPV6_IFINDEX   7 /* IPv6 nexthop with ifindex.  */
  105. #define NEXTHOP_TYPE_IPV6_IFNAME    8 /* IPv6 nexthop with ifname.  */
  106. #define NEXTHOP_TYPE_BLACKHOLE      9 /* Null0 nexthop.  */
  107.   u_char flags;
  108. #define NEXTHOP_FLAG_ACTIVE     (1 << 0) /* This nexthop is alive. */
  109. #define NEXTHOP_FLAG_FIB        (1 << 1) /* FIB nexthop. */
  110. #define NEXTHOP_FLAG_RECURSIVE  (1 << 2) /* Recursive nexthop. */
  111.   /* Interface index. */
  112.   unsigned int ifindex;
  113.   char *ifname;
  114.   /* Nexthop address or interface name. */
  115.   union
  116.   {
  117.     struct in_addr ipv4;
  118. #ifdef HAVE_IPV6
  119.     struct in6_addr ipv6;
  120. #endif /* HAVE_IPV6*/
  121.   } gate;
  122.   /* Recursive lookup nexthop. */
  123.   u_char rtype;
  124.   unsigned int rifindex;
  125.   union
  126.   {
  127.     struct in_addr ipv4;
  128. #ifdef HAVE_IPV6
  129.     struct in6_addr ipv6;
  130. #endif /* HAVE_IPV6 */
  131.   } rgate;
  132.   struct nexthop *indirect;
  133. };
  134. /* Routing table instance.  */
  135. struct vrf
  136. {
  137.   /* Identifier.  This is same as routing table vector index.  */
  138.   u_int32_t id;
  139.   /* Routing table name.  */
  140.   char *name;
  141.   /* Description.  */
  142.   char *desc;
  143.   /* FIB identifier.  */
  144.   u_char fib_id;
  145.   /* Routing table.  */
  146.   struct route_table *table[AFI_MAX][SAFI_MAX];
  147.   /* Static route configuration.  */
  148.   struct route_table *stable[AFI_MAX][SAFI_MAX];
  149. };
  150. struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int);
  151. struct nexthop *nexthop_ifname_add (struct rib *, char *);
  152. struct nexthop *nexthop_blackhole_add (struct rib *);
  153. struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *);
  154. #ifdef HAVE_IPV6
  155. struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *);
  156. #endif /* HAVE_IPV6 */
  157. struct vrf *vrf_lookup (u_int32_t);
  158. struct route_table *vrf_table (afi_t afi, safi_t safi, u_int32_t id);
  159. struct route_table *vrf_static_table (afi_t afi, safi_t safi, u_int32_t id);
  160. int
  161. rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p, 
  162.       struct in_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
  163.       u_int32_t, u_char);
  164. int
  165. rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *);
  166. int
  167. rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
  168.  struct in_addr *gate, unsigned int ifindex, u_int32_t);
  169. struct rib *
  170. rib_match_ipv4 (struct in_addr);
  171. struct rib *
  172. rib_lookup_ipv4 (struct prefix_ipv4 *);
  173. void rib_update ();
  174. void rib_sweep_route ();
  175. void rib_close ();
  176. void rib_init ();
  177. int
  178. static_add_ipv4 (struct prefix *p, struct in_addr *gate, char *ifname,
  179.  u_char distance, u_int32_t vrf_id);
  180. int
  181. static_delete_ipv4 (struct prefix *p, struct in_addr *gate, char *ifname,
  182.     u_char distance, u_int32_t vrf_id);
  183. #ifdef HAVE_IPV6
  184. int
  185. rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
  186.       struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id);
  187. int
  188. rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
  189.  struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id);
  190. struct rib *rib_lookup_ipv6 (struct in6_addr *);
  191. struct rib *rib_match_ipv6 (struct in6_addr *);
  192. extern struct route_table *rib_table_ipv6;
  193. int
  194. static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
  195.  char *ifname, u_char distance, u_int32_t vrf_id);
  196. int
  197. static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
  198.     char *ifname, u_char distance, u_int32_t vrf_id);
  199. #endif /* HAVE_IPV6 */
  200. #endif /*_ZEBRA_RIB_H */