diff options
author | paul <paul> | 2002-12-13 20:15:29 +0000 |
---|---|---|
committer | paul <paul> | 2002-12-13 20:15:29 +0000 |
commit | 718e3744195351130f4ce7dbe0613f4b3e23df93 (patch) | |
tree | bac2ad39971cd43f31241ef123bd4e470f695ac9 /zebra/rib.h |
Initial revision
Diffstat (limited to 'zebra/rib.h')
-rw-r--r-- | zebra/rib.h | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/zebra/rib.h b/zebra/rib.h new file mode 100644 index 00000000..f5012610 --- /dev/null +++ b/zebra/rib.h @@ -0,0 +1,251 @@ +/* + * Routing Information Base header + * Copyright (C) 1997 Kunihiro Ishiguro + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Zebra; see the file COPYING. If not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef _ZEBRA_RIB_H +#define _ZEBRA_RIB_H + +#define DISTANCE_INFINITY 255 + +/* Routing information base. */ +struct rib +{ + /* Link list. */ + struct rib *next; + struct rib *prev; + + /* Type fo this route. */ + int type; + + /* Which routing table */ + int table; + + /* Distance. */ + u_char distance; + + /* Flags of this route. This flag's definition is in lib/zebra.h + ZEBRA_FLAG_* */ + u_char flags; + + /* Metric */ + u_int32_t metric; + + /* Uptime. */ + time_t uptime; + + /* Refrence count. */ + unsigned long refcnt; + + /* Nexthop information. */ + u_char nexthop_num; + u_char nexthop_active_num; + u_char nexthop_fib_num; + + struct nexthop *nexthop; +}; + +/* Static route information. */ +struct static_ipv4 +{ + /* For linked list. */ + struct static_ipv4 *prev; + struct static_ipv4 *next; + + /* Administrative distance. */ + u_char distance; + + /* Flag for this static route's type. */ + u_char type; +#define STATIC_IPV4_GATEWAY 1 +#define STATIC_IPV4_IFNAME 2 +#define STATIC_IPV4_BLACKHOLE 3 + + /* Nexthop value. */ + union + { + struct in_addr ipv4; + char *ifname; + } gate; +}; + +#ifdef HAVE_IPV6 +/* Static route information. */ +struct static_ipv6 +{ + /* For linked list. */ + struct static_ipv6 *prev; + struct static_ipv6 *next; + + /* Administrative distance. */ + u_char distance; + + /* Flag for this static route's type. */ + u_char type; +#define STATIC_IPV6_GATEWAY 1 +#define STATIC_IPV6_GATEWAY_IFNAME 2 +#define STATIC_IPV6_IFNAME 3 + + /* Nexthop value. */ + struct in6_addr ipv6; + char *ifname; +}; +#endif /* HAVE_IPV6 */ + +/* Nexthop structure. */ +struct nexthop +{ + struct nexthop *next; + struct nexthop *prev; + + u_char type; +#define NEXTHOP_TYPE_IFINDEX 1 /* Directly connected. */ +#define NEXTHOP_TYPE_IFNAME 2 /* Interface route. */ +#define NEXTHOP_TYPE_IPV4 3 /* IPv4 nexthop. */ +#define NEXTHOP_TYPE_IPV4_IFINDEX 4 /* IPv4 nexthop with ifindex. */ +#define NEXTHOP_TYPE_IPV4_IFNAME 5 /* IPv4 nexthop with ifname. */ +#define NEXTHOP_TYPE_IPV6 6 /* IPv6 nexthop. */ +#define NEXTHOP_TYPE_IPV6_IFINDEX 7 /* IPv6 nexthop with ifindex. */ +#define NEXTHOP_TYPE_IPV6_IFNAME 8 /* IPv6 nexthop with ifname. */ +#define NEXTHOP_TYPE_BLACKHOLE 9 /* Null0 nexthop. */ + + u_char flags; +#define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */ +#define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */ +#define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */ + + /* Interface index. */ + unsigned int ifindex; + char *ifname; + + /* Nexthop address or interface name. */ + union + { + struct in_addr ipv4; +#ifdef HAVE_IPV6 + struct in6_addr ipv6; +#endif /* HAVE_IPV6*/ + } gate; + + /* Recursive lookup nexthop. */ + u_char rtype; + unsigned int rifindex; + union + { + struct in_addr ipv4; +#ifdef HAVE_IPV6 + struct in6_addr ipv6; +#endif /* HAVE_IPV6 */ + } rgate; + + struct nexthop *indirect; +}; + +/* Routing table instance. */ +struct vrf +{ + /* Identifier. This is same as routing table vector index. */ + u_int32_t id; + + /* Routing table name. */ + char *name; + + /* Description. */ + char *desc; + + /* FIB identifier. */ + u_char fib_id; + + /* Routing table. */ + struct route_table *table[AFI_MAX][SAFI_MAX]; + + /* Static route configuration. */ + struct route_table *stable[AFI_MAX][SAFI_MAX]; +}; + +struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int); +struct nexthop *nexthop_ifname_add (struct rib *, char *); +struct nexthop *nexthop_blackhole_add (struct rib *); +struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *); +#ifdef HAVE_IPV6 +struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *); +#endif /* HAVE_IPV6 */ + +struct vrf *vrf_lookup (u_int32_t); +struct route_table *vrf_table (afi_t afi, safi_t safi, u_int32_t id); +struct route_table *vrf_static_table (afi_t afi, safi_t safi, u_int32_t id); + +int +rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p, + struct in_addr *gate, unsigned int ifindex, u_int32_t vrf_id, + u_int32_t, u_char); + +int +rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *); + +int +rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p, + struct in_addr *gate, unsigned int ifindex, u_int32_t); + +struct rib * +rib_match_ipv4 (struct in_addr); + +struct rib * +rib_lookup_ipv4 (struct prefix_ipv4 *); + +void rib_update (); +void rib_sweep_route (); +void rib_close (); +void rib_init (); + +int +static_add_ipv4 (struct prefix *p, struct in_addr *gate, char *ifname, + u_char distance, u_int32_t vrf_id); + +int +static_delete_ipv4 (struct prefix *p, struct in_addr *gate, char *ifname, + u_char distance, u_int32_t vrf_id); + +#ifdef HAVE_IPV6 +int +rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p, + struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id); + +int +rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p, + struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id); + +struct rib *rib_lookup_ipv6 (struct in6_addr *); + +struct rib *rib_match_ipv6 (struct in6_addr *); + +extern struct route_table *rib_table_ipv6; + +int +static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate, + char *ifname, u_char distance, u_int32_t vrf_id); + +int +static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate, + char *ifname, u_char distance, u_int32_t vrf_id); + +#endif /* HAVE_IPV6 */ + +#endif /*_ZEBRA_RIB_H */ |