diff options
Diffstat (limited to 'bgpd/bgp_route.h')
| -rw-r--r-- | bgpd/bgp_route.h | 503 | 
1 files changed, 254 insertions, 249 deletions
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index dbdcedd005..e7ff8294ed 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -27,116 +27,121 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  struct bgp_nexthop_cache;  struct bgp_route_evpn; -enum bgp_show_type -{ -  bgp_show_type_normal, -  bgp_show_type_regexp, -  bgp_show_type_prefix_list, -  bgp_show_type_filter_list, -  bgp_show_type_route_map, -  bgp_show_type_neighbor, -  bgp_show_type_cidr_only, -  bgp_show_type_prefix_longer, -  bgp_show_type_community_all, -  bgp_show_type_community, -  bgp_show_type_community_exact, -  bgp_show_type_community_list, -  bgp_show_type_community_list_exact, -  bgp_show_type_lcommunity_all, -  bgp_show_type_lcommunity, -  bgp_show_type_lcommunity_list, -  bgp_show_type_flap_statistics, -  bgp_show_type_flap_neighbor, -  bgp_show_type_dampend_paths, -  bgp_show_type_damp_neighbor +enum bgp_show_type { +	bgp_show_type_normal, +	bgp_show_type_regexp, +	bgp_show_type_prefix_list, +	bgp_show_type_filter_list, +	bgp_show_type_route_map, +	bgp_show_type_neighbor, +	bgp_show_type_cidr_only, +	bgp_show_type_prefix_longer, +	bgp_show_type_community_all, +	bgp_show_type_community, +	bgp_show_type_community_exact, +	bgp_show_type_community_list, +	bgp_show_type_community_list_exact, +	bgp_show_type_lcommunity_all, +	bgp_show_type_lcommunity, +	bgp_show_type_lcommunity_list, +	bgp_show_type_flap_statistics, +	bgp_show_type_flap_neighbor, +	bgp_show_type_dampend_paths, +	bgp_show_type_damp_neighbor  }; -#define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, "\ -                              "h history, * valid, > best, = multipath,%s"\ -                "              i internal, r RIB-failure, S Stale, R Removed%s" +#define BGP_SHOW_SCODE_HEADER                                                  \ +	"Status codes: s suppressed, d damped, "                               \ +	"h history, * valid, > best, = multipath,%s"                           \ +	"              i internal, r RIB-failure, S Stale, R Removed%s"  #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"  #define BGP_SHOW_HEADER "   Network          Next Hop            Metric LocPrf Weight Path%s" -/* Ancillary information to struct bgp_info,  +/* Ancillary information to struct bgp_info,   * used for uncommonly used data (aggregation, MPLS, etc.)   * and lazily allocated to save memory.   */ -struct bgp_info_extra -{ -  /* Pointer to dampening structure.  */ -  struct bgp_damp_info *damp_info; +struct bgp_info_extra { +	/* Pointer to dampening structure.  */ +	struct bgp_damp_info *damp_info; -  /* This route is suppressed with aggregation.  */ -  int suppress; +	/* This route is suppressed with aggregation.  */ +	int suppress; -  /* Nexthop reachability check.  */ -  u_int32_t igpmetric; +	/* Nexthop reachability check.  */ +	u_int32_t igpmetric; -  /* MPLS label.  */ -  u_char tag[3];   +	/* MPLS label.  */ +	u_char tag[3];  #if ENABLE_BGP_VNC -  union { - -      struct { -	  void *rfapi_handle;	/* export: NVE advertising this route */ -	  struct list	*local_nexthops; /* optional, for static routes */ -      } export; - -      struct { -	  void *timer; -	  void *hme;		/* encap monitor, if this is a VPN route */ -	  struct prefix_rd rd;	/* import: route's route-distinguisher */ -	  u_char un_family;	/* family of cached un address, 0 if unset */ -	  union { -	    struct in_addr addr4; -	    struct in6_addr addr6; -	  } un;			/* cached un address */ -	  time_t create_time; -	  struct prefix aux_prefix; /* AFI_L2VPN: the IP addr, if family set */ -      } import; - -  } vnc; +	union { + +		struct { +			void *rfapi_handle; /* export: NVE advertising this +					       route */ +			struct list *local_nexthops; /* optional, for static +							routes */ +		} export; + +		struct { +			void *timer; +			void *hme; /* encap monitor, if this is a VPN route */ +			struct prefix_rd +				rd; /* import: route's route-distinguisher */ +			u_char un_family; /* family of cached un address, 0 if +					     unset */ +			union { +				struct in_addr addr4; +				struct in6_addr addr6; +			} un; /* cached un address */ +			time_t create_time; +			struct +				prefix +					aux_prefix; /* AFI_L2VPN: the IP addr, +						       if family set */ +		} import; + +	} vnc;  #endif  }; -struct bgp_info -{ -  /* For linked list. */ -  struct bgp_info *next; -  struct bgp_info *prev; +struct bgp_info { +	/* For linked list. */ +	struct bgp_info *next; +	struct bgp_info *prev; + +	/* For nexthop linked list */ +	LIST_ENTRY(bgp_info) nh_thread; + +	/* Back pointer to the prefix node */ +	struct bgp_node *net; -  /* For nexthop linked list */ -  LIST_ENTRY(bgp_info) nh_thread; +	/* Back pointer to the nexthop structure */ +	struct bgp_nexthop_cache *nexthop; -  /* Back pointer to the prefix node */ -  struct bgp_node *net; +	/* Peer structure.  */ +	struct peer *peer; -  /* Back pointer to the nexthop structure */ -  struct bgp_nexthop_cache *nexthop; +	/* Attribute structure.  */ +	struct attr *attr; -  /* Peer structure.  */ -  struct peer *peer; +	/* Extra information */ +	struct bgp_info_extra *extra; -  /* Attribute structure.  */ -  struct attr *attr; -   -  /* Extra information */ -  struct bgp_info_extra *extra; -   -  /* Multipath information */ -  struct bgp_info_mpath *mpath; +	/* Multipath information */ +	struct bgp_info_mpath *mpath; -  /* Uptime.  */ -  time_t uptime; +	/* Uptime.  */ +	time_t uptime; -  /* reference count */ -  int lock; -   -  /* BGP information status.  */ -  u_int16_t flags; +	/* reference count */ +	int lock; + +	/* BGP information status.  */ +	u_int16_t flags;  #define BGP_INFO_IGP_CHANGED    (1 << 0)  #define BGP_INFO_DAMPED         (1 << 1)  #define BGP_INFO_HISTORY        (1 << 2) @@ -151,12 +156,12 @@ struct bgp_info  #define BGP_INFO_MULTIPATH      (1 << 11)  #define BGP_INFO_MULTIPATH_CHG  (1 << 12) -  /* BGP route type.  This can be static, RIP, OSPF, BGP etc.  */ -  u_char type; +	/* BGP route type.  This can be static, RIP, OSPF, BGP etc.  */ +	u_char type; -  /* When above type is BGP.  This sub type specify BGP sub type -     information.  */ -  u_char sub_type; +	/* When above type is BGP.  This sub type specify BGP sub type +	   information.  */ +	u_char sub_type;  #define BGP_ROUTE_NORMAL       0  #define BGP_ROUTE_STATIC       1  #define BGP_ROUTE_AGGREGATE    2 @@ -165,74 +170,72 @@ struct bgp_info  # define BGP_ROUTE_RFP          4   #endif -  u_short instance; - -  /* Addpath identifiers */ -  u_int32_t addpath_rx_id; -  u_int32_t addpath_tx_id; +	u_short instance; +	/* Addpath identifiers */ +	u_int32_t addpath_rx_id; +	u_int32_t addpath_tx_id;  };  /* BGP static route configuration. */ -struct bgp_static -{ -  /* Backdoor configuration.  */ -  int backdoor; - -  /* Import check status.  */ -  u_char valid; - -  /* IGP metric. */ -  u_int32_t igpmetric; - -  /* IGP nexthop. */ -  struct in_addr igpnexthop; - -  /* Atomic set reference count (ie cause of pathlimit) */ -  u_int32_t atomic; -   -  /* BGP redistribute route-map.  */ -  struct -  { -    char *name; -    struct route_map *map; -  } rmap; - -  /* Route Distinguisher */ -  struct prefix_rd     prd; - -  /* MPLS label.  */ -  u_char tag[3]; - -  /* EVPN */ -  struct eth_segment_id *eth_s_id; -  struct ethaddr *router_mac; -  uint16_t   encap_tunneltype; -  struct prefix gatewayIp; +struct bgp_static { +	/* Backdoor configuration.  */ +	int backdoor; + +	/* Import check status.  */ +	u_char valid; + +	/* IGP metric. */ +	u_int32_t igpmetric; + +	/* IGP nexthop. */ +	struct in_addr igpnexthop; + +	/* Atomic set reference count (ie cause of pathlimit) */ +	u_int32_t atomic; + +	/* BGP redistribute route-map.  */ +	struct { +		char *name; +		struct route_map *map; +	} rmap; + +	/* Route Distinguisher */ +	struct prefix_rd prd; + +	/* MPLS label.  */ +	u_char tag[3]; + +	/* EVPN */ +	struct eth_segment_id *eth_s_id; +	struct ethaddr *router_mac; +	uint16_t encap_tunneltype; +	struct prefix gatewayIp;  }; -#define BGP_NEXTHOP_AFI_FROM_NHLEN(nhlen) \ -  ((nhlen) < IPV4_MAX_BYTELEN  ? 0 : \ -   ((nhlen) < IPV6_MAX_BYTELEN ? AFI_IP : AFI_IP6)) +#define BGP_NEXTHOP_AFI_FROM_NHLEN(nhlen)                                      \ +	((nhlen) < IPV4_MAX_BYTELEN                                            \ +		 ? 0                                                           \ +		 : ((nhlen) < IPV6_MAX_BYTELEN ? AFI_IP : AFI_IP6)) -#define BGP_ATTR_NEXTHOP_AFI_IP6(attr) \ -  (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP)) && \ -   (attr)->extra && ((attr)->extra->mp_nexthop_len == 16 || \ -    (attr)->extra->mp_nexthop_len == 32)) -#define BGP_INFO_COUNTABLE(BI) \ -  (! CHECK_FLAG ((BI)->flags, BGP_INFO_HISTORY) \ -   && ! CHECK_FLAG ((BI)->flags, BGP_INFO_REMOVED)) +#define BGP_ATTR_NEXTHOP_AFI_IP6(attr)                                         \ +	(!CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP))             \ +	 && (attr)->extra && ((attr)->extra->mp_nexthop_len == 16              \ +			      || (attr)->extra->mp_nexthop_len == 32)) +#define BGP_INFO_COUNTABLE(BI)                                                 \ +	(!CHECK_FLAG((BI)->flags, BGP_INFO_HISTORY)                            \ +	 && !CHECK_FLAG((BI)->flags, BGP_INFO_REMOVED))  /* Flags which indicate a route is unuseable in some form */ -#define BGP_INFO_UNUSEABLE \ -  (BGP_INFO_HISTORY|BGP_INFO_DAMPED|BGP_INFO_REMOVED) +#define BGP_INFO_UNUSEABLE                                                     \ +	(BGP_INFO_HISTORY | BGP_INFO_DAMPED | BGP_INFO_REMOVED)  /* Macro to check BGP information is alive or not.  Sadly,   * not equivalent to just checking previous, because of the   * sense of the additional VALID flag.   */ -#define BGP_INFO_HOLDDOWN(BI) \ -  (! CHECK_FLAG ((BI)->flags, BGP_INFO_VALID) \ -   || CHECK_FLAG ((BI)->flags, BGP_INFO_UNUSEABLE)) +#define BGP_INFO_HOLDDOWN(BI)                                                  \ +	(!CHECK_FLAG((BI)->flags, BGP_INFO_VALID)                              \ +	 || CHECK_FLAG((BI)->flags, BGP_INFO_UNUSEABLE))  #define DISTRIBUTE_IN_NAME(F)   ((F)->dlist[FILTER_IN].name)  #define DISTRIBUTE_IN(F)        ((F)->dlist[FILTER_IN].alist) @@ -260,131 +263,133 @@ struct bgp_static  /* path PREFIX (addpath rxid NUMBER) */  #define PATH_ADDPATH_STR_BUFFER PREFIX2STR_BUFFER + 32 -enum bgp_path_type -{ -  BGP_PATH_ALL, -  BGP_PATH_BESTPATH, -  BGP_PATH_MULTIPATH -}; +enum bgp_path_type { BGP_PATH_ALL, BGP_PATH_BESTPATH, BGP_PATH_MULTIPATH }; -static inline void -bgp_bump_version (struct bgp_node *node) +static inline void bgp_bump_version(struct bgp_node *node)  { -  node->version = bgp_table_next_version(bgp_node_table(node)); +	node->version = bgp_table_next_version(bgp_node_table(node));  }  /* Prototypes. */ -extern void bgp_process_queue_init (void); -extern void bgp_route_init (void); -extern void bgp_route_finish (void); -extern void bgp_cleanup_routes (struct bgp *); -extern void bgp_announce_route (struct peer *, afi_t, safi_t); +extern void bgp_process_queue_init(void); +extern void bgp_route_init(void); +extern void bgp_route_finish(void); +extern void bgp_cleanup_routes(struct bgp *); +extern void bgp_announce_route(struct peer *, afi_t, safi_t);  extern void bgp_stop_announce_route_timer(struct peer_af *paf); -extern void bgp_announce_route_all (struct peer *); -extern void bgp_default_originate (struct peer *, afi_t, safi_t, int); -extern void bgp_soft_reconfig_in (struct peer *, afi_t, safi_t); -extern void bgp_clear_route (struct peer *, afi_t, safi_t); -extern void bgp_clear_route_all (struct peer *); -extern void bgp_clear_adj_in (struct peer *, afi_t, safi_t); -extern void bgp_clear_stale_route (struct peer *, afi_t, safi_t); - -extern struct bgp_node *bgp_afi_node_get (struct bgp_table *table, afi_t afi, -                                          safi_t safi, struct prefix *p, -                                          struct prefix_rd *prd); -extern struct bgp_info *bgp_info_lock (struct bgp_info *); -extern struct bgp_info *bgp_info_unlock (struct bgp_info *); -extern void bgp_info_add (struct bgp_node *rn, struct bgp_info *ri); -extern void bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri); -extern struct bgp_info_extra *bgp_info_extra_get (struct bgp_info *); -extern void bgp_info_set_flag (struct bgp_node *, struct bgp_info *, u_int32_t); -extern void bgp_info_unset_flag (struct bgp_node *, struct bgp_info *, u_int32_t); -extern void bgp_info_path_with_addpath_rx_str (struct bgp_info *ri, char *buf); - -extern int bgp_nlri_parse_ip (struct peer *, struct attr *, struct bgp_nlri *); - -extern int bgp_maximum_prefix_overflow (struct peer *, afi_t, safi_t, int); - -extern void bgp_redistribute_add (struct bgp *, struct prefix *, const struct in_addr *, -				  const struct in6_addr *, unsigned int ifindex, -				  u_int32_t, u_char, u_short, route_tag_t); -extern void bgp_redistribute_delete (struct bgp *, struct prefix *, u_char, u_short); -extern void bgp_redistribute_withdraw (struct bgp *, afi_t, int, u_short); - -extern void bgp_static_add (struct bgp *); -extern void bgp_static_delete (struct bgp *); -extern void bgp_static_redo_import_check (struct bgp *); -extern void bgp_purge_static_redist_routes (struct bgp *bgp); -extern void bgp_static_update (struct bgp *, struct prefix *, struct bgp_static *, -			afi_t, safi_t); -extern void bgp_static_withdraw (struct bgp *, struct prefix *, afi_t, safi_t); -                      -extern int bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *, -                                const char *, const char *, const char *, -                                int, const char *, const char *, const char *, const char *); - -extern int bgp_static_unset_safi (afi_t afi, safi_t safi, struct vty *, const char *, -                                  const char *, const char *, -                                  int, const char *, const char *, const char *); +extern void bgp_announce_route_all(struct peer *); +extern void bgp_default_originate(struct peer *, afi_t, safi_t, int); +extern void bgp_soft_reconfig_in(struct peer *, afi_t, safi_t); +extern void bgp_clear_route(struct peer *, afi_t, safi_t); +extern void bgp_clear_route_all(struct peer *); +extern void bgp_clear_adj_in(struct peer *, afi_t, safi_t); +extern void bgp_clear_stale_route(struct peer *, afi_t, safi_t); + +extern struct bgp_node *bgp_afi_node_get(struct bgp_table *table, afi_t afi, +					 safi_t safi, struct prefix *p, +					 struct prefix_rd *prd); +extern struct bgp_info *bgp_info_lock(struct bgp_info *); +extern struct bgp_info *bgp_info_unlock(struct bgp_info *); +extern void bgp_info_add(struct bgp_node *rn, struct bgp_info *ri); +extern void bgp_info_delete(struct bgp_node *rn, struct bgp_info *ri); +extern struct bgp_info_extra *bgp_info_extra_get(struct bgp_info *); +extern void bgp_info_set_flag(struct bgp_node *, struct bgp_info *, u_int32_t); +extern void bgp_info_unset_flag(struct bgp_node *, struct bgp_info *, +				u_int32_t); +extern void bgp_info_path_with_addpath_rx_str(struct bgp_info *ri, char *buf); + +extern int bgp_nlri_parse_ip(struct peer *, struct attr *, struct bgp_nlri *); + +extern int bgp_maximum_prefix_overflow(struct peer *, afi_t, safi_t, int); + +extern void bgp_redistribute_add(struct bgp *, struct prefix *, +				 const struct in_addr *, +				 const struct in6_addr *, unsigned int ifindex, +				 u_int32_t, u_char, u_short, route_tag_t); +extern void bgp_redistribute_delete(struct bgp *, struct prefix *, u_char, +				    u_short); +extern void bgp_redistribute_withdraw(struct bgp *, afi_t, int, u_short); + +extern void bgp_static_add(struct bgp *); +extern void bgp_static_delete(struct bgp *); +extern void bgp_static_redo_import_check(struct bgp *); +extern void bgp_purge_static_redist_routes(struct bgp *bgp); +extern void bgp_static_update(struct bgp *, struct prefix *, +			      struct bgp_static *, afi_t, safi_t); +extern void bgp_static_withdraw(struct bgp *, struct prefix *, afi_t, safi_t); + +extern int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty, +			       const char *, const char *, const char *, +			       const char *, int, const char *, const char *, +			       const char *, const char *); + +extern int bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *, +				 const char *, const char *, const char *, int, +				 const char *, const char *, const char *);  /* this is primarily for MPLS-VPN */ -extern int bgp_update (struct peer *, struct prefix *, u_int32_t, struct attr *, -		       afi_t, safi_t, int, int, struct prefix_rd *, -		       u_char *, int, struct bgp_route_evpn *); -extern int bgp_withdraw (struct peer *, struct prefix *, u_int32_t, struct attr *, -			 afi_t, safi_t, int, int, struct prefix_rd *, u_char *,  -                         struct bgp_route_evpn *); +extern int bgp_update(struct peer *, struct prefix *, u_int32_t, struct attr *, +		      afi_t, safi_t, int, int, struct prefix_rd *, u_char *, +		      int, struct bgp_route_evpn *); +extern int bgp_withdraw(struct peer *, struct prefix *, u_int32_t, +			struct attr *, afi_t, safi_t, int, int, +			struct prefix_rd *, u_char *, struct bgp_route_evpn *);  /* for bgp_nexthop and bgp_damp */ -extern void bgp_process (struct bgp *, struct bgp_node *, afi_t, safi_t); +extern void bgp_process(struct bgp *, struct bgp_node *, afi_t, safi_t);  /*   * Add an end-of-initial-update marker to the process queue. This is just a   * queue element with NULL bgp node.   */ -extern void bgp_add_eoiu_mark (struct bgp *); -extern int bgp_config_write_table_map (struct vty *, struct bgp *, afi_t, safi_t, -                                       int *); -extern int bgp_config_write_network (struct vty *, struct bgp *, afi_t, safi_t, int *); -extern int bgp_config_write_distance (struct vty *, struct bgp *, afi_t, safi_t, int *); - -extern void bgp_aggregate_increment (struct bgp *, struct prefix *, struct bgp_info *, -			      afi_t, safi_t); -extern void bgp_aggregate_decrement (struct bgp *, struct prefix *, struct bgp_info *, -			      afi_t, safi_t); - -extern u_char bgp_distance_apply (struct prefix *, struct bgp_info *, afi_t, safi_t, struct bgp *); - -extern afi_t bgp_node_afi (struct vty *); -extern safi_t bgp_node_safi (struct vty *); - -extern void route_vty_out (struct vty *, struct prefix *, struct bgp_info *, int, safi_t, json_object *); -extern void route_vty_out_tag (struct vty *, struct prefix *, struct bgp_info *, int, safi_t, json_object *); -extern void route_vty_out_tmp (struct vty *, struct prefix *, struct attr *, safi_t, u_char, json_object *); -extern void -route_vty_out_overlay (struct vty *vty, struct prefix *p, -                       struct bgp_info *binfo, int display, json_object *json); - -extern int -subgroup_process_announce_selected (struct update_subgroup *subgrp, -				    struct bgp_info *selected, -                                    struct bgp_node *rn, -                                    u_int32_t addpath_tx_id); +extern void bgp_add_eoiu_mark(struct bgp *); +extern int bgp_config_write_table_map(struct vty *, struct bgp *, afi_t, safi_t, +				      int *); +extern int bgp_config_write_network(struct vty *, struct bgp *, afi_t, safi_t, +				    int *); +extern int bgp_config_write_distance(struct vty *, struct bgp *, afi_t, safi_t, +				     int *); + +extern void bgp_aggregate_increment(struct bgp *, struct prefix *, +				    struct bgp_info *, afi_t, safi_t); +extern void bgp_aggregate_decrement(struct bgp *, struct prefix *, +				    struct bgp_info *, afi_t, safi_t); + +extern u_char bgp_distance_apply(struct prefix *, struct bgp_info *, afi_t, +				 safi_t, struct bgp *); + +extern afi_t bgp_node_afi(struct vty *); +extern safi_t bgp_node_safi(struct vty *); + +extern void route_vty_out(struct vty *, struct prefix *, struct bgp_info *, int, +			  safi_t, json_object *); +extern void route_vty_out_tag(struct vty *, struct prefix *, struct bgp_info *, +			      int, safi_t, json_object *); +extern void route_vty_out_tmp(struct vty *, struct prefix *, struct attr *, +			      safi_t, u_char, json_object *); +extern void route_vty_out_overlay(struct vty *vty, struct prefix *p, +				  struct bgp_info *binfo, int display, +				  json_object *json); + +extern int subgroup_process_announce_selected(struct update_subgroup *subgrp, +					      struct bgp_info *selected, +					      struct bgp_node *rn, +					      u_int32_t addpath_tx_id);  extern int subgroup_announce_check(struct bgp_info *ri,  				   struct update_subgroup *subgrp,  				   struct prefix *p, struct attr *attr); -extern void bgp_peer_clear_node_queue_drain_immediate (struct peer *peer); -extern void bgp_process_queues_drain_immediate (void); +extern void bgp_peer_clear_node_queue_drain_immediate(struct peer *peer); +extern void bgp_process_queues_drain_immediate(void);  /* for encap/vpn */ -extern struct bgp_node * -bgp_afi_node_get (struct bgp_table *, afi_t , safi_t , struct prefix *, - 		  struct prefix_rd *); -extern struct bgp_info *bgp_info_new (void); -extern void bgp_info_restore (struct bgp_node *, struct bgp_info *); - -extern int bgp_info_cmp_compatible (struct bgp *, struct bgp_info *, -                                    struct bgp_info *, afi_t, safi_t ); +extern struct bgp_node *bgp_afi_node_get(struct bgp_table *, afi_t, safi_t, +					 struct prefix *, struct prefix_rd *); +extern struct bgp_info *bgp_info_new(void); +extern void bgp_info_restore(struct bgp_node *, struct bgp_info *); + +extern int bgp_info_cmp_compatible(struct bgp *, struct bgp_info *, +				   struct bgp_info *, afi_t, safi_t);  #endif /* _QUAGGA_BGP_ROUTE_H */  | 
