File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / zebra / rib.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_20_1, v0_99_20, HEAD
quagga

    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>