Annotation of embedaddon/quagga/zebra/rib.h, revision 1.1
1.1 ! misho 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:
! 23: #ifndef _ZEBRA_RIB_H
! 24: #define _ZEBRA_RIB_H
! 25:
! 26: #include "prefix.h"
! 27:
! 28: #define DISTANCE_INFINITY 255
! 29:
! 30: /* Routing information base. */
! 31:
! 32: union g_addr {
! 33: struct in_addr ipv4;
! 34: #ifdef HAVE_IPV6
! 35: struct in6_addr ipv6;
! 36: #endif /* HAVE_IPV6 */
! 37: };
! 38:
! 39: struct rib
! 40: {
! 41: /* Status Flags for the *route_node*, but kept in the head RIB.. */
! 42: u_char rn_status;
! 43: #define RIB_ROUTE_QUEUED(x) (1 << (x))
! 44:
! 45: /* Link list. */
! 46: struct rib *next;
! 47: struct rib *prev;
! 48:
! 49: /* Nexthop structure */
! 50: struct nexthop *nexthop;
! 51:
! 52: /* Refrence count. */
! 53: unsigned long refcnt;
! 54:
! 55: /* Uptime. */
! 56: time_t uptime;
! 57:
! 58: /* Type fo this route. */
! 59: int type;
! 60:
! 61: /* Which routing table */
! 62: int table;
! 63:
! 64: /* Metric */
! 65: u_int32_t metric;
! 66:
! 67: /* Distance. */
! 68: u_char distance;
! 69:
! 70: /* Flags of this route.
! 71: * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed
! 72: * to clients via Zserv
! 73: */
! 74: u_char flags;
! 75:
! 76: /* RIB internal status */
! 77: u_char status;
! 78: #define RIB_ENTRY_REMOVED (1 << 0)
! 79:
! 80: /* Nexthop information. */
! 81: u_char nexthop_num;
! 82: u_char nexthop_active_num;
! 83: u_char nexthop_fib_num;
! 84: };
! 85:
! 86: /* meta-queue structure:
! 87: * sub-queue 0: connected, kernel
! 88: * sub-queue 1: static
! 89: * sub-queue 2: RIP, RIPng, OSPF, OSPF6, IS-IS
! 90: * sub-queue 3: iBGP, eBGP
! 91: * sub-queue 4: any other origin (if any)
! 92: */
! 93: #define MQ_SIZE 5
! 94: struct meta_queue
! 95: {
! 96: struct list *subq[MQ_SIZE];
! 97: u_int32_t size; /* sum of lengths of all subqueues */
! 98: };
! 99:
! 100: /* Static route information. */
! 101: struct static_ipv4
! 102: {
! 103: /* For linked list. */
! 104: struct static_ipv4 *prev;
! 105: struct static_ipv4 *next;
! 106:
! 107: /* Administrative distance. */
! 108: u_char distance;
! 109:
! 110: /* Flag for this static route's type. */
! 111: u_char type;
! 112: #define STATIC_IPV4_GATEWAY 1
! 113: #define STATIC_IPV4_IFNAME 2
! 114: #define STATIC_IPV4_BLACKHOLE 3
! 115:
! 116: /* Nexthop value. */
! 117: union
! 118: {
! 119: struct in_addr ipv4;
! 120: char *ifname;
! 121: } gate;
! 122:
! 123: /* bit flags */
! 124: u_char flags;
! 125: /*
! 126: see ZEBRA_FLAG_REJECT
! 127: ZEBRA_FLAG_BLACKHOLE
! 128: */
! 129: };
! 130:
! 131: #ifdef HAVE_IPV6
! 132: /* Static route information. */
! 133: struct static_ipv6
! 134: {
! 135: /* For linked list. */
! 136: struct static_ipv6 *prev;
! 137: struct static_ipv6 *next;
! 138:
! 139: /* Administrative distance. */
! 140: u_char distance;
! 141:
! 142: /* Flag for this static route's type. */
! 143: u_char type;
! 144: #define STATIC_IPV6_GATEWAY 1
! 145: #define STATIC_IPV6_GATEWAY_IFNAME 2
! 146: #define STATIC_IPV6_IFNAME 3
! 147:
! 148: /* Nexthop value. */
! 149: struct in6_addr ipv6;
! 150: char *ifname;
! 151:
! 152: /* bit flags */
! 153: u_char flags;
! 154: /*
! 155: see ZEBRA_FLAG_REJECT
! 156: ZEBRA_FLAG_BLACKHOLE
! 157: */
! 158: };
! 159: #endif /* HAVE_IPV6 */
! 160:
! 161: enum nexthop_types_t
! 162: {
! 163: NEXTHOP_TYPE_IFINDEX = 1, /* Directly connected. */
! 164: NEXTHOP_TYPE_IFNAME, /* Interface route. */
! 165: NEXTHOP_TYPE_IPV4, /* IPv4 nexthop. */
! 166: NEXTHOP_TYPE_IPV4_IFINDEX, /* IPv4 nexthop with ifindex. */
! 167: NEXTHOP_TYPE_IPV4_IFNAME, /* IPv4 nexthop with ifname. */
! 168: NEXTHOP_TYPE_IPV6, /* IPv6 nexthop. */
! 169: NEXTHOP_TYPE_IPV6_IFINDEX, /* IPv6 nexthop with ifindex. */
! 170: NEXTHOP_TYPE_IPV6_IFNAME, /* IPv6 nexthop with ifname. */
! 171: NEXTHOP_TYPE_BLACKHOLE, /* Null0 nexthop. */
! 172: };
! 173:
! 174: /* Nexthop structure. */
! 175: struct nexthop
! 176: {
! 177: struct nexthop *next;
! 178: struct nexthop *prev;
! 179:
! 180: /* Interface index. */
! 181: char *ifname;
! 182: unsigned int ifindex;
! 183:
! 184: enum nexthop_types_t type;
! 185:
! 186: u_char flags;
! 187: #define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */
! 188: #define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */
! 189: #define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */
! 190:
! 191: /* Nexthop address or interface name. */
! 192: union g_addr gate;
! 193:
! 194: /* Recursive lookup nexthop. */
! 195: u_char rtype;
! 196: unsigned int rifindex;
! 197: union g_addr rgate;
! 198: union g_addr src;
! 199: };
! 200:
! 201: /* Routing table instance. */
! 202: struct vrf
! 203: {
! 204: /* Identifier. This is same as routing table vector index. */
! 205: u_int32_t id;
! 206:
! 207: /* Routing table name. */
! 208: char *name;
! 209:
! 210: /* Description. */
! 211: char *desc;
! 212:
! 213: /* FIB identifier. */
! 214: u_char fib_id;
! 215:
! 216: /* Routing table. */
! 217: struct route_table *table[AFI_MAX][SAFI_MAX];
! 218:
! 219: /* Static route configuration. */
! 220: struct route_table *stable[AFI_MAX][SAFI_MAX];
! 221: };
! 222:
! 223: extern struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int);
! 224: extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
! 225: extern struct nexthop *nexthop_blackhole_add (struct rib *);
! 226: extern struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *,
! 227: struct in_addr *);
! 228: extern void rib_lookup_and_dump (struct prefix_ipv4 *);
! 229: extern void rib_lookup_and_pushup (struct prefix_ipv4 *);
! 230: extern void rib_dump (const char *, const struct prefix_ipv4 *, const struct rib *);
! 231: extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *);
! 232: #define ZEBRA_RIB_LOOKUP_ERROR -1
! 233: #define ZEBRA_RIB_FOUND_EXACT 0
! 234: #define ZEBRA_RIB_FOUND_NOGATE 1
! 235: #define ZEBRA_RIB_FOUND_CONNECTED 2
! 236: #define ZEBRA_RIB_NOTFOUND 3
! 237:
! 238: #ifdef HAVE_IPV6
! 239: extern struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *);
! 240: #endif /* HAVE_IPV6 */
! 241:
! 242: extern struct vrf *vrf_lookup (u_int32_t);
! 243: extern struct route_table *vrf_table (afi_t afi, safi_t safi, u_int32_t id);
! 244: extern struct route_table *vrf_static_table (afi_t afi, safi_t safi, u_int32_t id);
! 245:
! 246: /* NOTE:
! 247: * All rib_add_ipv[46]* functions will not just add prefix into RIB, but
! 248: * also implicitly withdraw equal prefix of same type. */
! 249: extern int rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p,
! 250: struct in_addr *gate, struct in_addr *src,
! 251: unsigned int ifindex, u_int32_t vrf_id,
! 252: u_int32_t, u_char);
! 253:
! 254: extern int rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *);
! 255:
! 256: extern int rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
! 257: struct in_addr *gate, unsigned int ifindex,
! 258: u_int32_t);
! 259:
! 260: extern struct rib *rib_match_ipv4 (struct in_addr);
! 261:
! 262: extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *);
! 263:
! 264: extern void rib_update (void);
! 265: extern void rib_weed_tables (void);
! 266: extern void rib_sweep_route (void);
! 267: extern void rib_close (void);
! 268: extern void rib_init (void);
! 269:
! 270: extern int
! 271: static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
! 272: u_char flags, u_char distance, u_int32_t vrf_id);
! 273:
! 274: extern int
! 275: static_delete_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
! 276: u_char distance, u_int32_t vrf_id);
! 277:
! 278: #ifdef HAVE_IPV6
! 279: extern int
! 280: rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
! 281: struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
! 282: u_int32_t metric, u_char distance);
! 283:
! 284: extern int
! 285: rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
! 286: struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id);
! 287:
! 288: extern struct rib *rib_lookup_ipv6 (struct in6_addr *);
! 289:
! 290: extern struct rib *rib_match_ipv6 (struct in6_addr *);
! 291:
! 292: extern struct route_table *rib_table_ipv6;
! 293:
! 294: extern int
! 295: static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
! 296: const char *ifname, u_char flags, u_char distance,
! 297: u_int32_t vrf_id);
! 298:
! 299: extern int
! 300: static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
! 301: const char *ifname, u_char distance, u_int32_t vrf_id);
! 302:
! 303: #endif /* HAVE_IPV6 */
! 304:
! 305: #endif /*_ZEBRA_RIB_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>