1/* BGP flap dampening 2 Copyright (C) 2001 IP Infusion Inc. 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_DAMP_H 22#define _QUAGGA_BGP_DAMP_H 23 24/* Structure maintained on a per-route basis. */ 25struct bgp_damp_info 26{ 27 /* Doubly linked list. This information must be linked to 28 reuse_list or no_reuse_list. */ 29 struct bgp_damp_info *next; 30 struct bgp_damp_info *prev; 31 32 /* Figure-of-merit. */ 33 unsigned int penalty; 34 35 /* Number of flapping. */ 36 unsigned int flap; 37 38 /* First flap time */ 39 time_t start_time; 40 41 /* Last time penalty was updated. */ 42 time_t t_updated; 43 44 /* Time of route start to be suppressed. */ 45 time_t suppress_time; 46 47 /* Back reference to bgp_info. */ 48 struct bgp_info *binfo; 49 50 /* Back reference to bgp_node. */ 51 struct bgp_node *rn; 52 53 /* Current index in the reuse_list. */ 54 int index; 55 56 /* Last time message type. */ 57 u_char lastrecord; 58#define BGP_RECORD_UPDATE 1U 59#define BGP_RECORD_WITHDRAW 2U 60 61 afi_t afi; 62 safi_t safi; 63}; 64 65/* Specified parameter set configuration. */ 66struct bgp_damp_config 67{ 68 /* Value over which routes suppressed. */ 69 unsigned int suppress_value; 70 71 /* Value below which suppressed routes reused. */ 72 unsigned int reuse_limit; 73 74 /* Max time a route can be suppressed. */ 75 time_t max_suppress_time; 76 77 /* Time during which accumulated penalty reduces by half. */ 78 time_t half_life; 79 80 /* Non-configurable parameters but fixed at implementation time. 81 * To change this values, init_bgp_damp() should be modified. 82 */ 83 time_t tmax; /* Max time previous instability retained */ 84 unsigned int reuse_list_size; /* Number of reuse lists */ 85 unsigned int reuse_index_size; /* Size of reuse index array */ 86 87 /* Non-configurable parameters. Most of these are calculated from 88 * the configurable parameters above. 89 */ 90 unsigned int ceiling; /* Max value a penalty can attain */ 91 unsigned int decay_rate_per_tick; /* Calculated from half-life */ 92 unsigned int decay_array_size; /* Calculated using config parameters */ 93 double scale_factor; 94 unsigned int reuse_scale_factor; 95 96 /* Decay array per-set based. */ 97 double *decay_array; 98 99 /* Reuse index array per-set based. */ 100 int *reuse_index; 101 102 /* Reuse list array per-set based. */ 103 struct bgp_damp_info **reuse_list; 104 int reuse_offset; 105 106 /* All dampening information which is not on reuse list. */ 107 struct bgp_damp_info *no_reuse_list; 108 109 /* Reuse timer thread per-set base. */ 110 struct thread* t_reuse; 111}; 112 113#define BGP_DAMP_NONE 0 114#define BGP_DAMP_USED 1 115#define BGP_DAMP_SUPPRESSED 2 116 117/* Time granularity for reuse lists */ 118#define DELTA_REUSE 10 119 120/* Time granularity for decay arrays */ 121#define DELTA_T 5 122 123#define DEFAULT_PENALTY 1000 124 125#define DEFAULT_HALF_LIFE 15 126#define DEFAULT_REUSE 750 127#define DEFAULT_SUPPRESS 2000 128 129#define REUSE_LIST_SIZE 256 130#define REUSE_ARRAY_SIZE 1024 131 132extern int bgp_damp_enable (struct bgp *, afi_t, safi_t, time_t, unsigned int, 133 unsigned int, time_t); 134extern int bgp_damp_disable (struct bgp *, afi_t, safi_t); 135extern int bgp_damp_withdraw (struct bgp_info *, struct bgp_node *, 136 afi_t, safi_t, int); 137extern int bgp_damp_update (struct bgp_info *, struct bgp_node *, afi_t, safi_t); 138extern int bgp_damp_scan (struct bgp_info *, afi_t, safi_t); 139extern void bgp_damp_info_free (struct bgp_damp_info *, int); 140extern void bgp_damp_info_clean (void); 141extern int bgp_damp_decay (time_t, int); 142extern void bgp_config_write_damp (struct vty *); 143extern void bgp_damp_info_vty (struct vty *, struct bgp_info *); 144extern const char * bgp_damp_reuse_time_vty (struct vty *, struct bgp_info *, 145 char *, size_t); 146 147#endif /* _QUAGGA_BGP_DAMP_H */ 148