1/* BGP routing information base 2 Copyright (C) 1996, 97, 98, 2000 Kunihiro Ishiguro 3 4This file is part of GNU Zebra. 5 6GNU Zebra is free software; you can redistribute it and/or modify it 7under the terms of the GNU General Public License as published by the 8Free Software Foundation; either version 2, or (at your option) any 9later version. 10 11GNU Zebra is distributed in the hope that it will be useful, but 12WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with GNU Zebra; see the file COPYING. If not, write to the Free 18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 1902111-1307, USA. */ 20 21#ifndef _QUAGGA_BGP_ROUTE_H 22#define _QUAGGA_BGP_ROUTE_H 23 24#include "bgp_table.h" 25 26/* Ancillary information to struct bgp_info, 27 * used for uncommonly used data (aggregation, MPLS, etc.) 28 * and lazily allocated to save memory. 29 */ 30struct bgp_info_extra 31{ 32 /* Pointer to dampening structure. */ 33 struct bgp_damp_info *damp_info; 34 35 /* This route is suppressed with aggregation. */ 36 int suppress; 37 38 /* Nexthop reachability check. */ 39 u_int32_t igpmetric; 40 41 /* MPLS label. */ 42 u_char tag[3]; 43}; 44 45struct bgp_info 46{ 47 /* For linked list. */ 48 struct bgp_info *next; 49 struct bgp_info *prev; 50 51 /* Peer structure. */ 52 struct peer *peer; 53 54 /* Attribute structure. */ 55 struct attr *attr; 56 57 /* Extra information */ 58 struct bgp_info_extra *extra; 59 60 61 /* Multipath information */ 62 struct bgp_info_mpath *mpath; 63 64 /* Uptime. */ 65 time_t uptime; 66 67 /* reference count */ 68 int lock; 69 70 /* BGP information status. */ 71 u_int16_t flags; 72#define BGP_INFO_IGP_CHANGED (1 << 0) 73#define BGP_INFO_DAMPED (1 << 1) 74#define BGP_INFO_HISTORY (1 << 2) 75#define BGP_INFO_SELECTED (1 << 3) 76#define BGP_INFO_VALID (1 << 4) 77#define BGP_INFO_ATTR_CHANGED (1 << 5) 78#define BGP_INFO_DMED_CHECK (1 << 6) 79#define BGP_INFO_DMED_SELECTED (1 << 7) 80#define BGP_INFO_STALE (1 << 8) 81#define BGP_INFO_REMOVED (1 << 9) 82#define BGP_INFO_COUNTED (1 << 10) 83#define BGP_INFO_MULTIPATH (1 << 11) 84#define BGP_INFO_MULTIPATH_CHG (1 << 12) 85 86 /* BGP route type. This can be static, RIP, OSPF, BGP etc. */ 87 u_char type; 88 89 /* When above type is BGP. This sub type specify BGP sub type 90 information. */ 91 u_char sub_type; 92#define BGP_ROUTE_NORMAL 0 93#define BGP_ROUTE_STATIC 1 94#define BGP_ROUTE_AGGREGATE 2 95#define BGP_ROUTE_REDISTRIBUTE 3 96}; 97 98/* BGP static route configuration. */ 99struct bgp_static 100{ 101 /* Backdoor configuration. */ 102 int backdoor; 103 104 /* Import check status. */ 105 u_char valid; 106 107 /* IGP metric. */ 108 u_int32_t igpmetric; 109 110 /* IGP nexthop. */ 111 struct in_addr igpnexthop; 112 113 /* Atomic set reference count (ie cause of pathlimit) */ 114 u_int32_t atomic; 115 116 /* BGP redistribute route-map. */ 117 struct 118 { 119 char *name; 120 struct route_map *map; 121 } rmap; 122 123 /* MPLS label. */ 124 u_char tag[3]; 125}; 126 127/* Flags which indicate a route is unuseable in some form */ 128#define BGP_INFO_UNUSEABLE \ 129 (BGP_INFO_HISTORY|BGP_INFO_DAMPED|BGP_INFO_REMOVED) 130/* Macro to check BGP information is alive or not. Sadly, 131 * not equivalent to just checking previous, because of the 132 * sense of the additional VALID flag. 133 */ 134#define BGP_INFO_HOLDDOWN(BI) \ 135 (! CHECK_FLAG ((BI)->flags, BGP_INFO_VALID) \ 136 || CHECK_FLAG ((BI)->flags, BGP_INFO_UNUSEABLE)) 137 138#define DISTRIBUTE_IN_NAME(F) ((F)->dlist[FILTER_IN].name) 139#define DISTRIBUTE_IN(F) ((F)->dlist[FILTER_IN].alist) 140#define DISTRIBUTE_OUT_NAME(F) ((F)->dlist[FILTER_OUT].name) 141#define DISTRIBUTE_OUT(F) ((F)->dlist[FILTER_OUT].alist) 142 143#define PREFIX_LIST_IN_NAME(F) ((F)->plist[FILTER_IN].name) 144#define PREFIX_LIST_IN(F) ((F)->plist[FILTER_IN].plist) 145#define PREFIX_LIST_OUT_NAME(F) ((F)->plist[FILTER_OUT].name) 146#define PREFIX_LIST_OUT(F) ((F)->plist[FILTER_OUT].plist) 147 148#define FILTER_LIST_IN_NAME(F) ((F)->aslist[FILTER_IN].name) 149#define FILTER_LIST_IN(F) ((F)->aslist[FILTER_IN].aslist) 150#define FILTER_LIST_OUT_NAME(F) ((F)->aslist[FILTER_OUT].name) 151#define FILTER_LIST_OUT(F) ((F)->aslist[FILTER_OUT].aslist) 152 153#define ROUTE_MAP_IN_NAME(F) ((F)->map[RMAP_IN].name) 154#define ROUTE_MAP_IN(F) ((F)->map[RMAP_IN].map) 155#define ROUTE_MAP_OUT_NAME(F) ((F)->map[RMAP_OUT].name) 156#define ROUTE_MAP_OUT(F) ((F)->map[RMAP_OUT].map) 157 158#define ROUTE_MAP_IMPORT_NAME(F) ((F)->map[RMAP_IMPORT].name) 159#define ROUTE_MAP_IMPORT(F) ((F)->map[RMAP_IMPORT].map) 160#define ROUTE_MAP_EXPORT_NAME(F) ((F)->map[RMAP_EXPORT].name) 161#define ROUTE_MAP_EXPORT(F) ((F)->map[RMAP_EXPORT].map) 162 163#define UNSUPPRESS_MAP_NAME(F) ((F)->usmap.name) 164#define UNSUPPRESS_MAP(F) ((F)->usmap.map) 165 166enum bgp_clear_route_type 167{ 168 BGP_CLEAR_ROUTE_NORMAL, 169 BGP_CLEAR_ROUTE_MY_RSCLIENT 170}; 171 172/* Prototypes. */ 173extern void bgp_route_init (void); 174extern void bgp_route_finish (void); 175extern void bgp_cleanup_routes (void); 176extern void bgp_announce_route (struct peer *, afi_t, safi_t); 177extern void bgp_announce_route_all (struct peer *); 178extern void bgp_default_originate (struct peer *, afi_t, safi_t, int); 179extern void bgp_soft_reconfig_in (struct peer *, afi_t, safi_t); 180extern void bgp_soft_reconfig_rsclient (struct peer *, afi_t, safi_t); 181extern void bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi); 182extern void bgp_clear_route (struct peer *, afi_t, safi_t, 183 enum bgp_clear_route_type); 184extern void bgp_clear_route_all (struct peer *); 185extern void bgp_clear_adj_in (struct peer *, afi_t, safi_t); 186extern void bgp_clear_stale_route (struct peer *, afi_t, safi_t); 187 188extern struct bgp_info *bgp_info_lock (struct bgp_info *); 189extern struct bgp_info *bgp_info_unlock (struct bgp_info *); 190extern void bgp_info_add (struct bgp_node *rn, struct bgp_info *ri); 191extern void bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri); 192extern struct bgp_info_extra *bgp_info_extra_get (struct bgp_info *); 193extern void bgp_info_set_flag (struct bgp_node *, struct bgp_info *, u_int32_t); 194extern void bgp_info_unset_flag (struct bgp_node *, struct bgp_info *, u_int32_t); 195 196extern int bgp_nlri_sanity_check (struct peer *, int, u_char *, bgp_size_t); 197extern int bgp_nlri_parse (struct peer *, struct attr *, struct bgp_nlri *); 198 199extern int bgp_maximum_prefix_overflow (struct peer *, afi_t, safi_t, int); 200 201extern void bgp_redistribute_add (struct prefix *, const struct in_addr *, 202 const struct in6_addr *, 203 u_int32_t, u_char); 204extern void bgp_redistribute_delete (struct prefix *, u_char); 205extern void bgp_redistribute_withdraw (struct bgp *, afi_t, int); 206 207extern void bgp_static_delete (struct bgp *); 208extern void bgp_static_update (struct bgp *, struct prefix *, struct bgp_static *, 209 afi_t, safi_t); 210extern void bgp_static_withdraw (struct bgp *, struct prefix *, afi_t, safi_t); 211 212extern int bgp_static_set_vpnv4 (struct vty *vty, const char *, 213 const char *, const char *); 214 215extern int bgp_static_unset_vpnv4 (struct vty *, const char *, 216 const char *, const char *); 217 218/* this is primarily for MPLS-VPN */ 219extern int bgp_update (struct peer *, struct prefix *, struct attr *, 220 afi_t, safi_t, int, int, struct prefix_rd *, 221 u_char *, int); 222extern int bgp_withdraw (struct peer *, struct prefix *, struct attr *, 223 afi_t, safi_t, int, int, struct prefix_rd *, u_char *); 224 225/* for bgp_nexthop and bgp_damp */ 226extern void bgp_process (struct bgp *, struct bgp_node *, afi_t, safi_t); 227extern int bgp_config_write_network (struct vty *, struct bgp *, afi_t, safi_t, int *); 228extern int bgp_config_write_distance (struct vty *, struct bgp *); 229 230extern void bgp_aggregate_increment (struct bgp *, struct prefix *, struct bgp_info *, 231 afi_t, safi_t); 232extern void bgp_aggregate_decrement (struct bgp *, struct prefix *, struct bgp_info *, 233 afi_t, safi_t); 234 235extern u_char bgp_distance_apply (struct prefix *, struct bgp_info *, struct bgp *); 236 237extern afi_t bgp_node_afi (struct vty *); 238extern safi_t bgp_node_safi (struct vty *); 239 240extern void route_vty_out (struct vty *, struct prefix *, struct bgp_info *, int, safi_t); 241extern void route_vty_out_tag (struct vty *, struct prefix *, struct bgp_info *, int, safi_t); 242extern void route_vty_out_tmp (struct vty *, struct prefix *, struct attr *, safi_t); 243 244#endif /* _QUAGGA_BGP_ROUTE_H */ 245