mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 13:43:22 +00:00 
			
		
		
		
	* lib/version.h: add ZEBRA_URL (unused for now)
        * lib/vty.c: CMD_ERR_NOTHING_TODO when reading conf file should not
          be fatal. slight reformating.
        * ospfd/ospf_zebra.c: ignore reject/blackhole routes if zebra sends
          these type of routes. probably should be a new type of route to
          allow daemons to more easily choose whether to redistribute them
          - rathen than just a flag (eg for reject/blackhole).
          reorder the is_prefix_default test for ZEBRA_IPV4_ROUTE_DELETE to
          avoid the inverted test - slightly more readable.
        * redhat/zebra.spec.in: Add ospfapi port to services file, if
          with_ospfapi.
        * zebra/rib.h: Change nexthop types to an enum.
        * zebra/rt_netlink.c: run it through indent -nut.
          Add nexthop_types_desc[] descriptive array for nexthop types.
          (netlink_route_multipath) debug statements indicate which branch
          they are in and print out nexthop type.
        * zebra/zebra_rib.c: slight reformatting.
        * zebra/zebra_vty.c: Pass ZEBRA_FLAG_BLACKHOLE flag to
          static_add_ipv4() if Null0 route is configured. print out Null0 if
          STATIC_IPV4_BLACKHOLE route, and ignore flags (shouldnt be
          possible to set flags from vty) for config and show route.
		
	
			
		
			
				
	
	
		
			270 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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;
 | 
						|
 | 
						|
  /* bit flags */
 | 
						|
  u_char flags;
 | 
						|
/*
 | 
						|
 see ZEBRA_FLAG_REJECT
 | 
						|
     ZEBRA_FLAG_BLACKHOLE
 | 
						|
 */
 | 
						|
};
 | 
						|
 | 
						|
#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;
 | 
						|
 | 
						|
  /* bit flags */
 | 
						|
  u_char flags;
 | 
						|
/*
 | 
						|
 see ZEBRA_FLAG_REJECT
 | 
						|
     ZEBRA_FLAG_BLACKHOLE
 | 
						|
 */
 | 
						|
};
 | 
						|
#endif /* HAVE_IPV6 */
 | 
						|
 | 
						|
enum nexthop_types_t
 | 
						|
{
 | 
						|
  NEXTHOP_TYPE_IFINDEX = 1,      /* Directly connected.  */
 | 
						|
  NEXTHOP_TYPE_IFNAME,           /* Interface route.  */
 | 
						|
  NEXTHOP_TYPE_IPV4,             /* IPv4 nexthop.  */
 | 
						|
  NEXTHOP_TYPE_IPV4_IFINDEX,     /* IPv4 nexthop with ifindex.  */
 | 
						|
  NEXTHOP_TYPE_IPV4_IFNAME,      /* IPv4 nexthop with ifname.  */
 | 
						|
  NEXTHOP_TYPE_IPV6,             /* IPv6 nexthop.  */
 | 
						|
  NEXTHOP_TYPE_IPV6_IFINDEX,     /* IPv6 nexthop with ifindex.  */
 | 
						|
  NEXTHOP_TYPE_IPV6_IFNAME,      /* IPv6 nexthop with ifname.  */
 | 
						|
  NEXTHOP_TYPE_BLACKHOLE,        /* Null0 nexthop.  */
 | 
						|
};
 | 
						|
 | 
						|
/* Nexthop structure. */
 | 
						|
struct nexthop
 | 
						|
{
 | 
						|
  struct nexthop *next;
 | 
						|
  struct nexthop *prev;
 | 
						|
 | 
						|
  enum nexthop_types_t type;
 | 
						|
 | 
						|
  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 flags, 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 flags, 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 */
 |