blob: cd8f3fea98c3a9dff1de9576cb408bcd6bce641f [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* BGP routing information
2 Copyright (C) 1996, 97, 98, 99 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#include <zebra.h>
22
23#include "prefix.h"
24#include "linklist.h"
25#include "memory.h"
26#include "command.h"
27#include "stream.h"
28#include "filter.h"
29#include "str.h"
30#include "log.h"
31#include "routemap.h"
32#include "buffer.h"
33#include "sockunion.h"
34#include "plist.h"
35#include "thread.h"
paul200df112005-06-01 11:17:05 +000036#include "workqueue.h"
paul718e3742002-12-13 20:15:29 +000037
38#include "bgpd/bgpd.h"
39#include "bgpd/bgp_table.h"
40#include "bgpd/bgp_route.h"
41#include "bgpd/bgp_attr.h"
42#include "bgpd/bgp_debug.h"
43#include "bgpd/bgp_aspath.h"
44#include "bgpd/bgp_regex.h"
45#include "bgpd/bgp_community.h"
46#include "bgpd/bgp_ecommunity.h"
47#include "bgpd/bgp_clist.h"
48#include "bgpd/bgp_packet.h"
49#include "bgpd/bgp_filter.h"
50#include "bgpd/bgp_fsm.h"
51#include "bgpd/bgp_mplsvpn.h"
52#include "bgpd/bgp_nexthop.h"
53#include "bgpd/bgp_damp.h"
54#include "bgpd/bgp_advertise.h"
55#include "bgpd/bgp_zebra.h"
hasso0a486e52005-02-01 20:57:17 +000056#include "bgpd/bgp_vty.h"
Josh Bailey96450fa2011-07-20 20:45:12 -070057#include "bgpd/bgp_mpath.h"
paul718e3742002-12-13 20:15:29 +000058
59/* Extern from bgp_dump.c */
Stephen Hemmingerdde72582009-05-08 15:19:07 -070060extern const char *bgp_origin_str[];
61extern const char *bgp_origin_long_str[];
paul718e3742002-12-13 20:15:29 +000062
paul94f2b392005-06-28 12:44:16 +000063static struct bgp_node *
paulfee0f4c2004-09-13 05:12:46 +000064bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
paul718e3742002-12-13 20:15:29 +000065 struct prefix_rd *prd)
66{
67 struct bgp_node *rn;
68 struct bgp_node *prn = NULL;
Paul Jakmada5b30f2006-05-08 14:37:17 +000069
70 assert (table);
71 if (!table)
72 return NULL;
73
paul718e3742002-12-13 20:15:29 +000074 if (safi == SAFI_MPLS_VPN)
75 {
paulfee0f4c2004-09-13 05:12:46 +000076 prn = bgp_node_get (table, (struct prefix *) prd);
paul718e3742002-12-13 20:15:29 +000077
78 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +000079 prn->info = bgp_table_init (afi, safi);
paul718e3742002-12-13 20:15:29 +000080 else
81 bgp_unlock_node (prn);
82 table = prn->info;
83 }
paul718e3742002-12-13 20:15:29 +000084
85 rn = bgp_node_get (table, p);
86
87 if (safi == SAFI_MPLS_VPN)
88 rn->prn = prn;
89
90 return rn;
91}
92
Paul Jakmafb982c22007-05-04 20:15:47 +000093/* Allocate bgp_info_extra */
94static struct bgp_info_extra *
95bgp_info_extra_new (void)
96{
97 struct bgp_info_extra *new;
98 new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
99 return new;
100}
101
102static void
103bgp_info_extra_free (struct bgp_info_extra **extra)
104{
105 if (extra && *extra)
106 {
107 if ((*extra)->damp_info)
108 bgp_damp_info_free ((*extra)->damp_info, 0);
109
110 (*extra)->damp_info = NULL;
111
112 XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
113
114 *extra = NULL;
115 }
116}
117
118/* Get bgp_info extra information for the given bgp_info, lazy allocated
119 * if required.
120 */
121struct bgp_info_extra *
122bgp_info_extra_get (struct bgp_info *ri)
123{
124 if (!ri->extra)
125 ri->extra = bgp_info_extra_new();
126 return ri->extra;
127}
128
paul718e3742002-12-13 20:15:29 +0000129/* Allocate new bgp info structure. */
paul200df112005-06-01 11:17:05 +0000130static struct bgp_info *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -0800131bgp_info_new (void)
paul718e3742002-12-13 20:15:29 +0000132{
Stephen Hemminger393deb92008-08-18 14:13:29 -0700133 return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
paul718e3742002-12-13 20:15:29 +0000134}
135
136/* Free bgp route information. */
paul200df112005-06-01 11:17:05 +0000137static void
paul718e3742002-12-13 20:15:29 +0000138bgp_info_free (struct bgp_info *binfo)
139{
140 if (binfo->attr)
Paul Jakmaf6f434b2010-11-23 21:28:03 +0000141 bgp_attr_unintern (&binfo->attr);
Paul Jakmafb982c22007-05-04 20:15:47 +0000142
143 bgp_info_extra_free (&binfo->extra);
Josh Baileyde8d5df2011-07-20 20:46:01 -0700144 bgp_info_mpath_free (&binfo->mpath);
paul718e3742002-12-13 20:15:29 +0000145
paul200df112005-06-01 11:17:05 +0000146 peer_unlock (binfo->peer); /* bgp_info peer reference */
147
paul718e3742002-12-13 20:15:29 +0000148 XFREE (MTYPE_BGP_ROUTE, binfo);
149}
150
paul200df112005-06-01 11:17:05 +0000151struct bgp_info *
152bgp_info_lock (struct bgp_info *binfo)
153{
154 binfo->lock++;
155 return binfo;
156}
157
158struct bgp_info *
159bgp_info_unlock (struct bgp_info *binfo)
160{
161 assert (binfo && binfo->lock > 0);
162 binfo->lock--;
163
164 if (binfo->lock == 0)
165 {
166#if 0
167 zlog_debug ("%s: unlocked and freeing", __func__);
168 zlog_backtrace (LOG_DEBUG);
169#endif
170 bgp_info_free (binfo);
171 return NULL;
172 }
173
174#if 0
175 if (binfo->lock == 1)
176 {
177 zlog_debug ("%s: unlocked to 1", __func__);
178 zlog_backtrace (LOG_DEBUG);
179 }
180#endif
181
182 return binfo;
183}
184
paul718e3742002-12-13 20:15:29 +0000185void
186bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
187{
188 struct bgp_info *top;
189
190 top = rn->info;
paul200df112005-06-01 11:17:05 +0000191
paul718e3742002-12-13 20:15:29 +0000192 ri->next = rn->info;
193 ri->prev = NULL;
194 if (top)
195 top->prev = ri;
196 rn->info = ri;
paul200df112005-06-01 11:17:05 +0000197
198 bgp_info_lock (ri);
199 bgp_lock_node (rn);
200 peer_lock (ri->peer); /* bgp_info peer reference */
paul718e3742002-12-13 20:15:29 +0000201}
202
paulb40d9392005-08-22 22:34:41 +0000203/* Do the actual removal of info from RIB, for use by bgp_process
204 completion callback *only* */
205static void
206bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
paul718e3742002-12-13 20:15:29 +0000207{
208 if (ri->next)
209 ri->next->prev = ri->prev;
210 if (ri->prev)
211 ri->prev->next = ri->next;
212 else
213 rn->info = ri->next;
paul200df112005-06-01 11:17:05 +0000214
Josh Baileyde8d5df2011-07-20 20:46:01 -0700215 bgp_info_mpath_dequeue (ri);
paul200df112005-06-01 11:17:05 +0000216 bgp_info_unlock (ri);
217 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +0000218}
219
paulb40d9392005-08-22 22:34:41 +0000220void
221bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
222{
Paul Jakma1a392d42006-09-07 00:24:49 +0000223 bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
224 /* set of previous already took care of pcount */
paulb40d9392005-08-22 22:34:41 +0000225 UNSET_FLAG (ri->flags, BGP_INFO_VALID);
226}
227
Andrew J. Schorr8d452102006-11-28 19:50:46 +0000228/* undo the effects of a previous call to bgp_info_delete; typically
229 called when a route is deleted and then quickly re-added before the
230 deletion has been processed */
231static void
232bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
233{
234 bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
235 /* unset of previous already took care of pcount */
236 SET_FLAG (ri->flags, BGP_INFO_VALID);
237}
238
Paul Jakma1a392d42006-09-07 00:24:49 +0000239/* Adjust pcount as required */
240static void
241bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
242{
Paul Jakma6f585442006-10-22 19:13:07 +0000243 assert (rn && rn->table);
244 assert (ri && ri->peer && ri->peer->bgp);
245
Paul Jakma1a392d42006-09-07 00:24:49 +0000246 /* Ignore 'pcount' for RS-client tables */
247 if (rn->table->type != BGP_TABLE_MAIN
248 || ri->peer == ri->peer->bgp->peer_self)
249 return;
250
251 if (BGP_INFO_HOLDDOWN (ri)
252 && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
253 {
254
255 UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
256
257 /* slight hack, but more robust against errors. */
258 if (ri->peer->pcount[rn->table->afi][rn->table->safi])
259 ri->peer->pcount[rn->table->afi][rn->table->safi]--;
260 else
261 {
262 zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
263 __func__, ri->peer->host);
264 zlog_backtrace (LOG_WARNING);
265 zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
266 }
267 }
268 else if (!BGP_INFO_HOLDDOWN (ri)
269 && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
270 {
271 SET_FLAG (ri->flags, BGP_INFO_COUNTED);
272 ri->peer->pcount[rn->table->afi][rn->table->safi]++;
273 }
274}
275
276
277/* Set/unset bgp_info flags, adjusting any other state as needed.
278 * This is here primarily to keep prefix-count in check.
279 */
280void
281bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
282{
283 SET_FLAG (ri->flags, flag);
284
285 /* early bath if we know it's not a flag that changes useability state */
286 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
287 return;
288
289 bgp_pcount_adjust (rn, ri);
290}
291
292void
293bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
294{
295 UNSET_FLAG (ri->flags, flag);
296
297 /* early bath if we know it's not a flag that changes useability state */
298 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
299 return;
300
301 bgp_pcount_adjust (rn, ri);
302}
303
paul718e3742002-12-13 20:15:29 +0000304/* Get MED value. If MED value is missing and "bgp bestpath
305 missing-as-worst" is specified, treat it as the worst value. */
paul94f2b392005-06-28 12:44:16 +0000306static u_int32_t
paul718e3742002-12-13 20:15:29 +0000307bgp_med_value (struct attr *attr, struct bgp *bgp)
308{
309 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
310 return attr->med;
311 else
312 {
313 if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
paul3b424972003-10-13 09:47:32 +0000314 return BGP_MED_MAX;
paul718e3742002-12-13 20:15:29 +0000315 else
316 return 0;
317 }
318}
319
320/* Compare two bgp route entity. br is preferable then return 1. */
paul94f2b392005-06-28 12:44:16 +0000321static int
Josh Bailey96450fa2011-07-20 20:45:12 -0700322bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist,
323 int *paths_eq)
paul718e3742002-12-13 20:15:29 +0000324{
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000325 struct attr *newattr, *existattr;
326 struct attr_extra *newattre, *existattre;
327 bgp_peer_sort_t new_sort;
328 bgp_peer_sort_t exist_sort;
paul718e3742002-12-13 20:15:29 +0000329 u_int32_t new_pref;
330 u_int32_t exist_pref;
331 u_int32_t new_med;
332 u_int32_t exist_med;
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000333 u_int32_t new_weight;
334 u_int32_t exist_weight;
335 uint32_t newm, existm;
paul718e3742002-12-13 20:15:29 +0000336 struct in_addr new_id;
337 struct in_addr exist_id;
338 int new_cluster;
339 int exist_cluster;
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000340 int internal_as_route;
341 int confed_as_route;
paul718e3742002-12-13 20:15:29 +0000342 int ret;
Josh Bailey96450fa2011-07-20 20:45:12 -0700343
344 *paths_eq = 0;
paul718e3742002-12-13 20:15:29 +0000345
346 /* 0. Null check. */
347 if (new == NULL)
348 return 0;
349 if (exist == NULL)
350 return 1;
351
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000352 newattr = new->attr;
353 existattr = exist->attr;
354 newattre = newattr->extra;
355 existattre = existattr->extra;
356
paul718e3742002-12-13 20:15:29 +0000357 /* 1. Weight check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000358 new_weight = exist_weight = 0;
359
360 if (newattre)
361 new_weight = newattre->weight;
362 if (existattre)
363 exist_weight = existattre->weight;
364
Paul Jakmafb982c22007-05-04 20:15:47 +0000365 if (new_weight > exist_weight)
paul718e3742002-12-13 20:15:29 +0000366 return 1;
Paul Jakmafb982c22007-05-04 20:15:47 +0000367 if (new_weight < exist_weight)
paul718e3742002-12-13 20:15:29 +0000368 return 0;
369
370 /* 2. Local preference check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000371 new_pref = exist_pref = bgp->default_local_pref;
paul718e3742002-12-13 20:15:29 +0000372
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000373 if (newattr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
374 new_pref = newattr->local_pref;
375 if (existattr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
376 exist_pref = existattr->local_pref;
377
paul718e3742002-12-13 20:15:29 +0000378 if (new_pref > exist_pref)
379 return 1;
380 if (new_pref < exist_pref)
381 return 0;
382
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000383 /* 3. Local route check. We prefer:
384 * - BGP_ROUTE_STATIC
385 * - BGP_ROUTE_AGGREGATE
386 * - BGP_ROUTE_REDISTRIBUTE
387 */
388 if (! (new->sub_type == BGP_ROUTE_NORMAL))
389 return 1;
390 if (! (exist->sub_type == BGP_ROUTE_NORMAL))
391 return 0;
paul718e3742002-12-13 20:15:29 +0000392
393 /* 4. AS path length check. */
394 if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
395 {
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000396 int exist_hops = aspath_count_hops (existattr->aspath);
397 int exist_confeds = aspath_count_confeds (existattr->aspath);
paulfe69a502005-09-10 16:55:02 +0000398
hasso68118452005-04-08 15:40:36 +0000399 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
400 {
paulfe69a502005-09-10 16:55:02 +0000401 int aspath_hops;
402
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000403 aspath_hops = aspath_count_hops (newattr->aspath);
404 aspath_hops += aspath_count_confeds (newattr->aspath);
paulfe69a502005-09-10 16:55:02 +0000405
406 if ( aspath_hops < (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000407 return 1;
paulfe69a502005-09-10 16:55:02 +0000408 if ( aspath_hops > (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000409 return 0;
410 }
411 else
412 {
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000413 int newhops = aspath_count_hops (newattr->aspath);
paulfe69a502005-09-10 16:55:02 +0000414
415 if (newhops < exist_hops)
hasso68118452005-04-08 15:40:36 +0000416 return 1;
paulfe69a502005-09-10 16:55:02 +0000417 if (newhops > exist_hops)
hasso68118452005-04-08 15:40:36 +0000418 return 0;
419 }
paul718e3742002-12-13 20:15:29 +0000420 }
421
422 /* 5. Origin check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000423 if (newattr->origin < existattr->origin)
paul718e3742002-12-13 20:15:29 +0000424 return 1;
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000425 if (newattr->origin > existattr->origin)
paul718e3742002-12-13 20:15:29 +0000426 return 0;
427
428 /* 6. MED check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000429 internal_as_route = (aspath_count_hops (newattr->aspath) == 0
430 && aspath_count_hops (existattr->aspath) == 0);
431 confed_as_route = (aspath_count_confeds (newattr->aspath) > 0
432 && aspath_count_confeds (existattr->aspath) > 0
433 && aspath_count_hops (newattr->aspath) == 0
434 && aspath_count_hops (existattr->aspath) == 0);
paul718e3742002-12-13 20:15:29 +0000435
436 if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
437 || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
438 && confed_as_route)
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000439 || aspath_cmp_left (newattr->aspath, existattr->aspath)
440 || aspath_cmp_left_confed (newattr->aspath, existattr->aspath)
paul718e3742002-12-13 20:15:29 +0000441 || internal_as_route)
442 {
443 new_med = bgp_med_value (new->attr, bgp);
444 exist_med = bgp_med_value (exist->attr, bgp);
445
446 if (new_med < exist_med)
447 return 1;
448 if (new_med > exist_med)
449 return 0;
450 }
451
452 /* 7. Peer type check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000453 new_sort = new->peer->sort;
454 exist_sort = exist->peer->sort;
455
456 if (new_sort == BGP_PEER_EBGP
457 && (exist_sort == BGP_PEER_IBGP || exist_sort == BGP_PEER_CONFED))
paul718e3742002-12-13 20:15:29 +0000458 return 1;
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000459 if (exist_sort == BGP_PEER_EBGP
460 && (new_sort == BGP_PEER_IBGP || new_sort == BGP_PEER_CONFED))
paul718e3742002-12-13 20:15:29 +0000461 return 0;
462
463 /* 8. IGP metric check. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000464 newm = existm = 0;
465
466 if (new->extra)
467 newm = new->extra->igpmetric;
468 if (exist->extra)
469 existm = exist->extra->igpmetric;
470
Josh Bailey96450fa2011-07-20 20:45:12 -0700471 if (newm < existm)
472 ret = 1;
473 if (newm > existm)
474 ret = 0;
paul718e3742002-12-13 20:15:29 +0000475
476 /* 9. Maximum path check. */
Josh Bailey96450fa2011-07-20 20:45:12 -0700477 if (newm == existm)
478 {
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000479 if (new->peer->sort == BGP_PEER_IBGP)
Josh Bailey96450fa2011-07-20 20:45:12 -0700480 {
481 if (aspath_cmp (new->attr->aspath, exist->attr->aspath))
482 *paths_eq = 1;
483 }
484 else if (new->peer->as == exist->peer->as)
485 *paths_eq = 1;
486 }
487 else
488 {
489 /*
490 * TODO: If unequal cost ibgp multipath is enabled we can
491 * mark the paths as equal here instead of returning
492 */
493 return ret;
494 }
paul718e3742002-12-13 20:15:29 +0000495
496 /* 10. If both paths are external, prefer the path that was received
497 first (the oldest one). This step minimizes route-flap, since a
498 newer path won't displace an older one, even if it was the
499 preferred route based on the additional decision criteria below. */
500 if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000501 && new_sort == BGP_PEER_EBGP
502 && exist_sort == BGP_PEER_EBGP)
paul718e3742002-12-13 20:15:29 +0000503 {
504 if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
505 return 1;
506 if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
507 return 0;
508 }
509
510 /* 11. Rourter-ID comparision. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000511 if (newattr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
512 new_id.s_addr = newattre->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000513 else
514 new_id.s_addr = new->peer->remote_id.s_addr;
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000515 if (existattr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
516 exist_id.s_addr = existattre->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000517 else
518 exist_id.s_addr = exist->peer->remote_id.s_addr;
519
520 if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
521 return 1;
522 if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
523 return 0;
524
525 /* 12. Cluster length comparision. */
Jorge Boncompte [DTI2]8ff56312012-05-07 16:52:56 +0000526 new_cluster = exist_cluster = 0;
527
528 if (newattr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
529 new_cluster = newattre->cluster->length;
530 if (existattr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
531 exist_cluster = existattre->cluster->length;
paul718e3742002-12-13 20:15:29 +0000532
533 if (new_cluster < exist_cluster)
534 return 1;
535 if (new_cluster > exist_cluster)
536 return 0;
537
538 /* 13. Neighbor address comparision. */
539 ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
540
541 if (ret == 1)
542 return 0;
543 if (ret == -1)
544 return 1;
545
546 return 1;
547}
548
paul94f2b392005-06-28 12:44:16 +0000549static enum filter_type
paul718e3742002-12-13 20:15:29 +0000550bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
551 afi_t afi, safi_t safi)
552{
553 struct bgp_filter *filter;
554
555 filter = &peer->filter[afi][safi];
556
Paul Jakma650f76c2009-06-25 18:06:31 +0100557#define FILTER_EXIST_WARN(F,f,filter) \
558 if (BGP_DEBUG (update, UPDATE_IN) \
559 && !(F ## _IN (filter))) \
560 plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
561 peer->host, #f, F ## _IN_NAME(filter));
562
563 if (DISTRIBUTE_IN_NAME (filter)) {
564 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
565
paul718e3742002-12-13 20:15:29 +0000566 if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
567 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100568 }
paul718e3742002-12-13 20:15:29 +0000569
Paul Jakma650f76c2009-06-25 18:06:31 +0100570 if (PREFIX_LIST_IN_NAME (filter)) {
571 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
572
paul718e3742002-12-13 20:15:29 +0000573 if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
574 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100575 }
paul718e3742002-12-13 20:15:29 +0000576
Paul Jakma650f76c2009-06-25 18:06:31 +0100577 if (FILTER_LIST_IN_NAME (filter)) {
578 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
579
paul718e3742002-12-13 20:15:29 +0000580 if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
581 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100582 }
583
paul718e3742002-12-13 20:15:29 +0000584 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100585#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000586}
587
paul94f2b392005-06-28 12:44:16 +0000588static enum filter_type
paul718e3742002-12-13 20:15:29 +0000589bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
590 afi_t afi, safi_t safi)
591{
592 struct bgp_filter *filter;
593
594 filter = &peer->filter[afi][safi];
595
Paul Jakma650f76c2009-06-25 18:06:31 +0100596#define FILTER_EXIST_WARN(F,f,filter) \
597 if (BGP_DEBUG (update, UPDATE_OUT) \
598 && !(F ## _OUT (filter))) \
599 plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
600 peer->host, #f, F ## _OUT_NAME(filter));
601
602 if (DISTRIBUTE_OUT_NAME (filter)) {
603 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
604
paul718e3742002-12-13 20:15:29 +0000605 if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
606 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100607 }
paul718e3742002-12-13 20:15:29 +0000608
Paul Jakma650f76c2009-06-25 18:06:31 +0100609 if (PREFIX_LIST_OUT_NAME (filter)) {
610 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
611
paul718e3742002-12-13 20:15:29 +0000612 if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
613 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100614 }
paul718e3742002-12-13 20:15:29 +0000615
Paul Jakma650f76c2009-06-25 18:06:31 +0100616 if (FILTER_LIST_OUT_NAME (filter)) {
617 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
618
paul718e3742002-12-13 20:15:29 +0000619 if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
620 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100621 }
paul718e3742002-12-13 20:15:29 +0000622
623 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100624#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000625}
626
627/* If community attribute includes no_export then return 1. */
paul94f2b392005-06-28 12:44:16 +0000628static int
paul718e3742002-12-13 20:15:29 +0000629bgp_community_filter (struct peer *peer, struct attr *attr)
630{
631 if (attr->community)
632 {
633 /* NO_ADVERTISE check. */
634 if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
635 return 1;
636
637 /* NO_EXPORT check. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000638 if (peer->sort == BGP_PEER_EBGP &&
paul718e3742002-12-13 20:15:29 +0000639 community_include (attr->community, COMMUNITY_NO_EXPORT))
640 return 1;
641
642 /* NO_EXPORT_SUBCONFED check. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000643 if (peer->sort == BGP_PEER_EBGP
644 || peer->sort == BGP_PEER_CONFED)
paul718e3742002-12-13 20:15:29 +0000645 if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
646 return 1;
647 }
648 return 0;
649}
650
651/* Route reflection loop check. */
652static int
653bgp_cluster_filter (struct peer *peer, struct attr *attr)
654{
655 struct in_addr cluster_id;
656
Paul Jakmafb982c22007-05-04 20:15:47 +0000657 if (attr->extra && attr->extra->cluster)
paul718e3742002-12-13 20:15:29 +0000658 {
659 if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
660 cluster_id = peer->bgp->cluster_id;
661 else
662 cluster_id = peer->bgp->router_id;
663
Paul Jakmafb982c22007-05-04 20:15:47 +0000664 if (cluster_loop_check (attr->extra->cluster, cluster_id))
paul718e3742002-12-13 20:15:29 +0000665 return 1;
666 }
667 return 0;
668}
669
paul94f2b392005-06-28 12:44:16 +0000670static int
paul718e3742002-12-13 20:15:29 +0000671bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
672 afi_t afi, safi_t safi)
673{
674 struct bgp_filter *filter;
675 struct bgp_info info;
676 route_map_result_t ret;
677
678 filter = &peer->filter[afi][safi];
679
680 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000681 if (peer->weight)
682 (bgp_attr_extra_get (attr))->weight = peer->weight;
paul718e3742002-12-13 20:15:29 +0000683
684 /* Route map apply. */
685 if (ROUTE_MAP_IN_NAME (filter))
686 {
687 /* Duplicate current value to new strucutre for modification. */
688 info.peer = peer;
689 info.attr = attr;
690
paulac41b2a2003-08-12 05:32:27 +0000691 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
692
paul718e3742002-12-13 20:15:29 +0000693 /* Apply BGP route map to the attribute. */
694 ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
paulac41b2a2003-08-12 05:32:27 +0000695
696 peer->rmap_type = 0;
697
paul718e3742002-12-13 20:15:29 +0000698 if (ret == RMAP_DENYMATCH)
699 {
700 /* Free newly generated AS path and community by route-map. */
701 bgp_attr_flush (attr);
702 return RMAP_DENY;
703 }
704 }
705 return RMAP_PERMIT;
706}
707
paul94f2b392005-06-28 12:44:16 +0000708static int
paulfee0f4c2004-09-13 05:12:46 +0000709bgp_export_modifier (struct peer *rsclient, struct peer *peer,
710 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
711{
712 struct bgp_filter *filter;
713 struct bgp_info info;
714 route_map_result_t ret;
715
716 filter = &peer->filter[afi][safi];
717
718 /* Route map apply. */
719 if (ROUTE_MAP_EXPORT_NAME (filter))
720 {
721 /* Duplicate current value to new strucutre for modification. */
722 info.peer = rsclient;
723 info.attr = attr;
724
725 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
726
727 /* Apply BGP route map to the attribute. */
728 ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
729
730 rsclient->rmap_type = 0;
731
732 if (ret == RMAP_DENYMATCH)
733 {
734 /* Free newly generated AS path and community by route-map. */
735 bgp_attr_flush (attr);
736 return RMAP_DENY;
737 }
738 }
739 return RMAP_PERMIT;
740}
741
paul94f2b392005-06-28 12:44:16 +0000742static int
paulfee0f4c2004-09-13 05:12:46 +0000743bgp_import_modifier (struct peer *rsclient, struct peer *peer,
744 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
745{
746 struct bgp_filter *filter;
747 struct bgp_info info;
748 route_map_result_t ret;
749
750 filter = &rsclient->filter[afi][safi];
751
752 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000753 if (peer->weight)
754 (bgp_attr_extra_get (attr))->weight = peer->weight;
paulfee0f4c2004-09-13 05:12:46 +0000755
756 /* Route map apply. */
757 if (ROUTE_MAP_IMPORT_NAME (filter))
758 {
759 /* Duplicate current value to new strucutre for modification. */
760 info.peer = peer;
761 info.attr = attr;
762
763 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
764
765 /* Apply BGP route map to the attribute. */
766 ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
767
768 peer->rmap_type = 0;
769
770 if (ret == RMAP_DENYMATCH)
771 {
772 /* Free newly generated AS path and community by route-map. */
773 bgp_attr_flush (attr);
774 return RMAP_DENY;
775 }
776 }
777 return RMAP_PERMIT;
778}
779
paul94f2b392005-06-28 12:44:16 +0000780static int
paul718e3742002-12-13 20:15:29 +0000781bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
782 struct attr *attr, afi_t afi, safi_t safi)
783{
784 int ret;
785 char buf[SU_ADDRSTRLEN];
786 struct bgp_filter *filter;
paul718e3742002-12-13 20:15:29 +0000787 struct peer *from;
788 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +0000789 int transparent;
790 int reflect;
Josh Bailey0b597ef2011-07-20 20:49:11 -0700791 struct attr *riattr;
paul718e3742002-12-13 20:15:29 +0000792
793 from = ri->peer;
794 filter = &peer->filter[afi][safi];
795 bgp = peer->bgp;
Josh Bailey0b597ef2011-07-20 20:49:11 -0700796 riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
paul718e3742002-12-13 20:15:29 +0000797
Paul Jakma750e8142008-07-22 21:11:48 +0000798 if (DISABLE_BGP_ANNOUNCE)
799 return 0;
paul718e3742002-12-13 20:15:29 +0000800
paulfee0f4c2004-09-13 05:12:46 +0000801 /* Do not send announces to RS-clients from the 'normal' bgp_table. */
802 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
803 return 0;
804
paul718e3742002-12-13 20:15:29 +0000805 /* Do not send back route to sender. */
806 if (from == peer)
807 return 0;
808
paul35be31b2004-05-01 18:17:04 +0000809 /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
810 if (p->family == AF_INET
Josh Bailey0b597ef2011-07-20 20:49:11 -0700811 && IPV4_ADDR_SAME(&peer->remote_id, &riattr->nexthop))
paul35be31b2004-05-01 18:17:04 +0000812 return 0;
813#ifdef HAVE_IPV6
814 if (p->family == AF_INET6
Josh Bailey0b597ef2011-07-20 20:49:11 -0700815 && IPV6_ADDR_SAME(&peer->remote_id, &riattr->nexthop))
paul35be31b2004-05-01 18:17:04 +0000816 return 0;
817#endif
818
paul718e3742002-12-13 20:15:29 +0000819 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000820 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +0000821 if (! UNSUPPRESS_MAP_NAME (filter))
822 return 0;
823
824 /* Default route check. */
825 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
826 {
827 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
828 return 0;
829#ifdef HAVE_IPV6
830 else if (p->family == AF_INET6 && p->prefixlen == 0)
831 return 0;
832#endif /* HAVE_IPV6 */
833 }
834
paul286e1e72003-08-08 00:24:31 +0000835 /* Transparency check. */
836 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
837 && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
838 transparent = 1;
839 else
840 transparent = 0;
841
paul718e3742002-12-13 20:15:29 +0000842 /* If community is not disabled check the no-export and local. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700843 if (! transparent && bgp_community_filter (peer, riattr))
paul718e3742002-12-13 20:15:29 +0000844 return 0;
845
846 /* If the attribute has originator-id and it is same as remote
847 peer's id. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700848 if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
paul718e3742002-12-13 20:15:29 +0000849 {
Josh Bailey0b597ef2011-07-20 20:49:11 -0700850 if (IPV4_ADDR_SAME (&peer->remote_id, &riattr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +0000851 {
852 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000853 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +0000854 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
855 peer->host,
856 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
857 p->prefixlen);
858 return 0;
859 }
860 }
861
862 /* ORF prefix-list filter check */
863 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
864 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
865 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
866 if (peer->orf_plist[afi][safi])
867 {
868 if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
869 return 0;
870 }
871
872 /* Output filter check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700873 if (bgp_output_filter (peer, p, riattr, afi, safi) == FILTER_DENY)
paul718e3742002-12-13 20:15:29 +0000874 {
875 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000876 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +0000877 "%s [Update:SEND] %s/%d is filtered",
878 peer->host,
879 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
880 p->prefixlen);
881 return 0;
882 }
883
884#ifdef BGP_SEND_ASPATH_CHECK
885 /* AS path loop check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700886 if (aspath_loop_check (riattr->aspath, peer->as))
paul718e3742002-12-13 20:15:29 +0000887 {
888 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000889 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400890 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000891 peer->host, peer->as);
892 return 0;
893 }
894#endif /* BGP_SEND_ASPATH_CHECK */
895
896 /* If we're a CONFED we need to loop check the CONFED ID too */
897 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
898 {
Josh Bailey0b597ef2011-07-20 20:49:11 -0700899 if (aspath_loop_check(riattr->aspath, bgp->confed_id))
paul718e3742002-12-13 20:15:29 +0000900 {
901 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000902 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400903 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000904 peer->host,
905 bgp->confed_id);
906 return 0;
907 }
908 }
909
910 /* Route-Reflect check. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000911 if (from->sort == BGP_PEER_IBGP && peer->sort == BGP_PEER_IBGP)
paul718e3742002-12-13 20:15:29 +0000912 reflect = 1;
913 else
914 reflect = 0;
915
916 /* IBGP reflection check. */
917 if (reflect)
918 {
919 /* A route from a Client peer. */
920 if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
921 {
922 /* Reflect to all the Non-Client peers and also to the
923 Client peers other than the originator. Originator check
924 is already done. So there is noting to do. */
925 /* no bgp client-to-client reflection check. */
926 if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
927 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
928 return 0;
929 }
930 else
931 {
932 /* A route from a Non-client peer. Reflect to all other
933 clients. */
934 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
935 return 0;
936 }
937 }
Paul Jakma41367172007-08-06 15:24:51 +0000938
paul718e3742002-12-13 20:15:29 +0000939 /* For modify attribute, copy it to temporary structure. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700940 bgp_attr_dup (attr, riattr);
Paul Jakmafb982c22007-05-04 20:15:47 +0000941
paul718e3742002-12-13 20:15:29 +0000942 /* If local-preference is not set. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000943 if ((peer->sort == BGP_PEER_IBGP
944 || peer->sort == BGP_PEER_CONFED)
paul718e3742002-12-13 20:15:29 +0000945 && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
946 {
947 attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
948 attr->local_pref = bgp->default_local_pref;
949 }
950
paul718e3742002-12-13 20:15:29 +0000951 /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000952 if (peer->sort == BGP_PEER_EBGP
paul718e3742002-12-13 20:15:29 +0000953 && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
954 {
955 if (ri->peer != bgp->peer_self && ! transparent
956 && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
957 attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
958 }
959
960 /* next-hop-set */
961 if (transparent || reflect
962 || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
963 && ((p->family == AF_INET && attr->nexthop.s_addr)
paul286e1e72003-08-08 00:24:31 +0000964#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000965 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000966 ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul286e1e72003-08-08 00:24:31 +0000967#endif /* HAVE_IPV6 */
968 )))
paul718e3742002-12-13 20:15:29 +0000969 {
970 /* NEXT-HOP Unchanged. */
971 }
972 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
973 || (p->family == AF_INET && attr->nexthop.s_addr == 0)
974#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000975 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000976 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul718e3742002-12-13 20:15:29 +0000977#endif /* HAVE_IPV6 */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +0000978 || (peer->sort == BGP_PEER_EBGP
paul718e3742002-12-13 20:15:29 +0000979 && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
980 {
981 /* Set IPv4 nexthop. */
982 if (p->family == AF_INET)
983 {
984 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +0000985 memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
986 IPV4_MAX_BYTELEN);
paul718e3742002-12-13 20:15:29 +0000987 else
988 memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
989 }
990#ifdef HAVE_IPV6
991 /* Set IPv6 nexthop. */
992 if (p->family == AF_INET6)
993 {
994 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000995 memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +0000996 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +0000997 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +0000998 }
999#endif /* HAVE_IPV6 */
1000 }
1001
1002#ifdef HAVE_IPV6
1003 if (p->family == AF_INET6)
1004 {
paulfee0f4c2004-09-13 05:12:46 +00001005 /* Left nexthop_local unchanged if so configured. */
1006 if ( CHECK_FLAG (peer->af_flags[afi][safi],
1007 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1008 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001009 if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
1010 attr->extra->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001011 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001012 attr->extra->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001013 }
1014
1015 /* Default nexthop_local treatment for non-RS-Clients */
1016 else
1017 {
paul718e3742002-12-13 20:15:29 +00001018 /* Link-local address should not be transit to different peer. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001019 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001020
1021 /* Set link-local address for shared network peer. */
1022 if (peer->shared_network
1023 && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
1024 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001025 memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00001026 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001027 attr->extra->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00001028 }
1029
1030 /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1031 address.*/
1032 if (reflect)
Paul Jakmafb982c22007-05-04 20:15:47 +00001033 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001034
1035 /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1036 if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
Paul Jakmafb982c22007-05-04 20:15:47 +00001037 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001038 }
paulfee0f4c2004-09-13 05:12:46 +00001039
1040 }
paul718e3742002-12-13 20:15:29 +00001041#endif /* HAVE_IPV6 */
1042
1043 /* If this is EBGP peer and remove-private-AS is set. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00001044 if (peer->sort == BGP_PEER_EBGP
paul718e3742002-12-13 20:15:29 +00001045 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1046 && aspath_private_as_check (attr->aspath))
1047 attr->aspath = aspath_empty_get ();
1048
1049 /* Route map & unsuppress-map apply. */
1050 if (ROUTE_MAP_OUT_NAME (filter)
Paul Jakmafb982c22007-05-04 20:15:47 +00001051 || (ri->extra && ri->extra->suppress) )
paul718e3742002-12-13 20:15:29 +00001052 {
Paul Jakma7c7fa1b2006-02-18 10:52:09 +00001053 struct bgp_info info;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001054 struct attr dummy_attr;
1055 struct attr_extra dummy_extra;
1056
1057 dummy_attr.extra = &dummy_extra;
1058
paul718e3742002-12-13 20:15:29 +00001059 info.peer = peer;
1060 info.attr = attr;
1061
1062 /* The route reflector is not allowed to modify the attributes
1063 of the reflected IBGP routes. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00001064 if (from->sort == BGP_PEER_IBGP
1065 && peer->sort == BGP_PEER_IBGP)
paul718e3742002-12-13 20:15:29 +00001066 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001067 bgp_attr_dup (&dummy_attr, attr);
Paul Jakma9eda90c2007-08-30 13:36:17 +00001068 info.attr = &dummy_attr;
paul718e3742002-12-13 20:15:29 +00001069 }
paulac41b2a2003-08-12 05:32:27 +00001070
1071 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1072
Paul Jakmafb982c22007-05-04 20:15:47 +00001073 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00001074 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1075 else
1076 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1077
paulac41b2a2003-08-12 05:32:27 +00001078 peer->rmap_type = 0;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001079
paul718e3742002-12-13 20:15:29 +00001080 if (ret == RMAP_DENYMATCH)
1081 {
1082 bgp_attr_flush (attr);
1083 return 0;
1084 }
1085 }
1086 return 1;
1087}
1088
paul94f2b392005-06-28 12:44:16 +00001089static int
paulfee0f4c2004-09-13 05:12:46 +00001090bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1091 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001092{
paulfee0f4c2004-09-13 05:12:46 +00001093 int ret;
1094 char buf[SU_ADDRSTRLEN];
1095 struct bgp_filter *filter;
1096 struct bgp_info info;
1097 struct peer *from;
Josh Bailey0b597ef2011-07-20 20:49:11 -07001098 struct attr *riattr;
paulfee0f4c2004-09-13 05:12:46 +00001099
1100 from = ri->peer;
1101 filter = &rsclient->filter[afi][safi];
Josh Bailey0b597ef2011-07-20 20:49:11 -07001102 riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
paulfee0f4c2004-09-13 05:12:46 +00001103
Paul Jakma750e8142008-07-22 21:11:48 +00001104 if (DISABLE_BGP_ANNOUNCE)
1105 return 0;
paulfee0f4c2004-09-13 05:12:46 +00001106
1107 /* Do not send back route to sender. */
1108 if (from == rsclient)
1109 return 0;
1110
1111 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001112 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001113 if (! UNSUPPRESS_MAP_NAME (filter))
1114 return 0;
1115
1116 /* Default route check. */
1117 if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1118 PEER_STATUS_DEFAULT_ORIGINATE))
1119 {
1120 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1121 return 0;
1122#ifdef HAVE_IPV6
1123 else if (p->family == AF_INET6 && p->prefixlen == 0)
1124 return 0;
1125#endif /* HAVE_IPV6 */
1126 }
1127
1128 /* If the attribute has originator-id and it is same as remote
1129 peer's id. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001130 if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
paulfee0f4c2004-09-13 05:12:46 +00001131 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001132 if (IPV4_ADDR_SAME (&rsclient->remote_id,
Josh Bailey0b597ef2011-07-20 20:49:11 -07001133 &riattr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001134 {
1135 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001136 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001137 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1138 rsclient->host,
1139 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1140 p->prefixlen);
1141 return 0;
1142 }
1143 }
1144
1145 /* ORF prefix-list filter check */
1146 if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1147 && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1148 || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1149 if (rsclient->orf_plist[afi][safi])
1150 {
1151 if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1152 return 0;
1153 }
1154
1155 /* Output filter check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001156 if (bgp_output_filter (rsclient, p, riattr, afi, safi) == FILTER_DENY)
paulfee0f4c2004-09-13 05:12:46 +00001157 {
1158 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001159 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001160 "%s [Update:SEND] %s/%d is filtered",
1161 rsclient->host,
1162 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1163 p->prefixlen);
1164 return 0;
1165 }
1166
1167#ifdef BGP_SEND_ASPATH_CHECK
1168 /* AS path loop check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001169 if (aspath_loop_check (riattr->aspath, rsclient->as))
paulfee0f4c2004-09-13 05:12:46 +00001170 {
1171 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001172 zlog (rsclient->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04001173 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paulfee0f4c2004-09-13 05:12:46 +00001174 rsclient->host, rsclient->as);
1175 return 0;
1176 }
1177#endif /* BGP_SEND_ASPATH_CHECK */
1178
1179 /* For modify attribute, copy it to temporary structure. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001180 bgp_attr_dup (attr, riattr);
paulfee0f4c2004-09-13 05:12:46 +00001181
1182 /* next-hop-set */
1183 if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1184#ifdef HAVE_IPV6
1185 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +00001186 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paulfee0f4c2004-09-13 05:12:46 +00001187#endif /* HAVE_IPV6 */
1188 )
1189 {
1190 /* Set IPv4 nexthop. */
1191 if (p->family == AF_INET)
1192 {
1193 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001194 memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
paulfee0f4c2004-09-13 05:12:46 +00001195 IPV4_MAX_BYTELEN);
1196 else
1197 memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1198 }
1199#ifdef HAVE_IPV6
1200 /* Set IPv6 nexthop. */
1201 if (p->family == AF_INET6)
1202 {
1203 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001204 memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
paulfee0f4c2004-09-13 05:12:46 +00001205 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001206 attr->extra->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001207 }
1208#endif /* HAVE_IPV6 */
1209 }
1210
1211#ifdef HAVE_IPV6
1212 if (p->family == AF_INET6)
1213 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001214 struct attr_extra *attre = attr->extra;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001215
paulfee0f4c2004-09-13 05:12:46 +00001216 /* Left nexthop_local unchanged if so configured. */
1217 if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1218 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1219 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001220 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1221 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001222 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001223 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001224 }
1225
1226 /* Default nexthop_local treatment for RS-Clients */
1227 else
1228 {
1229 /* Announcer and RS-Client are both in the same network */
1230 if (rsclient->shared_network && from->shared_network &&
1231 (rsclient->ifindex == from->ifindex))
1232 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001233 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1234 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001235 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001236 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001237 }
1238
1239 /* Set link-local address for shared network peer. */
1240 else if (rsclient->shared_network
1241 && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1242 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001243 memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
paulfee0f4c2004-09-13 05:12:46 +00001244 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001245 attre->mp_nexthop_len = 32;
paulfee0f4c2004-09-13 05:12:46 +00001246 }
1247
1248 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001249 attre->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001250 }
1251
1252 }
1253#endif /* HAVE_IPV6 */
1254
1255
1256 /* If this is EBGP peer and remove-private-AS is set. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00001257 if (rsclient->sort == BGP_PEER_EBGP
paulfee0f4c2004-09-13 05:12:46 +00001258 && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1259 && aspath_private_as_check (attr->aspath))
1260 attr->aspath = aspath_empty_get ();
1261
1262 /* Route map & unsuppress-map apply. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001263 if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
paulfee0f4c2004-09-13 05:12:46 +00001264 {
1265 info.peer = rsclient;
1266 info.attr = attr;
1267
1268 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1269
Paul Jakmafb982c22007-05-04 20:15:47 +00001270 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001271 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1272 else
1273 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1274
1275 rsclient->rmap_type = 0;
1276
1277 if (ret == RMAP_DENYMATCH)
1278 {
1279 bgp_attr_flush (attr);
1280 return 0;
1281 }
1282 }
1283
1284 return 1;
1285}
1286
1287struct bgp_info_pair
1288{
1289 struct bgp_info *old;
1290 struct bgp_info *new;
1291};
1292
paul94f2b392005-06-28 12:44:16 +00001293static void
Josh Bailey96450fa2011-07-20 20:45:12 -07001294bgp_best_selection (struct bgp *bgp, struct bgp_node *rn,
1295 struct bgp_maxpaths_cfg *mpath_cfg,
1296 struct bgp_info_pair *result)
paulfee0f4c2004-09-13 05:12:46 +00001297{
paul718e3742002-12-13 20:15:29 +00001298 struct bgp_info *new_select;
1299 struct bgp_info *old_select;
paulfee0f4c2004-09-13 05:12:46 +00001300 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00001301 struct bgp_info *ri1;
1302 struct bgp_info *ri2;
paulb40d9392005-08-22 22:34:41 +00001303 struct bgp_info *nextri = NULL;
Josh Bailey96450fa2011-07-20 20:45:12 -07001304 int paths_eq, do_mpath;
1305 struct list mp_list;
1306
1307 bgp_mp_list_init (&mp_list);
1308 do_mpath = (mpath_cfg->maxpaths_ebgp != BGP_DEFAULT_MAXPATHS ||
1309 mpath_cfg->maxpaths_ibgp != BGP_DEFAULT_MAXPATHS);
1310
paul718e3742002-12-13 20:15:29 +00001311 /* bgp deterministic-med */
1312 new_select = NULL;
1313 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1314 for (ri1 = rn->info; ri1; ri1 = ri1->next)
1315 {
1316 if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1317 continue;
1318 if (BGP_INFO_HOLDDOWN (ri1))
1319 continue;
1320
1321 new_select = ri1;
Josh Bailey6918e742011-07-20 20:48:20 -07001322 if (do_mpath)
1323 bgp_mp_list_add (&mp_list, ri1);
1324 old_select = CHECK_FLAG (ri1->flags, BGP_INFO_SELECTED) ? ri1 : NULL;
paul718e3742002-12-13 20:15:29 +00001325 if (ri1->next)
1326 for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1327 {
1328 if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1329 continue;
1330 if (BGP_INFO_HOLDDOWN (ri2))
1331 continue;
1332
1333 if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1334 || aspath_cmp_left_confed (ri1->attr->aspath,
1335 ri2->attr->aspath))
1336 {
Josh Bailey6918e742011-07-20 20:48:20 -07001337 if (CHECK_FLAG (ri2->flags, BGP_INFO_SELECTED))
1338 old_select = ri2;
Josh Bailey96450fa2011-07-20 20:45:12 -07001339 if (bgp_info_cmp (bgp, ri2, new_select, &paths_eq))
paul718e3742002-12-13 20:15:29 +00001340 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001341 bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001342 new_select = ri2;
Josh Bailey6918e742011-07-20 20:48:20 -07001343 if (do_mpath && !paths_eq)
1344 {
1345 bgp_mp_list_clear (&mp_list);
1346 bgp_mp_list_add (&mp_list, ri2);
1347 }
paul718e3742002-12-13 20:15:29 +00001348 }
1349
Josh Bailey6918e742011-07-20 20:48:20 -07001350 if (do_mpath && paths_eq)
1351 bgp_mp_list_add (&mp_list, ri2);
1352
Paul Jakma1a392d42006-09-07 00:24:49 +00001353 bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001354 }
1355 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001356 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1357 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
Josh Bailey6918e742011-07-20 20:48:20 -07001358
1359 bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);
1360 bgp_mp_list_clear (&mp_list);
paul718e3742002-12-13 20:15:29 +00001361 }
1362
1363 /* Check old selected route and new selected route. */
1364 old_select = NULL;
1365 new_select = NULL;
paulb40d9392005-08-22 22:34:41 +00001366 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
paul718e3742002-12-13 20:15:29 +00001367 {
1368 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1369 old_select = ri;
1370
1371 if (BGP_INFO_HOLDDOWN (ri))
paulb40d9392005-08-22 22:34:41 +00001372 {
1373 /* reap REMOVED routes, if needs be
1374 * selected route must stay for a while longer though
1375 */
1376 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1377 && (ri != old_select))
1378 bgp_info_reap (rn, ri);
1379
1380 continue;
1381 }
paul718e3742002-12-13 20:15:29 +00001382
1383 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1384 && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1385 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001386 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001387 continue;
1388 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001389 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1390 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001391
Josh Bailey96450fa2011-07-20 20:45:12 -07001392 if (bgp_info_cmp (bgp, ri, new_select, &paths_eq))
1393 {
Josh Bailey6918e742011-07-20 20:48:20 -07001394 if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1395 bgp_mp_dmed_deselect (new_select);
1396
Josh Bailey96450fa2011-07-20 20:45:12 -07001397 new_select = ri;
1398
1399 if (do_mpath && !paths_eq)
1400 {
1401 bgp_mp_list_clear (&mp_list);
1402 bgp_mp_list_add (&mp_list, ri);
1403 }
1404 }
Josh Bailey6918e742011-07-20 20:48:20 -07001405 else if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1406 bgp_mp_dmed_deselect (ri);
Josh Bailey96450fa2011-07-20 20:45:12 -07001407
1408 if (do_mpath && paths_eq)
1409 bgp_mp_list_add (&mp_list, ri);
paul718e3742002-12-13 20:15:29 +00001410 }
paulb40d9392005-08-22 22:34:41 +00001411
paulfee0f4c2004-09-13 05:12:46 +00001412
Josh Bailey6918e742011-07-20 20:48:20 -07001413 if (!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1414 bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);
Josh Bailey96450fa2011-07-20 20:45:12 -07001415
Josh Bailey0b597ef2011-07-20 20:49:11 -07001416 bgp_info_mpath_aggregate_update (new_select, old_select);
Josh Bailey96450fa2011-07-20 20:45:12 -07001417 bgp_mp_list_clear (&mp_list);
1418
1419 result->old = old_select;
1420 result->new = new_select;
1421
1422 return;
paulfee0f4c2004-09-13 05:12:46 +00001423}
1424
paul94f2b392005-06-28 12:44:16 +00001425static int
paulfee0f4c2004-09-13 05:12:46 +00001426bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
Paul Jakma9eda90c2007-08-30 13:36:17 +00001427 struct bgp_node *rn, afi_t afi, safi_t safi)
1428{
paulfee0f4c2004-09-13 05:12:46 +00001429 struct prefix *p;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001430 struct attr attr;
1431 struct attr_extra extra;
paulfee0f4c2004-09-13 05:12:46 +00001432
1433 p = &rn->p;
1434
Paul Jakma9eda90c2007-08-30 13:36:17 +00001435 /* Announce route to Established peer. */
1436 if (peer->status != Established)
paulfee0f4c2004-09-13 05:12:46 +00001437 return 0;
1438
Paul Jakma9eda90c2007-08-30 13:36:17 +00001439 /* Address family configuration check. */
1440 if (! peer->afc_nego[afi][safi])
paulfee0f4c2004-09-13 05:12:46 +00001441 return 0;
1442
Paul Jakma9eda90c2007-08-30 13:36:17 +00001443 /* First update is deferred until ORF or ROUTE-REFRESH is received */
paulfee0f4c2004-09-13 05:12:46 +00001444 if (CHECK_FLAG (peer->af_sflags[afi][safi],
1445 PEER_STATUS_ORF_WAIT_REFRESH))
1446 return 0;
1447
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001448 /* It's initialized in bgp_announce_[check|check_rsclient]() */
1449 attr.extra = &extra;
1450
paulfee0f4c2004-09-13 05:12:46 +00001451 switch (rn->table->type)
1452 {
1453 case BGP_TABLE_MAIN:
1454 /* Announcement to peer->conf. If the route is filtered,
1455 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001456 if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1457 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
paulfee0f4c2004-09-13 05:12:46 +00001458 else
1459 bgp_adj_out_unset (rn, peer, p, afi, safi);
1460 break;
1461 case BGP_TABLE_RSCLIENT:
1462 /* Announcement to peer->conf. If the route is filtered,
1463 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001464 if (selected &&
1465 bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1466 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1467 else
1468 bgp_adj_out_unset (rn, peer, p, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001469 break;
1470 }
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001471
paulfee0f4c2004-09-13 05:12:46 +00001472 return 0;
paul200df112005-06-01 11:17:05 +00001473}
paulfee0f4c2004-09-13 05:12:46 +00001474
paul200df112005-06-01 11:17:05 +00001475struct bgp_process_queue
paulfee0f4c2004-09-13 05:12:46 +00001476{
paul200df112005-06-01 11:17:05 +00001477 struct bgp *bgp;
1478 struct bgp_node *rn;
1479 afi_t afi;
1480 safi_t safi;
1481};
1482
1483static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001484bgp_process_rsclient (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001485{
paul0fb58d52005-11-14 14:31:49 +00001486 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001487 struct bgp *bgp = pq->bgp;
1488 struct bgp_node *rn = pq->rn;
1489 afi_t afi = pq->afi;
1490 safi_t safi = pq->safi;
paulfee0f4c2004-09-13 05:12:46 +00001491 struct bgp_info *new_select;
1492 struct bgp_info *old_select;
1493 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001494 struct listnode *node, *nnode;
paul200df112005-06-01 11:17:05 +00001495 struct peer *rsclient = rn->table->owner;
1496
paulfee0f4c2004-09-13 05:12:46 +00001497 /* Best path selection. */
Josh Bailey96450fa2011-07-20 20:45:12 -07001498 bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
paulfee0f4c2004-09-13 05:12:46 +00001499 new_select = old_and_new.new;
1500 old_select = old_and_new.old;
1501
paul200df112005-06-01 11:17:05 +00001502 if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1503 {
Chris Caputo228da422009-07-18 05:44:03 +00001504 if (rsclient->group)
1505 for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1506 {
1507 /* Nothing to do. */
1508 if (old_select && old_select == new_select)
1509 if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1510 continue;
paulfee0f4c2004-09-13 05:12:46 +00001511
Chris Caputo228da422009-07-18 05:44:03 +00001512 if (old_select)
1513 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1514 if (new_select)
1515 {
1516 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1517 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001518 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
1519 }
paulfee0f4c2004-09-13 05:12:46 +00001520
Chris Caputo228da422009-07-18 05:44:03 +00001521 bgp_process_announce_selected (rsclient, new_select, rn,
1522 afi, safi);
1523 }
paul200df112005-06-01 11:17:05 +00001524 }
1525 else
1526 {
hassob7395792005-08-26 12:58:38 +00001527 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001528 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hassob7395792005-08-26 12:58:38 +00001529 if (new_select)
1530 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001531 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1532 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001533 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
hassob7395792005-08-26 12:58:38 +00001534 }
Paul Jakma9eda90c2007-08-30 13:36:17 +00001535 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
paul200df112005-06-01 11:17:05 +00001536 }
paulfee0f4c2004-09-13 05:12:46 +00001537
paulb40d9392005-08-22 22:34:41 +00001538 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1539 bgp_info_reap (rn, old_select);
1540
paul200df112005-06-01 11:17:05 +00001541 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1542 return WQ_SUCCESS;
paulfee0f4c2004-09-13 05:12:46 +00001543}
1544
paul200df112005-06-01 11:17:05 +00001545static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001546bgp_process_main (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001547{
paul0fb58d52005-11-14 14:31:49 +00001548 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001549 struct bgp *bgp = pq->bgp;
1550 struct bgp_node *rn = pq->rn;
1551 afi_t afi = pq->afi;
1552 safi_t safi = pq->safi;
1553 struct prefix *p = &rn->p;
paulfee0f4c2004-09-13 05:12:46 +00001554 struct bgp_info *new_select;
1555 struct bgp_info *old_select;
1556 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001557 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00001558 struct peer *peer;
Paul Jakmafb982c22007-05-04 20:15:47 +00001559
paulfee0f4c2004-09-13 05:12:46 +00001560 /* Best path selection. */
Josh Bailey96450fa2011-07-20 20:45:12 -07001561 bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
paulfee0f4c2004-09-13 05:12:46 +00001562 old_select = old_and_new.old;
1563 new_select = old_and_new.new;
1564
1565 /* Nothing to do. */
1566 if (old_select && old_select == new_select)
1567 {
1568 if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
paul200df112005-06-01 11:17:05 +00001569 {
Josh Bailey8196f132011-07-20 20:47:07 -07001570 if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED) ||
1571 CHECK_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG))
G.Balaji5a616c02011-11-26 21:58:42 +04001572 bgp_zebra_announce (p, old_select, bgp, safi);
paul200df112005-06-01 11:17:05 +00001573
Josh Bailey8196f132011-07-20 20:47:07 -07001574 UNSET_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG);
paul200df112005-06-01 11:17:05 +00001575 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1576 return WQ_SUCCESS;
1577 }
paulfee0f4c2004-09-13 05:12:46 +00001578 }
paul718e3742002-12-13 20:15:29 +00001579
hasso338b3422005-02-23 14:27:24 +00001580 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001581 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hasso338b3422005-02-23 14:27:24 +00001582 if (new_select)
1583 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001584 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1585 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001586 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
hasso338b3422005-02-23 14:27:24 +00001587 }
1588
1589
paul718e3742002-12-13 20:15:29 +00001590 /* Check each BGP peer. */
paul1eb8ef22005-04-07 07:30:20 +00001591 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00001592 {
Paul Jakma9eda90c2007-08-30 13:36:17 +00001593 bgp_process_announce_selected (peer, new_select, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001594 }
1595
1596 /* FIB update. */
G.Balaji5a616c02011-11-26 21:58:42 +04001597 if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp->name &&
1598 ! bgp_option_check (BGP_OPT_NO_FIB)))
paul718e3742002-12-13 20:15:29 +00001599 {
1600 if (new_select
1601 && new_select->type == ZEBRA_ROUTE_BGP
1602 && new_select->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04001603 bgp_zebra_announce (p, new_select, bgp, safi);
paul718e3742002-12-13 20:15:29 +00001604 else
1605 {
1606 /* Withdraw the route from the kernel. */
1607 if (old_select
1608 && old_select->type == ZEBRA_ROUTE_BGP
1609 && old_select->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04001610 bgp_zebra_withdraw (p, old_select, safi);
paul718e3742002-12-13 20:15:29 +00001611 }
1612 }
paulb40d9392005-08-22 22:34:41 +00001613
1614 /* Reap old select bgp_info, it it has been removed */
1615 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1616 bgp_info_reap (rn, old_select);
1617
paul200df112005-06-01 11:17:05 +00001618 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1619 return WQ_SUCCESS;
paul718e3742002-12-13 20:15:29 +00001620}
1621
paul200df112005-06-01 11:17:05 +00001622static void
paul0fb58d52005-11-14 14:31:49 +00001623bgp_processq_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001624{
paul0fb58d52005-11-14 14:31:49 +00001625 struct bgp_process_queue *pq = data;
Chris Caputo228da422009-07-18 05:44:03 +00001626 struct bgp_table *table = pq->rn->table;
paul0fb58d52005-11-14 14:31:49 +00001627
Chris Caputo228da422009-07-18 05:44:03 +00001628 bgp_unlock (pq->bgp);
paul200df112005-06-01 11:17:05 +00001629 bgp_unlock_node (pq->rn);
Chris Caputo228da422009-07-18 05:44:03 +00001630 bgp_table_unlock (table);
paul200df112005-06-01 11:17:05 +00001631 XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1632}
1633
1634static void
1635bgp_process_queue_init (void)
1636{
1637 bm->process_main_queue
1638 = work_queue_new (bm->master, "process_main_queue");
1639 bm->process_rsclient_queue
1640 = work_queue_new (bm->master, "process_rsclient_queue");
1641
1642 if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1643 {
1644 zlog_err ("%s: Failed to allocate work queue", __func__);
1645 exit (1);
1646 }
1647
1648 bm->process_main_queue->spec.workfunc = &bgp_process_main;
paul200df112005-06-01 11:17:05 +00001649 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
Paul Jakma838bbde2010-01-08 14:05:32 +00001650 bm->process_main_queue->spec.max_retries = 0;
1651 bm->process_main_queue->spec.hold = 50;
1652
1653 memcpy (bm->process_rsclient_queue, bm->process_main_queue,
1654 sizeof (struct work_queue *));
1655 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
paul200df112005-06-01 11:17:05 +00001656}
1657
1658void
paulfee0f4c2004-09-13 05:12:46 +00001659bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1660{
paul200df112005-06-01 11:17:05 +00001661 struct bgp_process_queue *pqnode;
1662
1663 /* already scheduled for processing? */
1664 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1665 return;
1666
1667 if ( (bm->process_main_queue == NULL) ||
1668 (bm->process_rsclient_queue == NULL) )
1669 bgp_process_queue_init ();
1670
1671 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1672 sizeof (struct bgp_process_queue));
1673 if (!pqnode)
1674 return;
Chris Caputo228da422009-07-18 05:44:03 +00001675
1676 /* all unlocked in bgp_processq_del */
1677 bgp_table_lock (rn->table);
1678 pqnode->rn = bgp_lock_node (rn);
paul200df112005-06-01 11:17:05 +00001679 pqnode->bgp = bgp;
Chris Caputo228da422009-07-18 05:44:03 +00001680 bgp_lock (bgp);
paul200df112005-06-01 11:17:05 +00001681 pqnode->afi = afi;
1682 pqnode->safi = safi;
1683
paulfee0f4c2004-09-13 05:12:46 +00001684 switch (rn->table->type)
1685 {
paul200df112005-06-01 11:17:05 +00001686 case BGP_TABLE_MAIN:
1687 work_queue_add (bm->process_main_queue, pqnode);
1688 break;
1689 case BGP_TABLE_RSCLIENT:
1690 work_queue_add (bm->process_rsclient_queue, pqnode);
1691 break;
paulfee0f4c2004-09-13 05:12:46 +00001692 }
paul200df112005-06-01 11:17:05 +00001693
1694 return;
paulfee0f4c2004-09-13 05:12:46 +00001695}
hasso0a486e52005-02-01 20:57:17 +00001696
paul94f2b392005-06-28 12:44:16 +00001697static int
hasso0a486e52005-02-01 20:57:17 +00001698bgp_maximum_prefix_restart_timer (struct thread *thread)
1699{
1700 struct peer *peer;
1701
1702 peer = THREAD_ARG (thread);
1703 peer->t_pmax_restart = NULL;
1704
1705 if (BGP_DEBUG (events, EVENTS))
1706 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1707 peer->host);
1708
1709 peer_clear (peer);
1710
1711 return 0;
1712}
1713
paulfee0f4c2004-09-13 05:12:46 +00001714int
paul5228ad22004-06-04 17:58:18 +00001715bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1716 safi_t safi, int always)
paul718e3742002-12-13 20:15:29 +00001717{
hassoe0701b72004-05-20 09:19:34 +00001718 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1719 return 0;
1720
1721 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
paul718e3742002-12-13 20:15:29 +00001722 {
hassoe0701b72004-05-20 09:19:34 +00001723 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1724 && ! always)
1725 return 0;
paul718e3742002-12-13 20:15:29 +00001726
hassoe0701b72004-05-20 09:19:34 +00001727 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001728 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1729 "limit %ld", afi_safi_print (afi, safi), peer->host,
1730 peer->pcount[afi][safi], peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001731 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
paul718e3742002-12-13 20:15:29 +00001732
hassoe0701b72004-05-20 09:19:34 +00001733 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1734 return 0;
paul718e3742002-12-13 20:15:29 +00001735
hassoe0701b72004-05-20 09:19:34 +00001736 {
paul5228ad22004-06-04 17:58:18 +00001737 u_int8_t ndata[7];
hassoe0701b72004-05-20 09:19:34 +00001738
1739 if (safi == SAFI_MPLS_VPN)
Denis Ovsienko42e6d742011-07-14 12:36:19 +04001740 safi = SAFI_MPLS_LABELED_VPN;
paul5228ad22004-06-04 17:58:18 +00001741
1742 ndata[0] = (afi >> 8);
1743 ndata[1] = afi;
1744 ndata[2] = safi;
1745 ndata[3] = (peer->pmax[afi][safi] >> 24);
1746 ndata[4] = (peer->pmax[afi][safi] >> 16);
1747 ndata[5] = (peer->pmax[afi][safi] >> 8);
1748 ndata[6] = (peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001749
1750 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1751 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1752 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1753 }
hasso0a486e52005-02-01 20:57:17 +00001754
1755 /* restart timer start */
1756 if (peer->pmax_restart[afi][safi])
1757 {
1758 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1759
1760 if (BGP_DEBUG (events, EVENTS))
1761 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1762 peer->host, peer->v_pmax_restart);
1763
1764 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1765 peer->v_pmax_restart);
1766 }
1767
hassoe0701b72004-05-20 09:19:34 +00001768 return 1;
paul718e3742002-12-13 20:15:29 +00001769 }
hassoe0701b72004-05-20 09:19:34 +00001770 else
1771 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1772
1773 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1774 {
1775 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1776 && ! always)
1777 return 0;
1778
1779 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001780 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1781 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1782 peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001783 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1784 }
1785 else
1786 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
paul718e3742002-12-13 20:15:29 +00001787 return 0;
1788}
1789
paulb40d9392005-08-22 22:34:41 +00001790/* Unconditionally remove the route from the RIB, without taking
1791 * damping into consideration (eg, because the session went down)
1792 */
paul94f2b392005-06-28 12:44:16 +00001793static void
paul718e3742002-12-13 20:15:29 +00001794bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1795 afi_t afi, safi_t safi)
1796{
paul902212c2006-02-05 17:51:19 +00001797 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1798
1799 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1800 bgp_info_delete (rn, ri); /* keep historical info */
1801
paulb40d9392005-08-22 22:34:41 +00001802 bgp_process (peer->bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001803}
1804
paul94f2b392005-06-28 12:44:16 +00001805static void
paul718e3742002-12-13 20:15:29 +00001806bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
paulb40d9392005-08-22 22:34:41 +00001807 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001808{
paul718e3742002-12-13 20:15:29 +00001809 int status = BGP_DAMP_NONE;
1810
paulb40d9392005-08-22 22:34:41 +00001811 /* apply dampening, if result is suppressed, we'll be retaining
1812 * the bgp_info in the RIB for historical reference.
1813 */
1814 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00001815 && peer->sort == BGP_PEER_EBGP)
paulb40d9392005-08-22 22:34:41 +00001816 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1817 == BGP_DAMP_SUPPRESSED)
paul902212c2006-02-05 17:51:19 +00001818 {
paul902212c2006-02-05 17:51:19 +00001819 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1820 return;
1821 }
1822
1823 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00001824}
1825
paul94f2b392005-06-28 12:44:16 +00001826static void
paulfee0f4c2004-09-13 05:12:46 +00001827bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1828 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1829 int sub_type, struct prefix_rd *prd, u_char *tag)
1830{
1831 struct bgp_node *rn;
1832 struct bgp *bgp;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001833 struct attr new_attr;
1834 struct attr_extra new_extra;
paulfee0f4c2004-09-13 05:12:46 +00001835 struct attr *attr_new;
1836 struct attr *attr_new2;
1837 struct bgp_info *ri;
1838 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001839 const char *reason;
paulfee0f4c2004-09-13 05:12:46 +00001840 char buf[SU_ADDRSTRLEN];
1841
1842 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1843 if (peer == rsclient)
1844 return;
1845
1846 bgp = peer->bgp;
1847 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1848
1849 /* Check previously received route. */
1850 for (ri = rn->info; ri; ri = ri->next)
1851 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1852 break;
1853
1854 /* AS path loop check. */
1855 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1856 {
1857 reason = "as-path contains our own AS;";
1858 goto filtered;
1859 }
1860
1861 /* Route reflector originator ID check. */
1862 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00001863 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001864 {
1865 reason = "originator is us;";
1866 goto filtered;
1867 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001868
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001869 new_attr.extra = &new_extra;
Paul Jakmafb982c22007-05-04 20:15:47 +00001870 bgp_attr_dup (&new_attr, attr);
paulfee0f4c2004-09-13 05:12:46 +00001871
1872 /* Apply export policy. */
1873 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1874 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1875 {
1876 reason = "export-policy;";
1877 goto filtered;
1878 }
1879
1880 attr_new2 = bgp_attr_intern (&new_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001881
paulfee0f4c2004-09-13 05:12:46 +00001882 /* Apply import policy. */
1883 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1884 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001885 bgp_attr_unintern (&attr_new2);
paulfee0f4c2004-09-13 05:12:46 +00001886
1887 reason = "import-policy;";
1888 goto filtered;
1889 }
1890
1891 attr_new = bgp_attr_intern (&new_attr);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001892 bgp_attr_unintern (&attr_new2);
paulfee0f4c2004-09-13 05:12:46 +00001893
1894 /* IPv4 unicast next hop check. */
G.Balaji5a616c02011-11-26 21:58:42 +04001895 if ((afi == AFI_IP) && ((safi == SAFI_UNICAST) || safi == SAFI_MULTICAST))
paulfee0f4c2004-09-13 05:12:46 +00001896 {
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04001897 /* Next hop must not be 0.0.0.0 nor Class D/E address. */
paulfee0f4c2004-09-13 05:12:46 +00001898 if (new_attr.nexthop.s_addr == 0
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04001899 || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr)))
paulfee0f4c2004-09-13 05:12:46 +00001900 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001901 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001902
1903 reason = "martian next-hop;";
1904 goto filtered;
1905 }
1906 }
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001907
paulfee0f4c2004-09-13 05:12:46 +00001908 /* If the update is implicit withdraw. */
1909 if (ri)
1910 {
Stephen Hemminger65957882010-01-15 16:22:10 +03001911 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001912
1913 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00001914 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1915 && attrhash_cmp (ri->attr, attr_new))
paulfee0f4c2004-09-13 05:12:46 +00001916 {
1917
Paul Jakma1a392d42006-09-07 00:24:49 +00001918 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001919
1920 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001921 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001922 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1923 peer->host,
1924 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1925 p->prefixlen, rsclient->host);
1926
Chris Caputo228da422009-07-18 05:44:03 +00001927 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001928 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001929
Chris Caputo228da422009-07-18 05:44:03 +00001930 return;
paulfee0f4c2004-09-13 05:12:46 +00001931 }
1932
Paul Jakma16d2e242007-04-10 19:32:10 +00001933 /* Withdraw/Announce before we fully processed the withdraw */
1934 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1935 bgp_info_restore (rn, ri);
1936
paulfee0f4c2004-09-13 05:12:46 +00001937 /* Received Logging. */
1938 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001939 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001940 peer->host,
1941 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1942 p->prefixlen, rsclient->host);
1943
1944 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00001945 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001946
1947 /* Update to new attribute. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001948 bgp_attr_unintern (&ri->attr);
paulfee0f4c2004-09-13 05:12:46 +00001949 ri->attr = attr_new;
1950
1951 /* Update MPLS tag. */
1952 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001953 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001954
Paul Jakma1a392d42006-09-07 00:24:49 +00001955 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001956
1957 /* Process change. */
1958 bgp_process (bgp, rn, afi, safi);
1959 bgp_unlock_node (rn);
1960
1961 return;
1962 }
1963
1964 /* Received Logging. */
1965 if (BGP_DEBUG (update, UPDATE_IN))
1966 {
ajsd2c1f162004-12-08 21:10:20 +00001967 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001968 peer->host,
1969 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1970 p->prefixlen, rsclient->host);
1971 }
1972
1973 /* Make new BGP info. */
1974 new = bgp_info_new ();
1975 new->type = type;
1976 new->sub_type = sub_type;
1977 new->peer = peer;
1978 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03001979 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001980
1981 /* Update MPLS tag. */
1982 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001983 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001984
Paul Jakma1a392d42006-09-07 00:24:49 +00001985 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001986
1987 /* Register new BGP information. */
1988 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00001989
1990 /* route_node_get lock */
1991 bgp_unlock_node (rn);
1992
paulfee0f4c2004-09-13 05:12:46 +00001993 /* Process change. */
1994 bgp_process (bgp, rn, afi, safi);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00001995
paulfee0f4c2004-09-13 05:12:46 +00001996 return;
1997
1998 filtered:
1999
2000 /* This BGP update is filtered. Log the reason then update BGP entry. */
2001 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002002 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00002003 "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
2004 peer->host,
2005 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2006 p->prefixlen, rsclient->host, reason);
2007
2008 if (ri)
paulb40d9392005-08-22 22:34:41 +00002009 bgp_rib_remove (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00002010
2011 bgp_unlock_node (rn);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002012
paulfee0f4c2004-09-13 05:12:46 +00002013 return;
2014}
2015
paul94f2b392005-06-28 12:44:16 +00002016static void
paulfee0f4c2004-09-13 05:12:46 +00002017bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
2018 struct peer *peer, struct prefix *p, int type, int sub_type,
2019 struct prefix_rd *prd, u_char *tag)
Chris Caputo228da422009-07-18 05:44:03 +00002020{
paulfee0f4c2004-09-13 05:12:46 +00002021 struct bgp_node *rn;
2022 struct bgp_info *ri;
2023 char buf[SU_ADDRSTRLEN];
2024
2025 if (rsclient == peer)
Chris Caputo228da422009-07-18 05:44:03 +00002026 return;
paulfee0f4c2004-09-13 05:12:46 +00002027
2028 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
2029
2030 /* Lookup withdrawn route. */
2031 for (ri = rn->info; ri; ri = ri->next)
2032 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2033 break;
2034
2035 /* Withdraw specified route from routing table. */
2036 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002037 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00002038 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002039 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00002040 "%s Can't find the route %s/%d", peer->host,
2041 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2042 p->prefixlen);
2043
2044 /* Unlock bgp_node_get() lock. */
Chris Caputo228da422009-07-18 05:44:03 +00002045 bgp_unlock_node (rn);
2046}
paulfee0f4c2004-09-13 05:12:46 +00002047
paul94f2b392005-06-28 12:44:16 +00002048static int
paulfee0f4c2004-09-13 05:12:46 +00002049bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
paul718e3742002-12-13 20:15:29 +00002050 afi_t afi, safi_t safi, int type, int sub_type,
2051 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2052{
2053 int ret;
2054 int aspath_loop_count = 0;
2055 struct bgp_node *rn;
2056 struct bgp *bgp;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002057 struct attr new_attr;
2058 struct attr_extra new_extra;
paul718e3742002-12-13 20:15:29 +00002059 struct attr *attr_new;
2060 struct bgp_info *ri;
2061 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00002062 const char *reason;
paul718e3742002-12-13 20:15:29 +00002063 char buf[SU_ADDRSTRLEN];
2064
2065 bgp = peer->bgp;
paulfee0f4c2004-09-13 05:12:46 +00002066 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
Paul Jakmafb982c22007-05-04 20:15:47 +00002067
paul718e3742002-12-13 20:15:29 +00002068 /* When peer's soft reconfiguration enabled. Record input packet in
2069 Adj-RIBs-In. */
Jorge Boncompte [DTI2]343aa822012-05-07 16:53:08 +00002070 if (! soft_reconfig && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2071 && peer != bgp->peer_self)
paul718e3742002-12-13 20:15:29 +00002072 bgp_adj_in_set (rn, peer, attr);
2073
2074 /* Check previously received route. */
2075 for (ri = rn->info; ri; ri = ri->next)
2076 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2077 break;
2078
2079 /* AS path local-as loop check. */
2080 if (peer->change_local_as)
2081 {
2082 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2083 aspath_loop_count = 1;
2084
2085 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2086 {
2087 reason = "as-path contains our own AS;";
2088 goto filtered;
2089 }
2090 }
2091
2092 /* AS path loop check. */
2093 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2094 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2095 && aspath_loop_check(attr->aspath, bgp->confed_id)
2096 > peer->allowas_in[afi][safi]))
2097 {
2098 reason = "as-path contains our own AS;";
2099 goto filtered;
2100 }
2101
2102 /* Route reflector originator ID check. */
2103 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00002104 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +00002105 {
2106 reason = "originator is us;";
2107 goto filtered;
2108 }
2109
2110 /* Route reflector cluster ID check. */
2111 if (bgp_cluster_filter (peer, attr))
2112 {
2113 reason = "reflected from the same cluster;";
2114 goto filtered;
2115 }
2116
2117 /* Apply incoming filter. */
2118 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2119 {
2120 reason = "filter;";
2121 goto filtered;
2122 }
2123
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002124 new_attr.extra = &new_extra;
Paul Jakmafb982c22007-05-04 20:15:47 +00002125 bgp_attr_dup (&new_attr, attr);
paul718e3742002-12-13 20:15:29 +00002126
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002127 /* Apply incoming route-map. */
paul718e3742002-12-13 20:15:29 +00002128 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2129 {
2130 reason = "route-map;";
2131 goto filtered;
2132 }
2133
2134 /* IPv4 unicast next hop check. */
2135 if (afi == AFI_IP && safi == SAFI_UNICAST)
2136 {
2137 /* If the peer is EBGP and nexthop is not on connected route,
2138 discard it. */
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002139 if (peer->sort == BGP_PEER_EBGP && peer->ttl == 1
Denis Ovsienko8e80bdf2011-08-05 18:52:52 +04002140 && ! bgp_nexthop_onlink (afi, &new_attr)
hasso6ffd2072005-02-02 14:50:11 +00002141 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
paul718e3742002-12-13 20:15:29 +00002142 {
2143 reason = "non-connected next-hop;";
2144 goto filtered;
2145 }
2146
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04002147 /* Next hop must not be 0.0.0.0 nor Class D/E address. Next hop
paul718e3742002-12-13 20:15:29 +00002148 must not be my own address. */
Jorge Boncompte [DTI2]10f9bf32012-05-07 16:52:52 +00002149 if (new_attr.nexthop.s_addr == 0
2150 || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr))
2151 || bgp_nexthop_self (&new_attr))
paul718e3742002-12-13 20:15:29 +00002152 {
2153 reason = "martian next-hop;";
2154 goto filtered;
2155 }
2156 }
2157
2158 attr_new = bgp_attr_intern (&new_attr);
2159
2160 /* If the update is implicit withdraw. */
2161 if (ri)
2162 {
Stephen Hemminger65957882010-01-15 16:22:10 +03002163 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002164
2165 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00002166 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2167 && attrhash_cmp (ri->attr, attr_new))
paul718e3742002-12-13 20:15:29 +00002168 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002169 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00002170
2171 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002172 && peer->sort == BGP_PEER_EBGP
paul718e3742002-12-13 20:15:29 +00002173 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2174 {
2175 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002176 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002177 peer->host,
2178 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2179 p->prefixlen);
2180
paul902212c2006-02-05 17:51:19 +00002181 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2182 {
2183 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2184 bgp_process (bgp, rn, afi, safi);
2185 }
paul718e3742002-12-13 20:15:29 +00002186 }
Paul Jakma16d2e242007-04-10 19:32:10 +00002187 else /* Duplicate - odd */
paul718e3742002-12-13 20:15:29 +00002188 {
2189 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002190 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002191 "%s rcvd %s/%d...duplicate ignored",
2192 peer->host,
2193 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2194 p->prefixlen);
hasso93406d82005-02-02 14:40:33 +00002195
2196 /* graceful restart STALE flag unset. */
2197 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2198 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002199 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
paul902212c2006-02-05 17:51:19 +00002200 bgp_process (bgp, rn, afi, safi);
hasso93406d82005-02-02 14:40:33 +00002201 }
paul718e3742002-12-13 20:15:29 +00002202 }
2203
2204 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002205 bgp_attr_unintern (&attr_new);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002206
paul718e3742002-12-13 20:15:29 +00002207 return 0;
2208 }
2209
Paul Jakma16d2e242007-04-10 19:32:10 +00002210 /* Withdraw/Announce before we fully processed the withdraw */
2211 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2212 {
2213 if (BGP_DEBUG (update, UPDATE_IN))
2214 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2215 peer->host,
2216 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2217 p->prefixlen);
2218 bgp_info_restore (rn, ri);
2219 }
2220
paul718e3742002-12-13 20:15:29 +00002221 /* Received Logging. */
2222 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002223 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002224 peer->host,
2225 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2226 p->prefixlen);
2227
hasso93406d82005-02-02 14:40:33 +00002228 /* graceful restart STALE flag unset. */
2229 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma1a392d42006-09-07 00:24:49 +00002230 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
hasso93406d82005-02-02 14:40:33 +00002231
paul718e3742002-12-13 20:15:29 +00002232 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00002233 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul902212c2006-02-05 17:51:19 +00002234
2235 /* implicit withdraw, decrement aggregate and pcount here.
2236 * only if update is accepted, they'll increment below.
2237 */
paul902212c2006-02-05 17:51:19 +00002238 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2239
paul718e3742002-12-13 20:15:29 +00002240 /* Update bgp route dampening information. */
2241 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002242 && peer->sort == BGP_PEER_EBGP)
paul718e3742002-12-13 20:15:29 +00002243 {
2244 /* This is implicit withdraw so we should update dampening
2245 information. */
2246 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2247 bgp_damp_withdraw (ri, rn, afi, safi, 1);
paul718e3742002-12-13 20:15:29 +00002248 }
2249
paul718e3742002-12-13 20:15:29 +00002250 /* Update to new attribute. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002251 bgp_attr_unintern (&ri->attr);
paul718e3742002-12-13 20:15:29 +00002252 ri->attr = attr_new;
2253
2254 /* Update MPLS tag. */
2255 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002256 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002257
2258 /* Update bgp route dampening information. */
2259 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002260 && peer->sort == BGP_PEER_EBGP)
paul718e3742002-12-13 20:15:29 +00002261 {
2262 /* Now we do normal update dampening. */
2263 ret = bgp_damp_update (ri, rn, afi, safi);
2264 if (ret == BGP_DAMP_SUPPRESSED)
2265 {
2266 bgp_unlock_node (rn);
2267 return 0;
2268 }
2269 }
2270
2271 /* Nexthop reachability check. */
2272 if ((afi == AFI_IP || afi == AFI_IP6)
2273 && safi == SAFI_UNICAST
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002274 && (peer->sort == BGP_PEER_IBGP
2275 || peer->sort == BGP_PEER_CONFED
2276 || (peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002277 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002278 {
2279 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002280 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002281 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002282 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002283 }
2284 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002285 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002286
2287 /* Process change. */
2288 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2289
2290 bgp_process (bgp, rn, afi, safi);
2291 bgp_unlock_node (rn);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002292
paul718e3742002-12-13 20:15:29 +00002293 return 0;
2294 }
2295
2296 /* Received Logging. */
2297 if (BGP_DEBUG (update, UPDATE_IN))
2298 {
ajsd2c1f162004-12-08 21:10:20 +00002299 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002300 peer->host,
2301 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2302 p->prefixlen);
2303 }
2304
paul718e3742002-12-13 20:15:29 +00002305 /* Make new BGP info. */
2306 new = bgp_info_new ();
2307 new->type = type;
2308 new->sub_type = sub_type;
2309 new->peer = peer;
2310 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03002311 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002312
2313 /* Update MPLS tag. */
2314 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002315 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002316
2317 /* Nexthop reachability check. */
2318 if ((afi == AFI_IP || afi == AFI_IP6)
2319 && safi == SAFI_UNICAST
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +00002320 && (peer->sort == BGP_PEER_IBGP
2321 || peer->sort == BGP_PEER_CONFED
2322 || (peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002323 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002324 {
2325 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002326 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002327 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002328 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002329 }
2330 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002331 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002332
paul902212c2006-02-05 17:51:19 +00002333 /* Increment prefix */
paul718e3742002-12-13 20:15:29 +00002334 bgp_aggregate_increment (bgp, p, new, afi, safi);
2335
2336 /* Register new BGP information. */
2337 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00002338
2339 /* route_node_get lock */
2340 bgp_unlock_node (rn);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002341
paul718e3742002-12-13 20:15:29 +00002342 /* If maximum prefix count is configured and current prefix
2343 count exeed it. */
hassoe0701b72004-05-20 09:19:34 +00002344 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2345 return -1;
paul718e3742002-12-13 20:15:29 +00002346
2347 /* Process change. */
2348 bgp_process (bgp, rn, afi, safi);
2349
2350 return 0;
2351
2352 /* This BGP update is filtered. Log the reason then update BGP
2353 entry. */
2354 filtered:
2355 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002356 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002357 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2358 peer->host,
2359 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2360 p->prefixlen, reason);
2361
2362 if (ri)
paulb40d9392005-08-22 22:34:41 +00002363 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002364
2365 bgp_unlock_node (rn);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002366
paul718e3742002-12-13 20:15:29 +00002367 return 0;
2368}
2369
2370int
paulfee0f4c2004-09-13 05:12:46 +00002371bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2372 afi_t afi, safi_t safi, int type, int sub_type,
2373 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2374{
2375 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002376 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00002377 struct bgp *bgp;
2378 int ret;
2379
2380 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2381 soft_reconfig);
2382
2383 bgp = peer->bgp;
2384
2385 /* Process the update for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002386 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002387 {
2388 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2389 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2390 sub_type, prd, tag);
2391 }
2392
2393 return ret;
2394}
2395
2396int
paul718e3742002-12-13 20:15:29 +00002397bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
paul94f2b392005-06-28 12:44:16 +00002398 afi_t afi, safi_t safi, int type, int sub_type,
2399 struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00002400{
2401 struct bgp *bgp;
2402 char buf[SU_ADDRSTRLEN];
2403 struct bgp_node *rn;
2404 struct bgp_info *ri;
paulfee0f4c2004-09-13 05:12:46 +00002405 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002406 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002407
2408 bgp = peer->bgp;
2409
paulfee0f4c2004-09-13 05:12:46 +00002410 /* Process the withdraw for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002411 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002412 {
2413 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2414 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2415 }
2416
paul718e3742002-12-13 20:15:29 +00002417 /* Logging. */
2418 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002419 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
paul718e3742002-12-13 20:15:29 +00002420 peer->host,
2421 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2422 p->prefixlen);
2423
2424 /* Lookup node. */
paulfee0f4c2004-09-13 05:12:46 +00002425 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00002426
2427 /* If peer is soft reconfiguration enabled. Record input packet for
2428 further calculation. */
2429 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2430 && peer != bgp->peer_self)
2431 bgp_adj_in_unset (rn, peer);
2432
2433 /* Lookup withdrawn route. */
2434 for (ri = rn->info; ri; ri = ri->next)
2435 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2436 break;
2437
2438 /* Withdraw specified route from routing table. */
2439 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002440 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002441 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002442 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002443 "%s Can't find the route %s/%d", peer->host,
2444 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2445 p->prefixlen);
2446
2447 /* Unlock bgp_node_get() lock. */
2448 bgp_unlock_node (rn);
2449
2450 return 0;
2451}
2452
2453void
2454bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2455{
2456 struct bgp *bgp;
Jorge Boncompte [DTI2]e16a4132012-05-07 16:52:57 +00002457 struct attr attr;
Jorge Boncompte [DTI2]577ac572012-05-07 16:53:06 +00002458 struct aspath *aspath;
paul718e3742002-12-13 20:15:29 +00002459 struct prefix p;
2460 struct bgp_info binfo;
2461 struct peer *from;
2462 int ret = RMAP_DENYMATCH;
Paul Jakmafb982c22007-05-04 20:15:47 +00002463
Paul Jakmab2497022007-06-14 11:17:58 +00002464 if (!(afi == AFI_IP || afi == AFI_IP6))
Paul Jakmafb982c22007-05-04 20:15:47 +00002465 return;
2466
paul718e3742002-12-13 20:15:29 +00002467 bgp = peer->bgp;
2468 from = bgp->peer_self;
Paul Jakmafb982c22007-05-04 20:15:47 +00002469
paul718e3742002-12-13 20:15:29 +00002470 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2471 aspath = attr.aspath;
2472 attr.local_pref = bgp->default_local_pref;
2473 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2474
2475 if (afi == AFI_IP)
2476 str2prefix ("0.0.0.0/0", &p);
2477#ifdef HAVE_IPV6
2478 else if (afi == AFI_IP6)
2479 {
Jorge Boncompte [DTI2]6182d652012-05-07 16:53:02 +00002480 struct attr_extra *ae = attr.extra;
2481
paul718e3742002-12-13 20:15:29 +00002482 str2prefix ("::/0", &p);
2483
2484 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002485 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +00002486 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002487 ae->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00002488
2489 /* If the peer is on shared nextwork and we have link-local
2490 nexthop set it. */
2491 if (peer->shared_network
2492 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2493 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002494 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00002495 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002496 ae->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00002497 }
2498 }
2499#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00002500
2501 if (peer->default_rmap[afi][safi].name)
2502 {
2503 binfo.peer = bgp->peer_self;
2504 binfo.attr = &attr;
2505
paulfee0f4c2004-09-13 05:12:46 +00002506 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2507
paul718e3742002-12-13 20:15:29 +00002508 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2509 RMAP_BGP, &binfo);
2510
paulfee0f4c2004-09-13 05:12:46 +00002511 bgp->peer_self->rmap_type = 0;
2512
paul718e3742002-12-13 20:15:29 +00002513 if (ret == RMAP_DENYMATCH)
2514 {
2515 bgp_attr_flush (&attr);
2516 withdraw = 1;
2517 }
2518 }
2519
2520 if (withdraw)
2521 {
2522 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2523 bgp_default_withdraw_send (peer, afi, safi);
2524 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2525 }
2526 else
2527 {
2528 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2529 bgp_default_update_send (peer, &attr, afi, safi, from);
2530 }
Paul Jakmafb982c22007-05-04 20:15:47 +00002531
2532 bgp_attr_extra_free (&attr);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002533 aspath_unintern (&aspath);
paul718e3742002-12-13 20:15:29 +00002534}
2535
2536static void
2537bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
paulfee0f4c2004-09-13 05:12:46 +00002538 struct bgp_table *table, int rsclient)
paul718e3742002-12-13 20:15:29 +00002539{
2540 struct bgp_node *rn;
2541 struct bgp_info *ri;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002542 struct attr attr;
2543 struct attr_extra extra;
2544
paul718e3742002-12-13 20:15:29 +00002545 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002546 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
paul718e3742002-12-13 20:15:29 +00002547
2548 if (safi != SAFI_MPLS_VPN
2549 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2550 bgp_default_originate (peer, afi, safi, 0);
2551
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00002552 /* It's initialized in bgp_announce_[check|check_rsclient]() */
2553 attr.extra = &extra;
2554
paul718e3742002-12-13 20:15:29 +00002555 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2556 for (ri = rn->info; ri; ri = ri->next)
2557 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2558 {
paulfee0f4c2004-09-13 05:12:46 +00002559 if ( (rsclient) ?
2560 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2561 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
paul718e3742002-12-13 20:15:29 +00002562 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2563 else
2564 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
2565 }
2566}
2567
2568void
2569bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2570{
2571 struct bgp_node *rn;
2572 struct bgp_table *table;
2573
2574 if (peer->status != Established)
2575 return;
2576
2577 if (! peer->afc_nego[afi][safi])
2578 return;
2579
2580 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2581 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2582 return;
2583
2584 if (safi != SAFI_MPLS_VPN)
paulfee0f4c2004-09-13 05:12:46 +00002585 bgp_announce_table (peer, afi, safi, NULL, 0);
paul718e3742002-12-13 20:15:29 +00002586 else
2587 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2588 rn = bgp_route_next(rn))
2589 if ((table = (rn->info)) != NULL)
paulfee0f4c2004-09-13 05:12:46 +00002590 bgp_announce_table (peer, afi, safi, table, 0);
2591
2592 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2593 bgp_announce_table (peer, afi, safi, NULL, 1);
paul718e3742002-12-13 20:15:29 +00002594}
2595
2596void
2597bgp_announce_route_all (struct peer *peer)
2598{
2599 afi_t afi;
2600 safi_t safi;
2601
2602 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2603 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2604 bgp_announce_route (peer, afi, safi);
2605}
2606
2607static void
paulfee0f4c2004-09-13 05:12:46 +00002608bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002609 safi_t safi, struct bgp_table *table, struct prefix_rd *prd)
paulfee0f4c2004-09-13 05:12:46 +00002610{
2611 struct bgp_node *rn;
2612 struct bgp_adj_in *ain;
2613
2614 if (! table)
2615 table = rsclient->bgp->rib[afi][safi];
2616
2617 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2618 for (ain = rn->adj_in; ain; ain = ain->next)
2619 {
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002620 struct bgp_info *ri = rn->info;
2621
paulfee0f4c2004-09-13 05:12:46 +00002622 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002623 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd,
2624 (bgp_info_extra_get (ri))->tag);
paulfee0f4c2004-09-13 05:12:46 +00002625 }
2626}
2627
2628void
2629bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2630{
2631 struct bgp_table *table;
2632 struct bgp_node *rn;
2633
2634 if (safi != SAFI_MPLS_VPN)
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002635 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL, NULL);
paulfee0f4c2004-09-13 05:12:46 +00002636
2637 else
2638 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2639 rn = bgp_route_next (rn))
2640 if ((table = rn->info) != NULL)
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002641 {
2642 struct prefix_rd prd;
2643 prd.family = AF_UNSPEC;
2644 prd.prefixlen = 64;
2645 memcpy(&prd.val, rn->p.u.val, 8);
2646
2647 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table, &prd);
2648 }
paulfee0f4c2004-09-13 05:12:46 +00002649}
2650
2651static void
paul718e3742002-12-13 20:15:29 +00002652bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002653 struct bgp_table *table, struct prefix_rd *prd)
paul718e3742002-12-13 20:15:29 +00002654{
2655 int ret;
2656 struct bgp_node *rn;
2657 struct bgp_adj_in *ain;
2658
2659 if (! table)
2660 table = peer->bgp->rib[afi][safi];
2661
2662 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2663 for (ain = rn->adj_in; ain; ain = ain->next)
2664 {
2665 if (ain->peer == peer)
2666 {
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002667 struct bgp_info *ri = rn->info;
2668
paul718e3742002-12-13 20:15:29 +00002669 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2670 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002671 prd, (bgp_info_extra_get (ri))->tag, 1);
2672
paul718e3742002-12-13 20:15:29 +00002673 if (ret < 0)
2674 {
2675 bgp_unlock_node (rn);
2676 return;
2677 }
2678 continue;
2679 }
2680 }
2681}
2682
2683void
2684bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2685{
2686 struct bgp_node *rn;
2687 struct bgp_table *table;
2688
2689 if (peer->status != Established)
2690 return;
2691
2692 if (safi != SAFI_MPLS_VPN)
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002693 bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00002694 else
2695 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2696 rn = bgp_route_next (rn))
2697 if ((table = rn->info) != NULL)
Jorge Boncompte [DTI2]8692c502012-05-07 15:17:34 +00002698 {
2699 struct prefix_rd prd;
2700 prd.family = AF_UNSPEC;
2701 prd.prefixlen = 64;
2702 memcpy(&prd.val, rn->p.u.val, 8);
2703
2704 bgp_soft_reconfig_table (peer, afi, safi, table, &prd);
2705 }
paul718e3742002-12-13 20:15:29 +00002706}
2707
Chris Caputo228da422009-07-18 05:44:03 +00002708
2709struct bgp_clear_node_queue
2710{
2711 struct bgp_node *rn;
2712 enum bgp_clear_route_type purpose;
2713};
2714
paul200df112005-06-01 11:17:05 +00002715static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00002716bgp_clear_route_node (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002717{
Chris Caputo228da422009-07-18 05:44:03 +00002718 struct bgp_clear_node_queue *cnq = data;
2719 struct bgp_node *rn = cnq->rn;
Paul Jakma64e580a2006-02-21 01:09:01 +00002720 struct peer *peer = wq->spec.data;
paul200df112005-06-01 11:17:05 +00002721 struct bgp_info *ri;
Paul Jakma64e580a2006-02-21 01:09:01 +00002722 afi_t afi = rn->table->afi;
2723 safi_t safi = rn->table->safi;
paul200df112005-06-01 11:17:05 +00002724
Paul Jakma64e580a2006-02-21 01:09:01 +00002725 assert (rn && peer);
paul200df112005-06-01 11:17:05 +00002726
Paul Jakma64e580a2006-02-21 01:09:01 +00002727 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002728 if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
paul200df112005-06-01 11:17:05 +00002729 {
2730 /* graceful restart STALE flag set. */
Paul Jakma64e580a2006-02-21 01:09:01 +00002731 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2732 && peer->nsf[afi][safi]
paul200df112005-06-01 11:17:05 +00002733 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
Paul Jakma1a392d42006-09-07 00:24:49 +00002734 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2735 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
paul200df112005-06-01 11:17:05 +00002736 else
Paul Jakma64e580a2006-02-21 01:09:01 +00002737 bgp_rib_remove (rn, ri, peer, afi, safi);
paul200df112005-06-01 11:17:05 +00002738 break;
2739 }
paul200df112005-06-01 11:17:05 +00002740 return WQ_SUCCESS;
2741}
2742
2743static void
paul0fb58d52005-11-14 14:31:49 +00002744bgp_clear_node_queue_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002745{
Chris Caputo228da422009-07-18 05:44:03 +00002746 struct bgp_clear_node_queue *cnq = data;
2747 struct bgp_node *rn = cnq->rn;
2748 struct bgp_table *table = rn->table;
Paul Jakma64e580a2006-02-21 01:09:01 +00002749
2750 bgp_unlock_node (rn);
Chris Caputo228da422009-07-18 05:44:03 +00002751 bgp_table_unlock (table);
2752 XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
paul200df112005-06-01 11:17:05 +00002753}
2754
2755static void
paul94f2b392005-06-28 12:44:16 +00002756bgp_clear_node_complete (struct work_queue *wq)
paul200df112005-06-01 11:17:05 +00002757{
Paul Jakma64e580a2006-02-21 01:09:01 +00002758 struct peer *peer = wq->spec.data;
2759
Paul Jakma3e0c78e2006-03-06 18:06:53 +00002760 /* Tickle FSM to start moving again */
Paul Jakmaca058a32006-09-14 02:58:49 +00002761 BGP_EVENT_ADD (peer, Clearing_Completed);
Chris Caputo228da422009-07-18 05:44:03 +00002762
2763 peer_unlock (peer); /* bgp_clear_route */
paul200df112005-06-01 11:17:05 +00002764}
2765
2766static void
Paul Jakma64e580a2006-02-21 01:09:01 +00002767bgp_clear_node_queue_init (struct peer *peer)
paul200df112005-06-01 11:17:05 +00002768{
Paul Jakmaa2943652009-07-21 14:02:04 +01002769 char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
Paul Jakma64e580a2006-02-21 01:09:01 +00002770
Paul Jakmaa2943652009-07-21 14:02:04 +01002771 snprintf (wname, sizeof(wname), "clear %s", peer->host);
Paul Jakma64e580a2006-02-21 01:09:01 +00002772#undef CLEAR_QUEUE_NAME_LEN
2773
2774 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
paul200df112005-06-01 11:17:05 +00002775 {
2776 zlog_err ("%s: Failed to allocate work queue", __func__);
2777 exit (1);
2778 }
Paul Jakma64e580a2006-02-21 01:09:01 +00002779 peer->clear_node_queue->spec.hold = 10;
2780 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2781 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2782 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2783 peer->clear_node_queue->spec.max_retries = 0;
2784
2785 /* we only 'lock' this peer reference when the queue is actually active */
2786 peer->clear_node_queue->spec.data = peer;
paul200df112005-06-01 11:17:05 +00002787}
2788
paul718e3742002-12-13 20:15:29 +00002789static void
2790bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
Chris Caputo228da422009-07-18 05:44:03 +00002791 struct bgp_table *table, struct peer *rsclient,
2792 enum bgp_clear_route_type purpose)
paul718e3742002-12-13 20:15:29 +00002793{
2794 struct bgp_node *rn;
paul200df112005-06-01 11:17:05 +00002795
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002796
paul718e3742002-12-13 20:15:29 +00002797 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002798 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
Paul Jakma64e580a2006-02-21 01:09:01 +00002799
hasso6cf159b2005-03-21 10:28:14 +00002800 /* If still no table => afi/safi isn't configured at all or smth. */
2801 if (! table)
2802 return;
Paul Jakma65ca75e2006-05-04 08:08:15 +00002803
2804 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2805 {
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002806 struct bgp_info *ri;
2807 struct bgp_adj_in *ain;
2808 struct bgp_adj_out *aout;
2809
Paul Jakma65ca75e2006-05-04 08:08:15 +00002810 if (rn->info == NULL)
2811 continue;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002812
2813 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2814 * queued for every clearing peer, regardless of whether it is
2815 * relevant to the peer at hand.
2816 *
2817 * Overview: There are 3 different indices which need to be
2818 * scrubbed, potentially, when a peer is removed:
2819 *
2820 * 1 peer's routes visible via the RIB (ie accepted routes)
2821 * 2 peer's routes visible by the (optional) peer's adj-in index
2822 * 3 other routes visible by the peer's adj-out index
2823 *
2824 * 3 there is no hurry in scrubbing, once the struct peer is
2825 * removed from bgp->peer, we could just GC such deleted peer's
2826 * adj-outs at our leisure.
2827 *
2828 * 1 and 2 must be 'scrubbed' in some way, at least made
2829 * invisible via RIB index before peer session is allowed to be
2830 * brought back up. So one needs to know when such a 'search' is
2831 * complete.
2832 *
2833 * Ideally:
2834 *
2835 * - there'd be a single global queue or a single RIB walker
2836 * - rather than tracking which route_nodes still need to be
2837 * examined on a peer basis, we'd track which peers still
2838 * aren't cleared
2839 *
2840 * Given that our per-peer prefix-counts now should be reliable,
2841 * this may actually be achievable. It doesn't seem to be a huge
2842 * problem at this time,
2843 */
2844 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002845 if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002846 {
Chris Caputo228da422009-07-18 05:44:03 +00002847 struct bgp_clear_node_queue *cnq;
2848
2849 /* both unlocked in bgp_clear_node_queue_del */
2850 bgp_table_lock (rn->table);
2851 bgp_lock_node (rn);
2852 cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2853 sizeof (struct bgp_clear_node_queue));
2854 cnq->rn = rn;
2855 cnq->purpose = purpose;
2856 work_queue_add (peer->clear_node_queue, cnq);
2857 break;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002858 }
2859
2860 for (ain = rn->adj_in; ain; ain = ain->next)
Chris Caputo228da422009-07-18 05:44:03 +00002861 if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002862 {
2863 bgp_adj_in_remove (rn, ain);
2864 bgp_unlock_node (rn);
2865 break;
2866 }
2867 for (aout = rn->adj_out; aout; aout = aout->next)
Chris Caputo228da422009-07-18 05:44:03 +00002868 if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002869 {
2870 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2871 bgp_unlock_node (rn);
2872 break;
2873 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002874 }
2875 return;
2876}
2877
2878void
Chris Caputo228da422009-07-18 05:44:03 +00002879bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2880 enum bgp_clear_route_type purpose)
Paul Jakma65ca75e2006-05-04 08:08:15 +00002881{
2882 struct bgp_node *rn;
2883 struct bgp_table *table;
2884 struct peer *rsclient;
2885 struct listnode *node, *nnode;
hasso6cf159b2005-03-21 10:28:14 +00002886
Paul Jakma64e580a2006-02-21 01:09:01 +00002887 if (peer->clear_node_queue == NULL)
2888 bgp_clear_node_queue_init (peer);
paul200df112005-06-01 11:17:05 +00002889
Paul Jakmaca058a32006-09-14 02:58:49 +00002890 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2891 * Idle until it receives a Clearing_Completed event. This protects
2892 * against peers which flap faster than we can we clear, which could
2893 * lead to:
Paul Jakma64e580a2006-02-21 01:09:01 +00002894 *
2895 * a) race with routes from the new session being installed before
2896 * clear_route_node visits the node (to delete the route of that
2897 * peer)
2898 * b) resource exhaustion, clear_route_node likely leads to an entry
2899 * on the process_main queue. Fast-flapping could cause that queue
2900 * to grow and grow.
paul200df112005-06-01 11:17:05 +00002901 */
Paul Jakmaca058a32006-09-14 02:58:49 +00002902 if (!peer->clear_node_queue->thread)
2903 peer_lock (peer); /* bgp_clear_node_complete */
paulfee0f4c2004-09-13 05:12:46 +00002904
Chris Caputo228da422009-07-18 05:44:03 +00002905 switch (purpose)
paulfee0f4c2004-09-13 05:12:46 +00002906 {
Chris Caputo228da422009-07-18 05:44:03 +00002907 case BGP_CLEAR_ROUTE_NORMAL:
2908 if (safi != SAFI_MPLS_VPN)
2909 bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2910 else
2911 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2912 rn = bgp_route_next (rn))
2913 if ((table = rn->info) != NULL)
2914 bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2915
2916 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2917 if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2918 PEER_FLAG_RSERVER_CLIENT))
2919 bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2920 break;
2921
2922 case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2923 bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2924 break;
2925
2926 default:
2927 assert (0);
2928 break;
paulfee0f4c2004-09-13 05:12:46 +00002929 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002930
Paul Jakmaca058a32006-09-14 02:58:49 +00002931 /* If no routes were cleared, nothing was added to workqueue, the
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002932 * completion function won't be run by workqueue code - call it here.
2933 * XXX: Actually, this assumption doesn't hold, see
2934 * bgp_clear_route_table(), we queue all non-empty nodes.
Paul Jakmaca058a32006-09-14 02:58:49 +00002935 *
2936 * Additionally, there is a presumption in FSM that clearing is only
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002937 * really needed if peer state is Established - peers in
2938 * pre-Established states shouldn't have any route-update state
2939 * associated with them (in or out).
Paul Jakmaca058a32006-09-14 02:58:49 +00002940 *
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002941 * We still can get here in pre-Established though, through
2942 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2943 * check to ensure the assumption above holds.
Paul Jakmaca058a32006-09-14 02:58:49 +00002944 *
2945 * At some future point, this check could be move to the top of the
2946 * function, and do a quick early-return when state is
2947 * pre-Established, avoiding above list and table scans. Once we're
2948 * sure it is safe..
Paul Jakma65ca75e2006-05-04 08:08:15 +00002949 */
2950 if (!peer->clear_node_queue->thread)
2951 bgp_clear_node_complete (peer->clear_node_queue);
paul718e3742002-12-13 20:15:29 +00002952}
2953
2954void
2955bgp_clear_route_all (struct peer *peer)
2956{
2957 afi_t afi;
2958 safi_t safi;
2959
2960 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2961 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
Chris Caputo228da422009-07-18 05:44:03 +00002962 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
paul718e3742002-12-13 20:15:29 +00002963}
2964
2965void
2966bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2967{
2968 struct bgp_table *table;
2969 struct bgp_node *rn;
2970 struct bgp_adj_in *ain;
2971
2972 table = peer->bgp->rib[afi][safi];
2973
2974 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2975 for (ain = rn->adj_in; ain ; ain = ain->next)
2976 if (ain->peer == peer)
2977 {
2978 bgp_adj_in_remove (rn, ain);
2979 bgp_unlock_node (rn);
2980 break;
2981 }
2982}
hasso93406d82005-02-02 14:40:33 +00002983
2984void
2985bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2986{
2987 struct bgp_node *rn;
2988 struct bgp_info *ri;
2989 struct bgp_table *table;
2990
2991 table = peer->bgp->rib[afi][safi];
2992
2993 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2994 {
2995 for (ri = rn->info; ri; ri = ri->next)
2996 if (ri->peer == peer)
2997 {
2998 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2999 bgp_rib_remove (rn, ri, peer, afi, safi);
3000 break;
3001 }
3002 }
3003}
paul718e3742002-12-13 20:15:29 +00003004
3005/* Delete all kernel routes. */
3006void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003007bgp_cleanup_routes (void)
paul718e3742002-12-13 20:15:29 +00003008{
3009 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00003010 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00003011 struct bgp_node *rn;
3012 struct bgp_table *table;
3013 struct bgp_info *ri;
3014
paul1eb8ef22005-04-07 07:30:20 +00003015 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00003016 {
3017 table = bgp->rib[AFI_IP][SAFI_UNICAST];
3018
3019 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3020 for (ri = rn->info; ri; ri = ri->next)
3021 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
3022 && ri->type == ZEBRA_ROUTE_BGP
3023 && ri->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04003024 bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00003025
3026 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
3027
3028 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3029 for (ri = rn->info; ri; ri = ri->next)
3030 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
3031 && ri->type == ZEBRA_ROUTE_BGP
3032 && ri->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04003033 bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00003034 }
3035}
3036
3037void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003038bgp_reset (void)
paul718e3742002-12-13 20:15:29 +00003039{
3040 vty_reset ();
3041 bgp_zclient_reset ();
3042 access_list_reset ();
3043 prefix_list_reset ();
3044}
3045
3046/* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
3047 value. */
3048int
3049bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
3050{
3051 u_char *pnt;
3052 u_char *lim;
3053 struct prefix p;
3054 int psize;
3055 int ret;
3056
3057 /* Check peer status. */
3058 if (peer->status != Established)
3059 return 0;
3060
3061 pnt = packet->nlri;
3062 lim = pnt + packet->length;
3063
3064 for (; pnt < lim; pnt += psize)
3065 {
3066 /* Clear prefix structure. */
3067 memset (&p, 0, sizeof (struct prefix));
3068
3069 /* Fetch prefix length. */
3070 p.prefixlen = *pnt++;
3071 p.family = afi2family (packet->afi);
3072
3073 /* Already checked in nlri_sanity_check(). We do double check
3074 here. */
3075 if ((packet->afi == AFI_IP && p.prefixlen > 32)
3076 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
3077 return -1;
3078
3079 /* Packet size overflow check. */
3080 psize = PSIZE (p.prefixlen);
3081
3082 /* When packet overflow occur return immediately. */
3083 if (pnt + psize > lim)
3084 return -1;
3085
3086 /* Fetch prefix from NLRI packet. */
3087 memcpy (&p.u.prefix, pnt, psize);
3088
3089 /* Check address. */
3090 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3091 {
3092 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3093 {
paulf5ba3872004-07-09 12:11:31 +00003094 /*
3095 * From draft-ietf-idr-bgp4-22, Section 6.3:
3096 * If a BGP router receives an UPDATE message with a
3097 * semantically incorrect NLRI field, in which a prefix is
3098 * semantically incorrect (eg. an unexpected multicast IP
3099 * address), it should ignore the prefix.
3100 */
paul718e3742002-12-13 20:15:29 +00003101 zlog (peer->log, LOG_ERR,
3102 "IPv4 unicast NLRI is multicast address %s",
3103 inet_ntoa (p.u.prefix4));
paulf5ba3872004-07-09 12:11:31 +00003104
paul718e3742002-12-13 20:15:29 +00003105 return -1;
3106 }
3107 }
3108
3109#ifdef HAVE_IPV6
3110 /* Check address. */
3111 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3112 {
3113 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3114 {
3115 char buf[BUFSIZ];
3116
3117 zlog (peer->log, LOG_WARNING,
3118 "IPv6 link-local NLRI received %s ignore this NLRI",
3119 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3120
3121 continue;
3122 }
3123 }
3124#endif /* HAVE_IPV6 */
3125
3126 /* Normal process. */
3127 if (attr)
3128 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3129 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3130 else
3131 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3132 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3133
3134 /* Address family configuration mismatch or maximum-prefix count
3135 overflow. */
3136 if (ret < 0)
3137 return -1;
3138 }
3139
3140 /* Packet length consistency check. */
3141 if (pnt != lim)
3142 return -1;
3143
3144 return 0;
3145}
3146
3147/* NLRI encode syntax check routine. */
3148int
3149bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3150 bgp_size_t length)
3151{
3152 u_char *end;
3153 u_char prefixlen;
3154 int psize;
3155
3156 end = pnt + length;
3157
3158 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3159 syntactic validity. If the field is syntactically incorrect,
3160 then the Error Subcode is set to Invalid Network Field. */
3161
3162 while (pnt < end)
3163 {
3164 prefixlen = *pnt++;
3165
3166 /* Prefix length check. */
3167 if ((afi == AFI_IP && prefixlen > 32)
3168 || (afi == AFI_IP6 && prefixlen > 128))
3169 {
3170 plog_err (peer->log,
3171 "%s [Error] Update packet error (wrong prefix length %d)",
3172 peer->host, prefixlen);
3173 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3174 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3175 return -1;
3176 }
3177
3178 /* Packet size overflow check. */
3179 psize = PSIZE (prefixlen);
3180
3181 if (pnt + psize > end)
3182 {
3183 plog_err (peer->log,
3184 "%s [Error] Update packet error"
3185 " (prefix data overflow prefix size is %d)",
3186 peer->host, psize);
3187 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3188 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3189 return -1;
3190 }
3191
3192 pnt += psize;
3193 }
3194
3195 /* Packet length consistency check. */
3196 if (pnt != end)
3197 {
3198 plog_err (peer->log,
3199 "%s [Error] Update packet error"
3200 " (prefix length mismatch with total length)",
3201 peer->host);
3202 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3203 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3204 return -1;
3205 }
3206 return 0;
3207}
3208
paul94f2b392005-06-28 12:44:16 +00003209static struct bgp_static *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003210bgp_static_new (void)
paul718e3742002-12-13 20:15:29 +00003211{
Stephen Hemminger393deb92008-08-18 14:13:29 -07003212 return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
paul718e3742002-12-13 20:15:29 +00003213}
3214
paul94f2b392005-06-28 12:44:16 +00003215static void
paul718e3742002-12-13 20:15:29 +00003216bgp_static_free (struct bgp_static *bgp_static)
3217{
3218 if (bgp_static->rmap.name)
3219 free (bgp_static->rmap.name);
3220 XFREE (MTYPE_BGP_STATIC, bgp_static);
3221}
3222
paul94f2b392005-06-28 12:44:16 +00003223static void
paulfee0f4c2004-09-13 05:12:46 +00003224bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3225 struct prefix *p, afi_t afi, safi_t safi)
3226{
3227 struct bgp_node *rn;
3228 struct bgp_info *ri;
3229
3230 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3231
3232 /* Check selected route and self inserted route. */
3233 for (ri = rn->info; ri; ri = ri->next)
3234 if (ri->peer == bgp->peer_self
3235 && ri->type == ZEBRA_ROUTE_BGP
3236 && ri->sub_type == BGP_ROUTE_STATIC)
3237 break;
3238
3239 /* Withdraw static BGP route from routing table. */
3240 if (ri)
3241 {
paulfee0f4c2004-09-13 05:12:46 +00003242 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003243 bgp_process (bgp, rn, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003244 }
3245
3246 /* Unlock bgp_node_lookup. */
3247 bgp_unlock_node (rn);
3248}
3249
paul94f2b392005-06-28 12:44:16 +00003250static void
paulfee0f4c2004-09-13 05:12:46 +00003251bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
Paul Jakmafb982c22007-05-04 20:15:47 +00003252 struct bgp_static *bgp_static,
3253 afi_t afi, safi_t safi)
paulfee0f4c2004-09-13 05:12:46 +00003254{
3255 struct bgp_node *rn;
3256 struct bgp_info *ri;
3257 struct bgp_info *new;
3258 struct bgp_info info;
paulfee0f4c2004-09-13 05:12:46 +00003259 struct attr *attr_new;
Jorge Boncompte [DTI2]e16a4132012-05-07 16:52:57 +00003260 struct attr attr;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00003261 struct attr new_attr;
3262 struct attr_extra new_extra;
paulfee0f4c2004-09-13 05:12:46 +00003263 struct bgp *bgp;
3264 int ret;
3265 char buf[SU_ADDRSTRLEN];
3266
3267 bgp = rsclient->bgp;
3268
Paul Jakma06e110f2006-05-12 23:29:22 +00003269 assert (bgp_static);
3270 if (!bgp_static)
3271 return;
3272
paulfee0f4c2004-09-13 05:12:46 +00003273 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3274
3275 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakma06e110f2006-05-12 23:29:22 +00003276
3277 attr.nexthop = bgp_static->igpnexthop;
3278 attr.med = bgp_static->igpmetric;
3279 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
Paul Jakma41367172007-08-06 15:24:51 +00003280
Paul Jakma41367172007-08-06 15:24:51 +00003281 if (bgp_static->atomic)
3282 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3283
paulfee0f4c2004-09-13 05:12:46 +00003284 /* Apply network route-map for export to this rsclient. */
3285 if (bgp_static->rmap.name)
3286 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003287 struct attr attr_tmp = attr;
paulfee0f4c2004-09-13 05:12:46 +00003288 info.peer = rsclient;
Paul Jakmafb982c22007-05-04 20:15:47 +00003289 info.attr = &attr_tmp;
3290
paulfee0f4c2004-09-13 05:12:46 +00003291 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3292 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3293
3294 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3295
3296 rsclient->rmap_type = 0;
3297
3298 if (ret == RMAP_DENYMATCH)
3299 {
3300 /* Free uninterned attribute. */
Paul Jakmafb982c22007-05-04 20:15:47 +00003301 bgp_attr_flush (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003302
3303 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003304 aspath_unintern (&attr.aspath);
paulfee0f4c2004-09-13 05:12:46 +00003305 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00003306 bgp_attr_extra_free (&attr);
3307
paulfee0f4c2004-09-13 05:12:46 +00003308 return;
3309 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003310 attr_new = bgp_attr_intern (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003311 }
3312 else
3313 attr_new = bgp_attr_intern (&attr);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00003314
3315 new_attr.extra = &new_extra;
Stephen Hemminger7badc262010-08-05 10:26:31 -07003316 bgp_attr_dup(&new_attr, attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00003317
paulfee0f4c2004-09-13 05:12:46 +00003318 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3319
Paul Jakmafb982c22007-05-04 20:15:47 +00003320 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3321 == RMAP_DENY)
3322 {
paulfee0f4c2004-09-13 05:12:46 +00003323 /* This BGP update is filtered. Log the reason then update BGP entry. */
3324 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00003325 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00003326 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3327 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3328 p->prefixlen, rsclient->host);
3329
3330 bgp->peer_self->rmap_type = 0;
3331
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003332 bgp_attr_unintern (&attr_new);
3333 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003334 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003335
3336 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3337
3338 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003339 }
paulfee0f4c2004-09-13 05:12:46 +00003340
3341 bgp->peer_self->rmap_type = 0;
3342
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003343 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00003344 attr_new = bgp_attr_intern (&new_attr);
3345
3346 for (ri = rn->info; ri; ri = ri->next)
3347 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3348 && ri->sub_type == BGP_ROUTE_STATIC)
3349 break;
3350
3351 if (ri)
3352 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003353 if (attrhash_cmp (ri->attr, attr_new) &&
3354 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paulfee0f4c2004-09-13 05:12:46 +00003355 {
3356 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003357 bgp_attr_unintern (&attr_new);
3358 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003359 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003360 return;
3361 }
3362 else
3363 {
3364 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003365 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00003366
3367 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003368 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3369 bgp_info_restore(rn, ri);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003370 bgp_attr_unintern (&ri->attr);
paulfee0f4c2004-09-13 05:12:46 +00003371 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003372 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003373
3374 /* Process change. */
3375 bgp_process (bgp, rn, afi, safi);
3376 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003377 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003378 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003379 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003380 }
paulfee0f4c2004-09-13 05:12:46 +00003381 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003382
paulfee0f4c2004-09-13 05:12:46 +00003383 /* Make new BGP info. */
3384 new = bgp_info_new ();
3385 new->type = ZEBRA_ROUTE_BGP;
3386 new->sub_type = BGP_ROUTE_STATIC;
3387 new->peer = bgp->peer_self;
3388 SET_FLAG (new->flags, BGP_INFO_VALID);
3389 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003390 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003391
3392 /* Register new BGP information. */
3393 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003394
3395 /* route_node_get lock */
3396 bgp_unlock_node (rn);
3397
paulfee0f4c2004-09-13 05:12:46 +00003398 /* Process change. */
3399 bgp_process (bgp, rn, afi, safi);
3400
3401 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003402 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003403 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003404}
3405
paul94f2b392005-06-28 12:44:16 +00003406static void
paulfee0f4c2004-09-13 05:12:46 +00003407bgp_static_update_main (struct bgp *bgp, struct prefix *p,
paul718e3742002-12-13 20:15:29 +00003408 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3409{
3410 struct bgp_node *rn;
3411 struct bgp_info *ri;
3412 struct bgp_info *new;
3413 struct bgp_info info;
Jorge Boncompte [DTI2]e16a4132012-05-07 16:52:57 +00003414 struct attr attr;
paul718e3742002-12-13 20:15:29 +00003415 struct attr *attr_new;
3416 int ret;
3417
Paul Jakmadd8103a2006-05-12 23:27:30 +00003418 assert (bgp_static);
3419 if (!bgp_static)
3420 return;
3421
paulfee0f4c2004-09-13 05:12:46 +00003422 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003423
3424 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakmadd8103a2006-05-12 23:27:30 +00003425
3426 attr.nexthop = bgp_static->igpnexthop;
3427 attr.med = bgp_static->igpmetric;
3428 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
paul718e3742002-12-13 20:15:29 +00003429
Paul Jakma41367172007-08-06 15:24:51 +00003430 if (bgp_static->atomic)
3431 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3432
paul718e3742002-12-13 20:15:29 +00003433 /* Apply route-map. */
3434 if (bgp_static->rmap.name)
3435 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003436 struct attr attr_tmp = attr;
paul718e3742002-12-13 20:15:29 +00003437 info.peer = bgp->peer_self;
paul286e1e72003-08-08 00:24:31 +00003438 info.attr = &attr_tmp;
paul718e3742002-12-13 20:15:29 +00003439
paulfee0f4c2004-09-13 05:12:46 +00003440 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3441
paul718e3742002-12-13 20:15:29 +00003442 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
paul286e1e72003-08-08 00:24:31 +00003443
paulfee0f4c2004-09-13 05:12:46 +00003444 bgp->peer_self->rmap_type = 0;
3445
paul718e3742002-12-13 20:15:29 +00003446 if (ret == RMAP_DENYMATCH)
3447 {
3448 /* Free uninterned attribute. */
paul286e1e72003-08-08 00:24:31 +00003449 bgp_attr_flush (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003450
3451 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003452 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003453 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003454 bgp_static_withdraw (bgp, p, afi, safi);
3455 return;
3456 }
paul286e1e72003-08-08 00:24:31 +00003457 attr_new = bgp_attr_intern (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003458 }
paul286e1e72003-08-08 00:24:31 +00003459 else
3460 attr_new = bgp_attr_intern (&attr);
paul718e3742002-12-13 20:15:29 +00003461
3462 for (ri = rn->info; ri; ri = ri->next)
3463 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3464 && ri->sub_type == BGP_ROUTE_STATIC)
3465 break;
3466
3467 if (ri)
3468 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003469 if (attrhash_cmp (ri->attr, attr_new) &&
3470 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00003471 {
3472 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003473 bgp_attr_unintern (&attr_new);
3474 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003475 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003476 return;
3477 }
3478 else
3479 {
3480 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003481 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00003482
3483 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003484 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3485 bgp_info_restore(rn, ri);
3486 else
3487 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003488 bgp_attr_unintern (&ri->attr);
paul718e3742002-12-13 20:15:29 +00003489 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003490 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003491
3492 /* Process change. */
3493 bgp_aggregate_increment (bgp, p, ri, afi, safi);
3494 bgp_process (bgp, rn, afi, safi);
3495 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003496 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003497 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003498 return;
3499 }
3500 }
3501
3502 /* Make new BGP info. */
3503 new = bgp_info_new ();
3504 new->type = ZEBRA_ROUTE_BGP;
3505 new->sub_type = BGP_ROUTE_STATIC;
3506 new->peer = bgp->peer_self;
3507 SET_FLAG (new->flags, BGP_INFO_VALID);
3508 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003509 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003510
3511 /* Aggregate address increment. */
3512 bgp_aggregate_increment (bgp, p, new, afi, safi);
3513
3514 /* Register new BGP information. */
3515 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003516
3517 /* route_node_get lock */
3518 bgp_unlock_node (rn);
3519
paul718e3742002-12-13 20:15:29 +00003520 /* Process change. */
3521 bgp_process (bgp, rn, afi, safi);
3522
3523 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003524 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003525 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003526}
3527
3528void
paulfee0f4c2004-09-13 05:12:46 +00003529bgp_static_update (struct bgp *bgp, struct prefix *p,
3530 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3531{
3532 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00003533 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00003534
3535 bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3536
paul1eb8ef22005-04-07 07:30:20 +00003537 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00003538 {
Paul Jakmada5b30f2006-05-08 14:37:17 +00003539 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3540 bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003541 }
3542}
3543
paul94f2b392005-06-28 12:44:16 +00003544static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003545bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3546 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003547{
3548 struct bgp_node *rn;
3549 struct bgp_info *new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003550
paulfee0f4c2004-09-13 05:12:46 +00003551 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003552
3553 /* Make new BGP info. */
3554 new = bgp_info_new ();
3555 new->type = ZEBRA_ROUTE_BGP;
3556 new->sub_type = BGP_ROUTE_STATIC;
3557 new->peer = bgp->peer_self;
3558 new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3559 SET_FLAG (new->flags, BGP_INFO_VALID);
Stephen Hemminger65957882010-01-15 16:22:10 +03003560 new->uptime = bgp_clock ();
Paul Jakmafb982c22007-05-04 20:15:47 +00003561 new->extra = bgp_info_extra_new();
3562 memcpy (new->extra->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00003563
3564 /* Aggregate address increment. */
paul200df112005-06-01 11:17:05 +00003565 bgp_aggregate_increment (bgp, p, new, afi, safi);
paul718e3742002-12-13 20:15:29 +00003566
3567 /* Register new BGP information. */
paul200df112005-06-01 11:17:05 +00003568 bgp_info_add (rn, new);
paul718e3742002-12-13 20:15:29 +00003569
paul200df112005-06-01 11:17:05 +00003570 /* route_node_get lock */
3571 bgp_unlock_node (rn);
3572
paul718e3742002-12-13 20:15:29 +00003573 /* Process change. */
3574 bgp_process (bgp, rn, afi, safi);
3575}
3576
3577void
3578bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3579 safi_t safi)
3580{
3581 struct bgp_node *rn;
3582 struct bgp_info *ri;
3583
paulfee0f4c2004-09-13 05:12:46 +00003584 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003585
3586 /* Check selected route and self inserted route. */
3587 for (ri = rn->info; ri; ri = ri->next)
3588 if (ri->peer == bgp->peer_self
3589 && ri->type == ZEBRA_ROUTE_BGP
3590 && ri->sub_type == BGP_ROUTE_STATIC)
3591 break;
3592
3593 /* Withdraw static BGP route from routing table. */
3594 if (ri)
3595 {
3596 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003597 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003598 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003599 }
3600
3601 /* Unlock bgp_node_lookup. */
3602 bgp_unlock_node (rn);
3603}
3604
3605void
paulfee0f4c2004-09-13 05:12:46 +00003606bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3607{
3608 struct bgp_static *bgp_static;
3609 struct bgp *bgp;
3610 struct bgp_node *rn;
3611 struct prefix *p;
3612
3613 bgp = rsclient->bgp;
3614
3615 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3616 if ((bgp_static = rn->info) != NULL)
3617 {
3618 p = &rn->p;
3619
3620 bgp_static_update_rsclient (rsclient, p, bgp_static,
3621 afi, safi);
3622 }
3623}
3624
paul94f2b392005-06-28 12:44:16 +00003625static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003626bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3627 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003628{
3629 struct bgp_node *rn;
3630 struct bgp_info *ri;
3631
paulfee0f4c2004-09-13 05:12:46 +00003632 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003633
3634 /* Check selected route and self inserted route. */
3635 for (ri = rn->info; ri; ri = ri->next)
3636 if (ri->peer == bgp->peer_self
3637 && ri->type == ZEBRA_ROUTE_BGP
3638 && ri->sub_type == BGP_ROUTE_STATIC)
3639 break;
3640
3641 /* Withdraw static BGP route from routing table. */
3642 if (ri)
3643 {
3644 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003645 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003646 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003647 }
3648
3649 /* Unlock bgp_node_lookup. */
3650 bgp_unlock_node (rn);
3651}
3652
3653/* Configure static BGP network. When user don't run zebra, static
3654 route should be installed as valid. */
paul94f2b392005-06-28 12:44:16 +00003655static int
paulfd79ac92004-10-13 05:06:08 +00003656bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003657 afi_t afi, safi_t safi, const char *rmap, int backdoor)
paul718e3742002-12-13 20:15:29 +00003658{
3659 int ret;
3660 struct prefix p;
3661 struct bgp_static *bgp_static;
3662 struct bgp_node *rn;
Paul Jakma41367172007-08-06 15:24:51 +00003663 u_char need_update = 0;
paul718e3742002-12-13 20:15:29 +00003664
3665 /* Convert IP prefix string to struct prefix. */
3666 ret = str2prefix (ip_str, &p);
3667 if (! ret)
3668 {
3669 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3670 return CMD_WARNING;
3671 }
3672#ifdef HAVE_IPV6
3673 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3674 {
3675 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3676 VTY_NEWLINE);
3677 return CMD_WARNING;
3678 }
3679#endif /* HAVE_IPV6 */
3680
3681 apply_mask (&p);
3682
3683 /* Set BGP static route configuration. */
3684 rn = bgp_node_get (bgp->route[afi][safi], &p);
3685
3686 if (rn->info)
3687 {
3688 /* Configuration change. */
3689 bgp_static = rn->info;
3690
3691 /* Check previous routes are installed into BGP. */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003692 if (bgp_static->valid && bgp_static->backdoor != backdoor)
3693 need_update = 1;
Paul Jakma41367172007-08-06 15:24:51 +00003694
paul718e3742002-12-13 20:15:29 +00003695 bgp_static->backdoor = backdoor;
Paul Jakma41367172007-08-06 15:24:51 +00003696
paul718e3742002-12-13 20:15:29 +00003697 if (rmap)
3698 {
3699 if (bgp_static->rmap.name)
3700 free (bgp_static->rmap.name);
3701 bgp_static->rmap.name = strdup (rmap);
3702 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3703 }
3704 else
3705 {
3706 if (bgp_static->rmap.name)
3707 free (bgp_static->rmap.name);
3708 bgp_static->rmap.name = NULL;
3709 bgp_static->rmap.map = NULL;
3710 bgp_static->valid = 0;
3711 }
3712 bgp_unlock_node (rn);
3713 }
3714 else
3715 {
3716 /* New configuration. */
3717 bgp_static = bgp_static_new ();
3718 bgp_static->backdoor = backdoor;
3719 bgp_static->valid = 0;
3720 bgp_static->igpmetric = 0;
3721 bgp_static->igpnexthop.s_addr = 0;
Paul Jakma41367172007-08-06 15:24:51 +00003722
paul718e3742002-12-13 20:15:29 +00003723 if (rmap)
3724 {
3725 if (bgp_static->rmap.name)
3726 free (bgp_static->rmap.name);
3727 bgp_static->rmap.name = strdup (rmap);
3728 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3729 }
3730 rn->info = bgp_static;
3731 }
3732
3733 /* If BGP scan is not enabled, we should install this route here. */
3734 if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3735 {
3736 bgp_static->valid = 1;
3737
3738 if (need_update)
3739 bgp_static_withdraw (bgp, &p, afi, safi);
3740
3741 if (! bgp_static->backdoor)
3742 bgp_static_update (bgp, &p, bgp_static, afi, safi);
3743 }
3744
3745 return CMD_SUCCESS;
3746}
3747
3748/* Configure static BGP network. */
paul94f2b392005-06-28 12:44:16 +00003749static int
paulfd79ac92004-10-13 05:06:08 +00003750bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
Michael Lambert4c9641b2010-07-22 13:20:55 -04003751 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00003752{
3753 int ret;
3754 struct prefix p;
3755 struct bgp_static *bgp_static;
3756 struct bgp_node *rn;
3757
3758 /* Convert IP prefix string to struct prefix. */
3759 ret = str2prefix (ip_str, &p);
3760 if (! ret)
3761 {
3762 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3763 return CMD_WARNING;
3764 }
3765#ifdef HAVE_IPV6
3766 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3767 {
3768 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3769 VTY_NEWLINE);
3770 return CMD_WARNING;
3771 }
3772#endif /* HAVE_IPV6 */
3773
3774 apply_mask (&p);
3775
3776 rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3777 if (! rn)
3778 {
3779 vty_out (vty, "%% Can't find specified static route configuration.%s",
3780 VTY_NEWLINE);
3781 return CMD_WARNING;
3782 }
3783
3784 bgp_static = rn->info;
Paul Jakma41367172007-08-06 15:24:51 +00003785
paul718e3742002-12-13 20:15:29 +00003786 /* Update BGP RIB. */
3787 if (! bgp_static->backdoor)
3788 bgp_static_withdraw (bgp, &p, afi, safi);
3789
3790 /* Clear configuration. */
3791 bgp_static_free (bgp_static);
3792 rn->info = NULL;
3793 bgp_unlock_node (rn);
3794 bgp_unlock_node (rn);
3795
3796 return CMD_SUCCESS;
3797}
3798
3799/* Called from bgp_delete(). Delete all static routes from the BGP
3800 instance. */
3801void
3802bgp_static_delete (struct bgp *bgp)
3803{
3804 afi_t afi;
3805 safi_t safi;
3806 struct bgp_node *rn;
3807 struct bgp_node *rm;
3808 struct bgp_table *table;
3809 struct bgp_static *bgp_static;
3810
3811 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3812 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3813 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3814 if (rn->info != NULL)
3815 {
3816 if (safi == SAFI_MPLS_VPN)
3817 {
3818 table = rn->info;
3819
3820 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3821 {
3822 bgp_static = rn->info;
3823 bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3824 AFI_IP, SAFI_MPLS_VPN,
3825 (struct prefix_rd *)&rn->p,
3826 bgp_static->tag);
3827 bgp_static_free (bgp_static);
3828 rn->info = NULL;
3829 bgp_unlock_node (rn);
3830 }
3831 }
3832 else
3833 {
3834 bgp_static = rn->info;
3835 bgp_static_withdraw (bgp, &rn->p, afi, safi);
3836 bgp_static_free (bgp_static);
3837 rn->info = NULL;
3838 bgp_unlock_node (rn);
3839 }
3840 }
3841}
3842
3843int
paulfd79ac92004-10-13 05:06:08 +00003844bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3845 const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003846{
3847 int ret;
3848 struct prefix p;
3849 struct prefix_rd prd;
3850 struct bgp *bgp;
3851 struct bgp_node *prn;
3852 struct bgp_node *rn;
3853 struct bgp_table *table;
3854 struct bgp_static *bgp_static;
3855 u_char tag[3];
3856
3857 bgp = vty->index;
3858
3859 ret = str2prefix (ip_str, &p);
3860 if (! ret)
3861 {
3862 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3863 return CMD_WARNING;
3864 }
3865 apply_mask (&p);
3866
3867 ret = str2prefix_rd (rd_str, &prd);
3868 if (! ret)
3869 {
3870 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3871 return CMD_WARNING;
3872 }
3873
3874 ret = str2tag (tag_str, tag);
3875 if (! ret)
3876 {
3877 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3878 return CMD_WARNING;
3879 }
3880
3881 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3882 (struct prefix *)&prd);
3883 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003884 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003885 else
3886 bgp_unlock_node (prn);
3887 table = prn->info;
3888
3889 rn = bgp_node_get (table, &p);
3890
3891 if (rn->info)
3892 {
3893 vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3894 bgp_unlock_node (rn);
3895 }
3896 else
3897 {
3898 /* New configuration. */
3899 bgp_static = bgp_static_new ();
3900 bgp_static->valid = 1;
3901 memcpy (bgp_static->tag, tag, 3);
3902 rn->info = bgp_static;
3903
3904 bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3905 }
3906
3907 return CMD_SUCCESS;
3908}
3909
3910/* Configure static BGP network. */
3911int
paulfd79ac92004-10-13 05:06:08 +00003912bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3913 const char *rd_str, const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003914{
3915 int ret;
3916 struct bgp *bgp;
3917 struct prefix p;
3918 struct prefix_rd prd;
3919 struct bgp_node *prn;
3920 struct bgp_node *rn;
3921 struct bgp_table *table;
3922 struct bgp_static *bgp_static;
3923 u_char tag[3];
3924
3925 bgp = vty->index;
3926
3927 /* Convert IP prefix string to struct prefix. */
3928 ret = str2prefix (ip_str, &p);
3929 if (! ret)
3930 {
3931 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3932 return CMD_WARNING;
3933 }
3934 apply_mask (&p);
3935
3936 ret = str2prefix_rd (rd_str, &prd);
3937 if (! ret)
3938 {
3939 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3940 return CMD_WARNING;
3941 }
3942
3943 ret = str2tag (tag_str, tag);
3944 if (! ret)
3945 {
3946 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3947 return CMD_WARNING;
3948 }
3949
3950 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3951 (struct prefix *)&prd);
3952 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003953 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003954 else
3955 bgp_unlock_node (prn);
3956 table = prn->info;
3957
3958 rn = bgp_node_lookup (table, &p);
3959
3960 if (rn)
3961 {
3962 bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3963
3964 bgp_static = rn->info;
3965 bgp_static_free (bgp_static);
3966 rn->info = NULL;
3967 bgp_unlock_node (rn);
3968 bgp_unlock_node (rn);
3969 }
3970 else
3971 vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
3972
3973 return CMD_SUCCESS;
3974}
3975
3976DEFUN (bgp_network,
3977 bgp_network_cmd,
3978 "network A.B.C.D/M",
3979 "Specify a network to announce via BGP\n"
3980 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
3981{
3982 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003983 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00003984}
3985
3986DEFUN (bgp_network_route_map,
3987 bgp_network_route_map_cmd,
3988 "network A.B.C.D/M route-map WORD",
3989 "Specify a network to announce via BGP\n"
3990 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3991 "Route-map to modify the attributes\n"
3992 "Name of the route map\n")
3993{
3994 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003995 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00003996}
3997
3998DEFUN (bgp_network_backdoor,
3999 bgp_network_backdoor_cmd,
4000 "network A.B.C.D/M backdoor",
4001 "Specify a network to announce via BGP\n"
4002 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4003 "Specify a BGP backdoor route\n")
4004{
Paul Jakma41367172007-08-06 15:24:51 +00004005 return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004006 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004007}
4008
4009DEFUN (bgp_network_mask,
4010 bgp_network_mask_cmd,
4011 "network A.B.C.D mask A.B.C.D",
4012 "Specify a network to announce via BGP\n"
4013 "Network number\n"
4014 "Network mask\n"
4015 "Network mask\n")
4016{
4017 int ret;
4018 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004019
paul718e3742002-12-13 20:15:29 +00004020 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4021 if (! ret)
4022 {
4023 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4024 return CMD_WARNING;
4025 }
4026
4027 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004028 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00004029}
4030
4031DEFUN (bgp_network_mask_route_map,
4032 bgp_network_mask_route_map_cmd,
4033 "network A.B.C.D mask A.B.C.D route-map WORD",
4034 "Specify a network to announce via BGP\n"
4035 "Network number\n"
4036 "Network mask\n"
4037 "Network mask\n"
4038 "Route-map to modify the attributes\n"
4039 "Name of the route map\n")
4040{
4041 int ret;
4042 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004043
paul718e3742002-12-13 20:15:29 +00004044 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4045 if (! ret)
4046 {
4047 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4048 return CMD_WARNING;
4049 }
4050
4051 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004052 AFI_IP, bgp_node_safi (vty), argv[2], 0);
paul718e3742002-12-13 20:15:29 +00004053}
4054
4055DEFUN (bgp_network_mask_backdoor,
4056 bgp_network_mask_backdoor_cmd,
4057 "network A.B.C.D mask A.B.C.D backdoor",
4058 "Specify a network to announce via BGP\n"
4059 "Network number\n"
4060 "Network mask\n"
4061 "Network mask\n"
4062 "Specify a BGP backdoor route\n")
4063{
4064 int ret;
4065 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004066
paul718e3742002-12-13 20:15:29 +00004067 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4068 if (! ret)
4069 {
4070 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4071 return CMD_WARNING;
4072 }
4073
Paul Jakma41367172007-08-06 15:24:51 +00004074 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004075 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004076}
4077
4078DEFUN (bgp_network_mask_natural,
4079 bgp_network_mask_natural_cmd,
4080 "network A.B.C.D",
4081 "Specify a network to announce via BGP\n"
4082 "Network number\n")
4083{
4084 int ret;
4085 char prefix_str[BUFSIZ];
4086
4087 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4088 if (! ret)
4089 {
4090 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4091 return CMD_WARNING;
4092 }
4093
4094 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004095 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00004096}
4097
4098DEFUN (bgp_network_mask_natural_route_map,
4099 bgp_network_mask_natural_route_map_cmd,
4100 "network A.B.C.D route-map WORD",
4101 "Specify a network to announce via BGP\n"
4102 "Network number\n"
4103 "Route-map to modify the attributes\n"
4104 "Name of the route map\n")
4105{
4106 int ret;
4107 char prefix_str[BUFSIZ];
4108
4109 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4110 if (! ret)
4111 {
4112 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4113 return CMD_WARNING;
4114 }
4115
4116 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004117 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004118}
4119
4120DEFUN (bgp_network_mask_natural_backdoor,
4121 bgp_network_mask_natural_backdoor_cmd,
4122 "network A.B.C.D backdoor",
4123 "Specify a network to announce via BGP\n"
4124 "Network number\n"
4125 "Specify a BGP backdoor route\n")
4126{
4127 int ret;
4128 char prefix_str[BUFSIZ];
4129
4130 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4131 if (! ret)
4132 {
4133 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4134 return CMD_WARNING;
4135 }
4136
Paul Jakma41367172007-08-06 15:24:51 +00004137 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004138 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004139}
4140
4141DEFUN (no_bgp_network,
4142 no_bgp_network_cmd,
4143 "no network A.B.C.D/M",
4144 NO_STR
4145 "Specify a network to announce via BGP\n"
4146 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4147{
4148 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4149 bgp_node_safi (vty));
4150}
4151
4152ALIAS (no_bgp_network,
4153 no_bgp_network_route_map_cmd,
4154 "no network A.B.C.D/M route-map WORD",
4155 NO_STR
4156 "Specify a network to announce via BGP\n"
4157 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4158 "Route-map to modify the attributes\n"
4159 "Name of the route map\n")
4160
4161ALIAS (no_bgp_network,
4162 no_bgp_network_backdoor_cmd,
4163 "no network A.B.C.D/M backdoor",
4164 NO_STR
4165 "Specify a network to announce via BGP\n"
4166 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4167 "Specify a BGP backdoor route\n")
4168
4169DEFUN (no_bgp_network_mask,
4170 no_bgp_network_mask_cmd,
4171 "no network A.B.C.D mask A.B.C.D",
4172 NO_STR
4173 "Specify a network to announce via BGP\n"
4174 "Network number\n"
4175 "Network mask\n"
4176 "Network mask\n")
4177{
4178 int ret;
4179 char prefix_str[BUFSIZ];
4180
4181 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4182 if (! ret)
4183 {
4184 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4185 return CMD_WARNING;
4186 }
4187
4188 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4189 bgp_node_safi (vty));
4190}
4191
4192ALIAS (no_bgp_network_mask,
4193 no_bgp_network_mask_route_map_cmd,
4194 "no network A.B.C.D mask A.B.C.D route-map WORD",
4195 NO_STR
4196 "Specify a network to announce via BGP\n"
4197 "Network number\n"
4198 "Network mask\n"
4199 "Network mask\n"
4200 "Route-map to modify the attributes\n"
4201 "Name of the route map\n")
4202
4203ALIAS (no_bgp_network_mask,
4204 no_bgp_network_mask_backdoor_cmd,
4205 "no network A.B.C.D mask A.B.C.D backdoor",
4206 NO_STR
4207 "Specify a network to announce via BGP\n"
4208 "Network number\n"
4209 "Network mask\n"
4210 "Network mask\n"
4211 "Specify a BGP backdoor route\n")
4212
4213DEFUN (no_bgp_network_mask_natural,
4214 no_bgp_network_mask_natural_cmd,
4215 "no network A.B.C.D",
4216 NO_STR
4217 "Specify a network to announce via BGP\n"
4218 "Network number\n")
4219{
4220 int ret;
4221 char prefix_str[BUFSIZ];
4222
4223 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4224 if (! ret)
4225 {
4226 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4227 return CMD_WARNING;
4228 }
4229
4230 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4231 bgp_node_safi (vty));
4232}
4233
4234ALIAS (no_bgp_network_mask_natural,
4235 no_bgp_network_mask_natural_route_map_cmd,
4236 "no network A.B.C.D route-map WORD",
4237 NO_STR
4238 "Specify a network to announce via BGP\n"
4239 "Network number\n"
4240 "Route-map to modify the attributes\n"
4241 "Name of the route map\n")
4242
4243ALIAS (no_bgp_network_mask_natural,
4244 no_bgp_network_mask_natural_backdoor_cmd,
4245 "no network A.B.C.D backdoor",
4246 NO_STR
4247 "Specify a network to announce via BGP\n"
4248 "Network number\n"
4249 "Specify a BGP backdoor route\n")
4250
4251#ifdef HAVE_IPV6
4252DEFUN (ipv6_bgp_network,
4253 ipv6_bgp_network_cmd,
4254 "network X:X::X:X/M",
4255 "Specify a network to announce via BGP\n"
4256 "IPv6 prefix <network>/<length>\n")
4257{
G.Balaji73bfe0b2011-09-23 22:36:20 +05304258 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty),
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004259 NULL, 0);
paul718e3742002-12-13 20:15:29 +00004260}
4261
4262DEFUN (ipv6_bgp_network_route_map,
4263 ipv6_bgp_network_route_map_cmd,
4264 "network X:X::X:X/M route-map WORD",
4265 "Specify a network to announce via BGP\n"
4266 "IPv6 prefix <network>/<length>\n"
4267 "Route-map to modify the attributes\n"
4268 "Name of the route map\n")
4269{
4270 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004271 bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004272}
4273
4274DEFUN (no_ipv6_bgp_network,
4275 no_ipv6_bgp_network_cmd,
4276 "no network X:X::X:X/M",
4277 NO_STR
4278 "Specify a network to announce via BGP\n"
4279 "IPv6 prefix <network>/<length>\n")
4280{
G.Balaji73bfe0b2011-09-23 22:36:20 +05304281 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty));
paul718e3742002-12-13 20:15:29 +00004282}
4283
4284ALIAS (no_ipv6_bgp_network,
4285 no_ipv6_bgp_network_route_map_cmd,
4286 "no network X:X::X:X/M route-map WORD",
4287 NO_STR
4288 "Specify a network to announce via BGP\n"
4289 "IPv6 prefix <network>/<length>\n"
4290 "Route-map to modify the attributes\n"
4291 "Name of the route map\n")
4292
4293ALIAS (ipv6_bgp_network,
4294 old_ipv6_bgp_network_cmd,
4295 "ipv6 bgp network X:X::X:X/M",
4296 IPV6_STR
4297 BGP_STR
4298 "Specify a network to announce via BGP\n"
4299 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4300
4301ALIAS (no_ipv6_bgp_network,
4302 old_no_ipv6_bgp_network_cmd,
4303 "no ipv6 bgp network X:X::X:X/M",
4304 NO_STR
4305 IPV6_STR
4306 BGP_STR
4307 "Specify a network to announce via BGP\n"
4308 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4309#endif /* HAVE_IPV6 */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004310
4311/* stubs for removed AS-Pathlimit commands, kept for config compatibility */
4312ALIAS_DEPRECATED (bgp_network,
4313 bgp_network_ttl_cmd,
4314 "network A.B.C.D/M pathlimit <0-255>",
4315 "Specify a network to announce via BGP\n"
4316 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4317 "AS-Path hopcount limit attribute\n"
4318 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4319ALIAS_DEPRECATED (bgp_network_backdoor,
4320 bgp_network_backdoor_ttl_cmd,
4321 "network A.B.C.D/M backdoor pathlimit <0-255>",
4322 "Specify a network to announce via BGP\n"
4323 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4324 "Specify a BGP backdoor route\n"
4325 "AS-Path hopcount limit attribute\n"
4326 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4327ALIAS_DEPRECATED (bgp_network_mask,
4328 bgp_network_mask_ttl_cmd,
4329 "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4330 "Specify a network to announce via BGP\n"
4331 "Network number\n"
4332 "Network mask\n"
4333 "Network mask\n"
4334 "AS-Path hopcount limit attribute\n"
4335 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4336ALIAS_DEPRECATED (bgp_network_mask_backdoor,
4337 bgp_network_mask_backdoor_ttl_cmd,
4338 "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4339 "Specify a network to announce via BGP\n"
4340 "Network number\n"
4341 "Network mask\n"
4342 "Network mask\n"
4343 "Specify a BGP backdoor route\n"
4344 "AS-Path hopcount limit attribute\n"
4345 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4346ALIAS_DEPRECATED (bgp_network_mask_natural,
4347 bgp_network_mask_natural_ttl_cmd,
4348 "network A.B.C.D pathlimit <0-255>",
4349 "Specify a network to announce via BGP\n"
4350 "Network number\n"
4351 "AS-Path hopcount limit attribute\n"
4352 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4353ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
4354 bgp_network_mask_natural_backdoor_ttl_cmd,
4355 "network A.B.C.D backdoor pathlimit (1-255>",
4356 "Specify a network to announce via BGP\n"
4357 "Network number\n"
4358 "Specify a BGP backdoor route\n"
4359 "AS-Path hopcount limit attribute\n"
4360 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4361ALIAS_DEPRECATED (no_bgp_network,
4362 no_bgp_network_ttl_cmd,
4363 "no network A.B.C.D/M pathlimit <0-255>",
4364 NO_STR
4365 "Specify a network to announce via BGP\n"
4366 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4367 "AS-Path hopcount limit attribute\n"
4368 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4369ALIAS_DEPRECATED (no_bgp_network,
4370 no_bgp_network_backdoor_ttl_cmd,
4371 "no network A.B.C.D/M backdoor pathlimit <0-255>",
4372 NO_STR
4373 "Specify a network to announce via BGP\n"
4374 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4375 "Specify a BGP backdoor route\n"
4376 "AS-Path hopcount limit attribute\n"
4377 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4378ALIAS_DEPRECATED (no_bgp_network,
4379 no_bgp_network_mask_ttl_cmd,
4380 "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4381 NO_STR
4382 "Specify a network to announce via BGP\n"
4383 "Network number\n"
4384 "Network mask\n"
4385 "Network mask\n"
4386 "AS-Path hopcount limit attribute\n"
4387 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4388ALIAS_DEPRECATED (no_bgp_network_mask,
4389 no_bgp_network_mask_backdoor_ttl_cmd,
4390 "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4391 NO_STR
4392 "Specify a network to announce via BGP\n"
4393 "Network number\n"
4394 "Network mask\n"
4395 "Network mask\n"
4396 "Specify a BGP backdoor route\n"
4397 "AS-Path hopcount limit attribute\n"
4398 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4399ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4400 no_bgp_network_mask_natural_ttl_cmd,
4401 "no network A.B.C.D pathlimit <0-255>",
4402 NO_STR
4403 "Specify a network to announce via BGP\n"
4404 "Network number\n"
4405 "AS-Path hopcount limit attribute\n"
4406 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4407ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4408 no_bgp_network_mask_natural_backdoor_ttl_cmd,
4409 "no network A.B.C.D backdoor pathlimit <0-255>",
4410 NO_STR
4411 "Specify a network to announce via BGP\n"
4412 "Network number\n"
4413 "Specify a BGP backdoor route\n"
4414 "AS-Path hopcount limit attribute\n"
4415 "AS-Pathlimit TTL, in number of AS-Path hops\n")
Paul Jakma3bde17f2011-03-23 10:30:30 +00004416#ifdef HAVE_IPV6
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004417ALIAS_DEPRECATED (ipv6_bgp_network,
4418 ipv6_bgp_network_ttl_cmd,
4419 "network X:X::X:X/M pathlimit <0-255>",
4420 "Specify a network to announce via BGP\n"
4421 "IPv6 prefix <network>/<length>\n"
4422 "AS-Path hopcount limit attribute\n"
4423 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4424ALIAS_DEPRECATED (no_ipv6_bgp_network,
4425 no_ipv6_bgp_network_ttl_cmd,
4426 "no network X:X::X:X/M pathlimit <0-255>",
4427 NO_STR
4428 "Specify a network to announce via BGP\n"
4429 "IPv6 prefix <network>/<length>\n"
4430 "AS-Path hopcount limit attribute\n"
4431 "AS-Pathlimit TTL, in number of AS-Path hops\n")
Paul Jakma3bde17f2011-03-23 10:30:30 +00004432#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00004433
4434/* Aggreagete address:
4435
4436 advertise-map Set condition to advertise attribute
4437 as-set Generate AS set path information
4438 attribute-map Set attributes of aggregate
4439 route-map Set parameters of aggregate
4440 summary-only Filter more specific routes from updates
4441 suppress-map Conditionally filter more specific routes from updates
4442 <cr>
4443 */
4444struct bgp_aggregate
4445{
4446 /* Summary-only flag. */
4447 u_char summary_only;
4448
4449 /* AS set generation. */
4450 u_char as_set;
4451
4452 /* Route-map for aggregated route. */
4453 struct route_map *map;
4454
4455 /* Suppress-count. */
4456 unsigned long count;
4457
4458 /* SAFI configuration. */
4459 safi_t safi;
4460};
4461
paul94f2b392005-06-28 12:44:16 +00004462static struct bgp_aggregate *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08004463bgp_aggregate_new (void)
paul718e3742002-12-13 20:15:29 +00004464{
Stephen Hemminger393deb92008-08-18 14:13:29 -07004465 return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
paul718e3742002-12-13 20:15:29 +00004466}
4467
paul94f2b392005-06-28 12:44:16 +00004468static void
paul718e3742002-12-13 20:15:29 +00004469bgp_aggregate_free (struct bgp_aggregate *aggregate)
4470{
4471 XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4472}
4473
paul94f2b392005-06-28 12:44:16 +00004474static void
paul718e3742002-12-13 20:15:29 +00004475bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4476 afi_t afi, safi_t safi, struct bgp_info *del,
4477 struct bgp_aggregate *aggregate)
4478{
4479 struct bgp_table *table;
4480 struct bgp_node *top;
4481 struct bgp_node *rn;
4482 u_char origin;
4483 struct aspath *aspath = NULL;
4484 struct aspath *asmerge = NULL;
4485 struct community *community = NULL;
4486 struct community *commerge = NULL;
4487 struct in_addr nexthop;
4488 u_int32_t med = 0;
4489 struct bgp_info *ri;
4490 struct bgp_info *new;
4491 int first = 1;
4492 unsigned long match = 0;
4493
4494 /* Record adding route's nexthop and med. */
4495 if (rinew)
4496 {
4497 nexthop = rinew->attr->nexthop;
4498 med = rinew->attr->med;
4499 }
4500
4501 /* ORIGIN attribute: If at least one route among routes that are
4502 aggregated has ORIGIN with the value INCOMPLETE, then the
4503 aggregated route must have the ORIGIN attribute with the value
4504 INCOMPLETE. Otherwise, if at least one route among routes that
4505 are aggregated has ORIGIN with the value EGP, then the aggregated
4506 route must have the origin attribute with the value EGP. In all
4507 other case the value of the ORIGIN attribute of the aggregated
4508 route is INTERNAL. */
4509 origin = BGP_ORIGIN_IGP;
4510
4511 table = bgp->rib[afi][safi];
4512
4513 top = bgp_node_get (table, p);
4514 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4515 if (rn->p.prefixlen > p->prefixlen)
4516 {
4517 match = 0;
4518
4519 for (ri = rn->info; ri; ri = ri->next)
4520 {
4521 if (BGP_INFO_HOLDDOWN (ri))
4522 continue;
4523
4524 if (del && ri == del)
4525 continue;
4526
4527 if (! rinew && first)
4528 {
4529 nexthop = ri->attr->nexthop;
4530 med = ri->attr->med;
4531 first = 0;
4532 }
4533
4534#ifdef AGGREGATE_NEXTHOP_CHECK
4535 if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4536 || ri->attr->med != med)
4537 {
4538 if (aspath)
4539 aspath_free (aspath);
4540 if (community)
4541 community_free (community);
4542 bgp_unlock_node (rn);
4543 bgp_unlock_node (top);
4544 return;
4545 }
4546#endif /* AGGREGATE_NEXTHOP_CHECK */
4547
4548 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4549 {
4550 if (aggregate->summary_only)
4551 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004552 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004553 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004554 match++;
4555 }
4556
4557 aggregate->count++;
4558
4559 if (aggregate->as_set)
4560 {
4561 if (origin < ri->attr->origin)
4562 origin = ri->attr->origin;
4563
4564 if (aspath)
4565 {
4566 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4567 aspath_free (aspath);
4568 aspath = asmerge;
4569 }
4570 else
4571 aspath = aspath_dup (ri->attr->aspath);
4572
4573 if (ri->attr->community)
4574 {
4575 if (community)
4576 {
4577 commerge = community_merge (community,
4578 ri->attr->community);
4579 community = community_uniq_sort (commerge);
4580 community_free (commerge);
4581 }
4582 else
4583 community = community_dup (ri->attr->community);
4584 }
4585 }
4586 }
4587 }
4588 if (match)
4589 bgp_process (bgp, rn, afi, safi);
4590 }
4591 bgp_unlock_node (top);
4592
4593 if (rinew)
4594 {
4595 aggregate->count++;
4596
4597 if (aggregate->summary_only)
Paul Jakmafb982c22007-05-04 20:15:47 +00004598 (bgp_info_extra_get (rinew))->suppress++;
paul718e3742002-12-13 20:15:29 +00004599
4600 if (aggregate->as_set)
4601 {
4602 if (origin < rinew->attr->origin)
4603 origin = rinew->attr->origin;
4604
4605 if (aspath)
4606 {
4607 asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4608 aspath_free (aspath);
4609 aspath = asmerge;
4610 }
4611 else
4612 aspath = aspath_dup (rinew->attr->aspath);
4613
4614 if (rinew->attr->community)
4615 {
4616 if (community)
4617 {
4618 commerge = community_merge (community,
4619 rinew->attr->community);
4620 community = community_uniq_sort (commerge);
4621 community_free (commerge);
4622 }
4623 else
4624 community = community_dup (rinew->attr->community);
4625 }
4626 }
4627 }
4628
4629 if (aggregate->count > 0)
4630 {
4631 rn = bgp_node_get (table, p);
4632 new = bgp_info_new ();
4633 new->type = ZEBRA_ROUTE_BGP;
4634 new->sub_type = BGP_ROUTE_AGGREGATE;
4635 new->peer = bgp->peer_self;
4636 SET_FLAG (new->flags, BGP_INFO_VALID);
4637 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004638 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004639
4640 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004641 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00004642 bgp_process (bgp, rn, afi, safi);
4643 }
4644 else
4645 {
4646 if (aspath)
4647 aspath_free (aspath);
4648 if (community)
4649 community_free (community);
4650 }
4651}
4652
4653void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4654 struct bgp_aggregate *);
4655
4656void
4657bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4658 struct bgp_info *ri, afi_t afi, safi_t safi)
4659{
4660 struct bgp_node *child;
4661 struct bgp_node *rn;
4662 struct bgp_aggregate *aggregate;
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004663 struct bgp_table *table;
paul718e3742002-12-13 20:15:29 +00004664
4665 /* MPLS-VPN aggregation is not yet supported. */
4666 if (safi == SAFI_MPLS_VPN)
4667 return;
4668
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004669 table = bgp->aggregate[afi][safi];
4670
4671 /* No aggregates configured. */
4672 if (table->top == NULL)
4673 return;
4674
paul718e3742002-12-13 20:15:29 +00004675 if (p->prefixlen == 0)
4676 return;
4677
4678 if (BGP_INFO_HOLDDOWN (ri))
4679 return;
4680
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004681 child = bgp_node_lookup (table, p);
4682 if (! child)
4683 return;
paul718e3742002-12-13 20:15:29 +00004684
4685 /* Aggregate address configuration check. */
4686 for (rn = child; rn; rn = rn->parent)
4687 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4688 {
4689 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004690 bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
paul718e3742002-12-13 20:15:29 +00004691 }
4692 bgp_unlock_node (child);
4693}
4694
4695void
4696bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4697 struct bgp_info *del, afi_t afi, safi_t safi)
4698{
4699 struct bgp_node *child;
4700 struct bgp_node *rn;
4701 struct bgp_aggregate *aggregate;
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004702 struct bgp_table *table;
paul718e3742002-12-13 20:15:29 +00004703
4704 /* MPLS-VPN aggregation is not yet supported. */
4705 if (safi == SAFI_MPLS_VPN)
4706 return;
4707
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004708 table = bgp->aggregate[afi][safi];
4709
4710 /* No aggregates configured. */
4711 if (table->top == NULL)
4712 return;
4713
paul718e3742002-12-13 20:15:29 +00004714 if (p->prefixlen == 0)
4715 return;
4716
Jorge Boncompte [DTI2]f018db82012-05-07 16:53:10 +00004717 child = bgp_node_lookup (table, p);
4718 if (! child)
4719 return;
paul718e3742002-12-13 20:15:29 +00004720
4721 /* Aggregate address configuration check. */
4722 for (rn = child; rn; rn = rn->parent)
4723 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4724 {
4725 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004726 bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
paul718e3742002-12-13 20:15:29 +00004727 }
4728 bgp_unlock_node (child);
4729}
4730
paul94f2b392005-06-28 12:44:16 +00004731static void
paul718e3742002-12-13 20:15:29 +00004732bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4733 struct bgp_aggregate *aggregate)
4734{
4735 struct bgp_table *table;
4736 struct bgp_node *top;
4737 struct bgp_node *rn;
4738 struct bgp_info *new;
4739 struct bgp_info *ri;
4740 unsigned long match;
4741 u_char origin = BGP_ORIGIN_IGP;
4742 struct aspath *aspath = NULL;
4743 struct aspath *asmerge = NULL;
4744 struct community *community = NULL;
4745 struct community *commerge = NULL;
4746
4747 table = bgp->rib[afi][safi];
4748
4749 /* Sanity check. */
4750 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4751 return;
4752 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4753 return;
4754
4755 /* If routes exists below this node, generate aggregate routes. */
4756 top = bgp_node_get (table, p);
4757 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4758 if (rn->p.prefixlen > p->prefixlen)
4759 {
4760 match = 0;
4761
4762 for (ri = rn->info; ri; ri = ri->next)
4763 {
4764 if (BGP_INFO_HOLDDOWN (ri))
4765 continue;
4766
4767 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4768 {
4769 /* summary-only aggregate route suppress aggregated
4770 route announcement. */
4771 if (aggregate->summary_only)
4772 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004773 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004774 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004775 match++;
4776 }
4777 /* as-set aggregate route generate origin, as path,
4778 community aggregation. */
4779 if (aggregate->as_set)
4780 {
4781 if (origin < ri->attr->origin)
4782 origin = ri->attr->origin;
4783
4784 if (aspath)
4785 {
4786 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4787 aspath_free (aspath);
4788 aspath = asmerge;
4789 }
4790 else
4791 aspath = aspath_dup (ri->attr->aspath);
4792
4793 if (ri->attr->community)
4794 {
4795 if (community)
4796 {
4797 commerge = community_merge (community,
4798 ri->attr->community);
4799 community = community_uniq_sort (commerge);
4800 community_free (commerge);
4801 }
4802 else
4803 community = community_dup (ri->attr->community);
4804 }
4805 }
4806 aggregate->count++;
4807 }
4808 }
4809
4810 /* If this node is suppressed, process the change. */
4811 if (match)
4812 bgp_process (bgp, rn, afi, safi);
4813 }
4814 bgp_unlock_node (top);
4815
4816 /* Add aggregate route to BGP table. */
4817 if (aggregate->count)
4818 {
4819 rn = bgp_node_get (table, p);
4820
4821 new = bgp_info_new ();
4822 new->type = ZEBRA_ROUTE_BGP;
4823 new->sub_type = BGP_ROUTE_AGGREGATE;
4824 new->peer = bgp->peer_self;
4825 SET_FLAG (new->flags, BGP_INFO_VALID);
4826 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004827 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004828
4829 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004830 bgp_unlock_node (rn);
4831
paul718e3742002-12-13 20:15:29 +00004832 /* Process change. */
4833 bgp_process (bgp, rn, afi, safi);
4834 }
4835}
4836
4837void
4838bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4839 safi_t safi, struct bgp_aggregate *aggregate)
4840{
4841 struct bgp_table *table;
4842 struct bgp_node *top;
4843 struct bgp_node *rn;
4844 struct bgp_info *ri;
4845 unsigned long match;
4846
4847 table = bgp->rib[afi][safi];
4848
4849 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4850 return;
4851 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4852 return;
4853
4854 /* If routes exists below this node, generate aggregate routes. */
4855 top = bgp_node_get (table, p);
4856 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4857 if (rn->p.prefixlen > p->prefixlen)
4858 {
4859 match = 0;
4860
4861 for (ri = rn->info; ri; ri = ri->next)
4862 {
4863 if (BGP_INFO_HOLDDOWN (ri))
4864 continue;
4865
4866 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4867 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004868 if (aggregate->summary_only && ri->extra)
paul718e3742002-12-13 20:15:29 +00004869 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004870 ri->extra->suppress--;
paul718e3742002-12-13 20:15:29 +00004871
Paul Jakmafb982c22007-05-04 20:15:47 +00004872 if (ri->extra->suppress == 0)
paul718e3742002-12-13 20:15:29 +00004873 {
Paul Jakma1a392d42006-09-07 00:24:49 +00004874 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004875 match++;
4876 }
4877 }
4878 aggregate->count--;
4879 }
4880 }
4881
Paul Jakmafb982c22007-05-04 20:15:47 +00004882 /* If this node was suppressed, process the change. */
paul718e3742002-12-13 20:15:29 +00004883 if (match)
4884 bgp_process (bgp, rn, afi, safi);
4885 }
4886 bgp_unlock_node (top);
4887
4888 /* Delete aggregate route from BGP table. */
4889 rn = bgp_node_get (table, p);
4890
4891 for (ri = rn->info; ri; ri = ri->next)
4892 if (ri->peer == bgp->peer_self
4893 && ri->type == ZEBRA_ROUTE_BGP
4894 && ri->sub_type == BGP_ROUTE_AGGREGATE)
4895 break;
4896
4897 /* Withdraw static BGP route from routing table. */
4898 if (ri)
4899 {
paul718e3742002-12-13 20:15:29 +00004900 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00004901 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00004902 }
4903
4904 /* Unlock bgp_node_lookup. */
4905 bgp_unlock_node (rn);
4906}
4907
4908/* Aggregate route attribute. */
4909#define AGGREGATE_SUMMARY_ONLY 1
4910#define AGGREGATE_AS_SET 1
4911
paul94f2b392005-06-28 12:44:16 +00004912static int
Robert Baysf6269b42010-08-05 10:26:28 -07004913bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4914 afi_t afi, safi_t safi)
4915{
4916 int ret;
4917 struct prefix p;
4918 struct bgp_node *rn;
4919 struct bgp *bgp;
4920 struct bgp_aggregate *aggregate;
4921
4922 /* Convert string to prefix structure. */
4923 ret = str2prefix (prefix_str, &p);
4924 if (!ret)
4925 {
4926 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4927 return CMD_WARNING;
4928 }
4929 apply_mask (&p);
4930
4931 /* Get BGP structure. */
4932 bgp = vty->index;
4933
4934 /* Old configuration check. */
4935 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
4936 if (! rn)
4937 {
4938 vty_out (vty, "%% There is no aggregate-address configuration.%s",
4939 VTY_NEWLINE);
4940 return CMD_WARNING;
4941 }
4942
4943 aggregate = rn->info;
4944 if (aggregate->safi & SAFI_UNICAST)
4945 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
4946 if (aggregate->safi & SAFI_MULTICAST)
4947 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4948
4949 /* Unlock aggregate address configuration. */
4950 rn->info = NULL;
4951 bgp_aggregate_free (aggregate);
4952 bgp_unlock_node (rn);
4953 bgp_unlock_node (rn);
4954
4955 return CMD_SUCCESS;
4956}
4957
4958static int
4959bgp_aggregate_set (struct vty *vty, const char *prefix_str,
paulfd79ac92004-10-13 05:06:08 +00004960 afi_t afi, safi_t safi,
paul718e3742002-12-13 20:15:29 +00004961 u_char summary_only, u_char as_set)
4962{
4963 int ret;
4964 struct prefix p;
4965 struct bgp_node *rn;
4966 struct bgp *bgp;
4967 struct bgp_aggregate *aggregate;
4968
4969 /* Convert string to prefix structure. */
4970 ret = str2prefix (prefix_str, &p);
4971 if (!ret)
4972 {
4973 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4974 return CMD_WARNING;
4975 }
4976 apply_mask (&p);
4977
4978 /* Get BGP structure. */
4979 bgp = vty->index;
4980
4981 /* Old configuration check. */
4982 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4983
4984 if (rn->info)
4985 {
4986 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
Robert Bays368473f2010-08-05 10:26:29 -07004987 /* try to remove the old entry */
Robert Baysf6269b42010-08-05 10:26:28 -07004988 ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
4989 if (ret)
4990 {
Robert Bays368473f2010-08-05 10:26:29 -07004991 vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
4992 bgp_unlock_node (rn);
Robert Baysf6269b42010-08-05 10:26:28 -07004993 return CMD_WARNING;
4994 }
paul718e3742002-12-13 20:15:29 +00004995 }
4996
4997 /* Make aggregate address structure. */
4998 aggregate = bgp_aggregate_new ();
4999 aggregate->summary_only = summary_only;
5000 aggregate->as_set = as_set;
5001 aggregate->safi = safi;
5002 rn->info = aggregate;
5003
5004 /* Aggregate address insert into BGP routing table. */
5005 if (safi & SAFI_UNICAST)
5006 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
5007 if (safi & SAFI_MULTICAST)
5008 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5009
5010 return CMD_SUCCESS;
5011}
5012
paul718e3742002-12-13 20:15:29 +00005013DEFUN (aggregate_address,
5014 aggregate_address_cmd,
5015 "aggregate-address A.B.C.D/M",
5016 "Configure BGP aggregate entries\n"
5017 "Aggregate prefix\n")
5018{
5019 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
5020}
5021
5022DEFUN (aggregate_address_mask,
5023 aggregate_address_mask_cmd,
5024 "aggregate-address A.B.C.D A.B.C.D",
5025 "Configure BGP aggregate entries\n"
5026 "Aggregate address\n"
5027 "Aggregate mask\n")
5028{
5029 int ret;
5030 char prefix_str[BUFSIZ];
5031
5032 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5033
5034 if (! ret)
5035 {
5036 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5037 return CMD_WARNING;
5038 }
5039
5040 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5041 0, 0);
5042}
5043
5044DEFUN (aggregate_address_summary_only,
5045 aggregate_address_summary_only_cmd,
5046 "aggregate-address A.B.C.D/M summary-only",
5047 "Configure BGP aggregate entries\n"
5048 "Aggregate prefix\n"
5049 "Filter more specific routes from updates\n")
5050{
5051 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5052 AGGREGATE_SUMMARY_ONLY, 0);
5053}
5054
5055DEFUN (aggregate_address_mask_summary_only,
5056 aggregate_address_mask_summary_only_cmd,
5057 "aggregate-address A.B.C.D A.B.C.D summary-only",
5058 "Configure BGP aggregate entries\n"
5059 "Aggregate address\n"
5060 "Aggregate mask\n"
5061 "Filter more specific routes from updates\n")
5062{
5063 int ret;
5064 char prefix_str[BUFSIZ];
5065
5066 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5067
5068 if (! ret)
5069 {
5070 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5071 return CMD_WARNING;
5072 }
5073
5074 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5075 AGGREGATE_SUMMARY_ONLY, 0);
5076}
5077
5078DEFUN (aggregate_address_as_set,
5079 aggregate_address_as_set_cmd,
5080 "aggregate-address A.B.C.D/M as-set",
5081 "Configure BGP aggregate entries\n"
5082 "Aggregate prefix\n"
5083 "Generate AS set path information\n")
5084{
5085 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5086 0, AGGREGATE_AS_SET);
5087}
5088
5089DEFUN (aggregate_address_mask_as_set,
5090 aggregate_address_mask_as_set_cmd,
5091 "aggregate-address A.B.C.D A.B.C.D as-set",
5092 "Configure BGP aggregate entries\n"
5093 "Aggregate address\n"
5094 "Aggregate mask\n"
5095 "Generate AS set path information\n")
5096{
5097 int ret;
5098 char prefix_str[BUFSIZ];
5099
5100 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5101
5102 if (! ret)
5103 {
5104 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5105 return CMD_WARNING;
5106 }
5107
5108 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5109 0, AGGREGATE_AS_SET);
5110}
5111
5112
5113DEFUN (aggregate_address_as_set_summary,
5114 aggregate_address_as_set_summary_cmd,
5115 "aggregate-address A.B.C.D/M as-set summary-only",
5116 "Configure BGP aggregate entries\n"
5117 "Aggregate prefix\n"
5118 "Generate AS set path information\n"
5119 "Filter more specific routes from updates\n")
5120{
5121 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5122 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5123}
5124
5125ALIAS (aggregate_address_as_set_summary,
5126 aggregate_address_summary_as_set_cmd,
5127 "aggregate-address A.B.C.D/M summary-only as-set",
5128 "Configure BGP aggregate entries\n"
5129 "Aggregate prefix\n"
5130 "Filter more specific routes from updates\n"
5131 "Generate AS set path information\n")
5132
5133DEFUN (aggregate_address_mask_as_set_summary,
5134 aggregate_address_mask_as_set_summary_cmd,
5135 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5136 "Configure BGP aggregate entries\n"
5137 "Aggregate address\n"
5138 "Aggregate mask\n"
5139 "Generate AS set path information\n"
5140 "Filter more specific routes from updates\n")
5141{
5142 int ret;
5143 char prefix_str[BUFSIZ];
5144
5145 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5146
5147 if (! ret)
5148 {
5149 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5150 return CMD_WARNING;
5151 }
5152
5153 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5154 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5155}
5156
5157ALIAS (aggregate_address_mask_as_set_summary,
5158 aggregate_address_mask_summary_as_set_cmd,
5159 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5160 "Configure BGP aggregate entries\n"
5161 "Aggregate address\n"
5162 "Aggregate mask\n"
5163 "Filter more specific routes from updates\n"
5164 "Generate AS set path information\n")
5165
5166DEFUN (no_aggregate_address,
5167 no_aggregate_address_cmd,
5168 "no aggregate-address A.B.C.D/M",
5169 NO_STR
5170 "Configure BGP aggregate entries\n"
5171 "Aggregate prefix\n")
5172{
5173 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5174}
5175
5176ALIAS (no_aggregate_address,
5177 no_aggregate_address_summary_only_cmd,
5178 "no aggregate-address A.B.C.D/M summary-only",
5179 NO_STR
5180 "Configure BGP aggregate entries\n"
5181 "Aggregate prefix\n"
5182 "Filter more specific routes from updates\n")
5183
5184ALIAS (no_aggregate_address,
5185 no_aggregate_address_as_set_cmd,
5186 "no aggregate-address A.B.C.D/M as-set",
5187 NO_STR
5188 "Configure BGP aggregate entries\n"
5189 "Aggregate prefix\n"
5190 "Generate AS set path information\n")
5191
5192ALIAS (no_aggregate_address,
5193 no_aggregate_address_as_set_summary_cmd,
5194 "no aggregate-address A.B.C.D/M as-set summary-only",
5195 NO_STR
5196 "Configure BGP aggregate entries\n"
5197 "Aggregate prefix\n"
5198 "Generate AS set path information\n"
5199 "Filter more specific routes from updates\n")
5200
5201ALIAS (no_aggregate_address,
5202 no_aggregate_address_summary_as_set_cmd,
5203 "no aggregate-address A.B.C.D/M summary-only as-set",
5204 NO_STR
5205 "Configure BGP aggregate entries\n"
5206 "Aggregate prefix\n"
5207 "Filter more specific routes from updates\n"
5208 "Generate AS set path information\n")
5209
5210DEFUN (no_aggregate_address_mask,
5211 no_aggregate_address_mask_cmd,
5212 "no aggregate-address A.B.C.D A.B.C.D",
5213 NO_STR
5214 "Configure BGP aggregate entries\n"
5215 "Aggregate address\n"
5216 "Aggregate mask\n")
5217{
5218 int ret;
5219 char prefix_str[BUFSIZ];
5220
5221 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5222
5223 if (! ret)
5224 {
5225 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5226 return CMD_WARNING;
5227 }
5228
5229 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5230}
5231
5232ALIAS (no_aggregate_address_mask,
5233 no_aggregate_address_mask_summary_only_cmd,
5234 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5235 NO_STR
5236 "Configure BGP aggregate entries\n"
5237 "Aggregate address\n"
5238 "Aggregate mask\n"
5239 "Filter more specific routes from updates\n")
5240
5241ALIAS (no_aggregate_address_mask,
5242 no_aggregate_address_mask_as_set_cmd,
5243 "no aggregate-address A.B.C.D A.B.C.D as-set",
5244 NO_STR
5245 "Configure BGP aggregate entries\n"
5246 "Aggregate address\n"
5247 "Aggregate mask\n"
5248 "Generate AS set path information\n")
5249
5250ALIAS (no_aggregate_address_mask,
5251 no_aggregate_address_mask_as_set_summary_cmd,
5252 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5253 NO_STR
5254 "Configure BGP aggregate entries\n"
5255 "Aggregate address\n"
5256 "Aggregate mask\n"
5257 "Generate AS set path information\n"
5258 "Filter more specific routes from updates\n")
5259
5260ALIAS (no_aggregate_address_mask,
5261 no_aggregate_address_mask_summary_as_set_cmd,
5262 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5263 NO_STR
5264 "Configure BGP aggregate entries\n"
5265 "Aggregate address\n"
5266 "Aggregate mask\n"
5267 "Filter more specific routes from updates\n"
5268 "Generate AS set path information\n")
5269
5270#ifdef HAVE_IPV6
5271DEFUN (ipv6_aggregate_address,
5272 ipv6_aggregate_address_cmd,
5273 "aggregate-address X:X::X:X/M",
5274 "Configure BGP aggregate entries\n"
5275 "Aggregate prefix\n")
5276{
5277 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5278}
5279
5280DEFUN (ipv6_aggregate_address_summary_only,
5281 ipv6_aggregate_address_summary_only_cmd,
5282 "aggregate-address X:X::X:X/M summary-only",
5283 "Configure BGP aggregate entries\n"
5284 "Aggregate prefix\n"
5285 "Filter more specific routes from updates\n")
5286{
5287 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5288 AGGREGATE_SUMMARY_ONLY, 0);
5289}
5290
5291DEFUN (no_ipv6_aggregate_address,
5292 no_ipv6_aggregate_address_cmd,
5293 "no aggregate-address X:X::X:X/M",
5294 NO_STR
5295 "Configure BGP aggregate entries\n"
5296 "Aggregate prefix\n")
5297{
5298 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5299}
5300
5301DEFUN (no_ipv6_aggregate_address_summary_only,
5302 no_ipv6_aggregate_address_summary_only_cmd,
5303 "no aggregate-address X:X::X:X/M summary-only",
5304 NO_STR
5305 "Configure BGP aggregate entries\n"
5306 "Aggregate prefix\n"
5307 "Filter more specific routes from updates\n")
5308{
5309 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5310}
5311
5312ALIAS (ipv6_aggregate_address,
5313 old_ipv6_aggregate_address_cmd,
5314 "ipv6 bgp aggregate-address X:X::X:X/M",
5315 IPV6_STR
5316 BGP_STR
5317 "Configure BGP aggregate entries\n"
5318 "Aggregate prefix\n")
5319
5320ALIAS (ipv6_aggregate_address_summary_only,
5321 old_ipv6_aggregate_address_summary_only_cmd,
5322 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5323 IPV6_STR
5324 BGP_STR
5325 "Configure BGP aggregate entries\n"
5326 "Aggregate prefix\n"
5327 "Filter more specific routes from updates\n")
5328
5329ALIAS (no_ipv6_aggregate_address,
5330 old_no_ipv6_aggregate_address_cmd,
5331 "no ipv6 bgp aggregate-address X:X::X:X/M",
5332 NO_STR
5333 IPV6_STR
5334 BGP_STR
5335 "Configure BGP aggregate entries\n"
5336 "Aggregate prefix\n")
5337
5338ALIAS (no_ipv6_aggregate_address_summary_only,
5339 old_no_ipv6_aggregate_address_summary_only_cmd,
5340 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5341 NO_STR
5342 IPV6_STR
5343 BGP_STR
5344 "Configure BGP aggregate entries\n"
5345 "Aggregate prefix\n"
5346 "Filter more specific routes from updates\n")
5347#endif /* HAVE_IPV6 */
5348
5349/* Redistribute route treatment. */
5350void
Stephen Hemmingerf04a80a2011-12-06 14:51:10 +04005351bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
5352 const struct in6_addr *nexthop6,
paul718e3742002-12-13 20:15:29 +00005353 u_int32_t metric, u_char type)
5354{
5355 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005356 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005357 struct bgp_info *new;
5358 struct bgp_info *bi;
5359 struct bgp_info info;
5360 struct bgp_node *bn;
Jorge Boncompte [DTI2]e16a4132012-05-07 16:52:57 +00005361 struct attr attr;
paul718e3742002-12-13 20:15:29 +00005362 struct attr *new_attr;
5363 afi_t afi;
5364 int ret;
5365
5366 /* Make default attribute. */
5367 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5368 if (nexthop)
5369 attr.nexthop = *nexthop;
5370
Stephen Hemmingerf04a80a2011-12-06 14:51:10 +04005371#ifdef HAVE_IPV6
5372 if (nexthop6)
5373 {
5374 struct attr_extra *extra = bgp_attr_extra_get(&attr);
5375 extra->mp_nexthop_global = *nexthop6;
5376 extra->mp_nexthop_len = 16;
5377 }
5378#endif
5379
paul718e3742002-12-13 20:15:29 +00005380 attr.med = metric;
5381 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5382
paul1eb8ef22005-04-07 07:30:20 +00005383 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005384 {
5385 afi = family2afi (p->family);
5386
5387 if (bgp->redist[afi][type])
5388 {
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00005389 struct attr attr_new;
5390 struct attr_extra extra_new;
5391
paul718e3742002-12-13 20:15:29 +00005392 /* Copy attribute for modification. */
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00005393 attr_new.extra = &extra_new;
Paul Jakmafb982c22007-05-04 20:15:47 +00005394 bgp_attr_dup (&attr_new, &attr);
paul718e3742002-12-13 20:15:29 +00005395
5396 if (bgp->redist_metric_flag[afi][type])
5397 attr_new.med = bgp->redist_metric[afi][type];
5398
5399 /* Apply route-map. */
5400 if (bgp->rmap[afi][type].map)
5401 {
5402 info.peer = bgp->peer_self;
5403 info.attr = &attr_new;
5404
paulfee0f4c2004-09-13 05:12:46 +00005405 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5406
paul718e3742002-12-13 20:15:29 +00005407 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5408 &info);
paulfee0f4c2004-09-13 05:12:46 +00005409
5410 bgp->peer_self->rmap_type = 0;
5411
paul718e3742002-12-13 20:15:29 +00005412 if (ret == RMAP_DENYMATCH)
5413 {
5414 /* Free uninterned attribute. */
5415 bgp_attr_flush (&attr_new);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00005416
paul718e3742002-12-13 20:15:29 +00005417 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005418 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005419 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005420 bgp_redistribute_delete (p, type);
5421 return;
5422 }
5423 }
5424
Paul Jakmafb982c22007-05-04 20:15:47 +00005425 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5426 afi, SAFI_UNICAST, p, NULL);
5427
paul718e3742002-12-13 20:15:29 +00005428 new_attr = bgp_attr_intern (&attr_new);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00005429
paul718e3742002-12-13 20:15:29 +00005430 for (bi = bn->info; bi; bi = bi->next)
5431 if (bi->peer == bgp->peer_self
5432 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5433 break;
5434
5435 if (bi)
5436 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005437 if (attrhash_cmp (bi->attr, new_attr) &&
5438 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00005439 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005440 bgp_attr_unintern (&new_attr);
5441 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005442 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005443 bgp_unlock_node (bn);
5444 return;
5445 }
5446 else
5447 {
5448 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00005449 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00005450
5451 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005452 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5453 bgp_info_restore(bn, bi);
5454 else
5455 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005456 bgp_attr_unintern (&bi->attr);
paul718e3742002-12-13 20:15:29 +00005457 bi->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005458 bi->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005459
5460 /* Process change. */
5461 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5462 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5463 bgp_unlock_node (bn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005464 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005465 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005466 return;
5467 }
5468 }
5469
5470 new = bgp_info_new ();
5471 new->type = type;
5472 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5473 new->peer = bgp->peer_self;
5474 SET_FLAG (new->flags, BGP_INFO_VALID);
5475 new->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005476 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005477
5478 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5479 bgp_info_add (bn, new);
paul200df112005-06-01 11:17:05 +00005480 bgp_unlock_node (bn);
paul718e3742002-12-13 20:15:29 +00005481 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5482 }
5483 }
5484
5485 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005486 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005487 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005488}
5489
5490void
5491bgp_redistribute_delete (struct prefix *p, u_char type)
5492{
5493 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005494 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005495 afi_t afi;
5496 struct bgp_node *rn;
5497 struct bgp_info *ri;
5498
paul1eb8ef22005-04-07 07:30:20 +00005499 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005500 {
5501 afi = family2afi (p->family);
5502
5503 if (bgp->redist[afi][type])
5504 {
paulfee0f4c2004-09-13 05:12:46 +00005505 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
paul718e3742002-12-13 20:15:29 +00005506
5507 for (ri = rn->info; ri; ri = ri->next)
5508 if (ri->peer == bgp->peer_self
5509 && ri->type == type)
5510 break;
5511
5512 if (ri)
5513 {
5514 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005515 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005516 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005517 }
5518 bgp_unlock_node (rn);
5519 }
5520 }
5521}
5522
5523/* Withdraw specified route type's route. */
5524void
5525bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5526{
5527 struct bgp_node *rn;
5528 struct bgp_info *ri;
5529 struct bgp_table *table;
5530
5531 table = bgp->rib[afi][SAFI_UNICAST];
5532
5533 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5534 {
5535 for (ri = rn->info; ri; ri = ri->next)
5536 if (ri->peer == bgp->peer_self
5537 && ri->type == type)
5538 break;
5539
5540 if (ri)
5541 {
5542 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005543 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005544 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005545 }
5546 }
5547}
5548
5549/* Static function to display route. */
paul94f2b392005-06-28 12:44:16 +00005550static void
paul718e3742002-12-13 20:15:29 +00005551route_vty_out_route (struct prefix *p, struct vty *vty)
5552{
5553 int len;
5554 u_int32_t destination;
5555 char buf[BUFSIZ];
5556
5557 if (p->family == AF_INET)
5558 {
5559 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5560 destination = ntohl (p->u.prefix4.s_addr);
5561
5562 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5563 || (IN_CLASSB (destination) && p->prefixlen == 16)
5564 || (IN_CLASSA (destination) && p->prefixlen == 8)
5565 || p->u.prefix4.s_addr == 0)
5566 {
5567 /* When mask is natural, mask is not displayed. */
5568 }
5569 else
5570 len += vty_out (vty, "/%d", p->prefixlen);
5571 }
5572 else
5573 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5574 p->prefixlen);
5575
5576 len = 17 - len;
5577 if (len < 1)
5578 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5579 else
5580 vty_out (vty, "%*s", len, " ");
5581}
5582
paul718e3742002-12-13 20:15:29 +00005583enum bgp_display_type
5584{
5585 normal_list,
5586};
5587
paulb40d9392005-08-22 22:34:41 +00005588/* Print the short form route status for a bgp_info */
5589static void
5590route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
paul718e3742002-12-13 20:15:29 +00005591{
paulb40d9392005-08-22 22:34:41 +00005592 /* Route status display. */
5593 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5594 vty_out (vty, "R");
5595 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
hasso93406d82005-02-02 14:40:33 +00005596 vty_out (vty, "S");
Paul Jakmafb982c22007-05-04 20:15:47 +00005597 else if (binfo->extra && binfo->extra->suppress)
paul718e3742002-12-13 20:15:29 +00005598 vty_out (vty, "s");
5599 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5600 vty_out (vty, "*");
5601 else
5602 vty_out (vty, " ");
5603
5604 /* Selected */
5605 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5606 vty_out (vty, "h");
5607 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5608 vty_out (vty, "d");
5609 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5610 vty_out (vty, ">");
5611 else
5612 vty_out (vty, " ");
5613
5614 /* Internal route. */
5615 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5616 vty_out (vty, "i");
5617 else
paulb40d9392005-08-22 22:34:41 +00005618 vty_out (vty, " ");
5619}
5620
5621/* called from terminal list command */
5622void
5623route_vty_out (struct vty *vty, struct prefix *p,
5624 struct bgp_info *binfo, int display, safi_t safi)
5625{
5626 struct attr *attr;
5627
5628 /* short status lead text */
5629 route_vty_short_status_out (vty, binfo);
paul718e3742002-12-13 20:15:29 +00005630
5631 /* print prefix and mask */
5632 if (! display)
5633 route_vty_out_route (p, vty);
5634 else
5635 vty_out (vty, "%*s", 17, " ");
5636
5637 /* Print attribute */
5638 attr = binfo->attr;
5639 if (attr)
5640 {
5641 if (p->family == AF_INET)
5642 {
5643 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005644 vty_out (vty, "%-16s",
5645 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005646 else
5647 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5648 }
5649#ifdef HAVE_IPV6
5650 else if (p->family == AF_INET6)
5651 {
5652 int len;
5653 char buf[BUFSIZ];
5654
5655 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005656 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5657 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005658 len = 16 - len;
5659 if (len < 1)
5660 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5661 else
5662 vty_out (vty, "%*s", len, " ");
5663 }
5664#endif /* HAVE_IPV6 */
5665
5666 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005667 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005668 else
5669 vty_out (vty, " ");
5670
5671 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005672 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005673 else
5674 vty_out (vty, " ");
5675
Paul Jakmafb982c22007-05-04 20:15:47 +00005676 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
paul718e3742002-12-13 20:15:29 +00005677
Paul Jakmab2518c12006-05-12 23:48:40 +00005678 /* Print aspath */
5679 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005680 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005681
Paul Jakmab2518c12006-05-12 23:48:40 +00005682 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005683 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005684 }
paul718e3742002-12-13 20:15:29 +00005685 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005686}
5687
5688/* called from terminal list command */
5689void
5690route_vty_out_tmp (struct vty *vty, struct prefix *p,
5691 struct attr *attr, safi_t safi)
5692{
5693 /* Route status display. */
5694 vty_out (vty, "*");
5695 vty_out (vty, ">");
5696 vty_out (vty, " ");
5697
5698 /* print prefix and mask */
5699 route_vty_out_route (p, vty);
5700
5701 /* Print attribute */
5702 if (attr)
5703 {
5704 if (p->family == AF_INET)
5705 {
5706 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005707 vty_out (vty, "%-16s",
5708 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005709 else
5710 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5711 }
5712#ifdef HAVE_IPV6
5713 else if (p->family == AF_INET6)
5714 {
5715 int len;
5716 char buf[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005717
5718 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005719
5720 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005721 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5722 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005723 len = 16 - len;
5724 if (len < 1)
5725 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5726 else
5727 vty_out (vty, "%*s", len, " ");
5728 }
5729#endif /* HAVE_IPV6 */
5730
5731 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005732 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005733 else
5734 vty_out (vty, " ");
5735
5736 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005737 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005738 else
5739 vty_out (vty, " ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005740
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005741 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
Paul Jakmafb982c22007-05-04 20:15:47 +00005742
Paul Jakmab2518c12006-05-12 23:48:40 +00005743 /* Print aspath */
5744 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005745 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005746
Paul Jakmab2518c12006-05-12 23:48:40 +00005747 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005748 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005749 }
paul718e3742002-12-13 20:15:29 +00005750
5751 vty_out (vty, "%s", VTY_NEWLINE);
5752}
5753
ajs5a646652004-11-05 01:25:55 +00005754void
paul718e3742002-12-13 20:15:29 +00005755route_vty_out_tag (struct vty *vty, struct prefix *p,
5756 struct bgp_info *binfo, int display, safi_t safi)
5757{
5758 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005759 u_int32_t label = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00005760
5761 if (!binfo->extra)
5762 return;
5763
paulb40d9392005-08-22 22:34:41 +00005764 /* short status lead text */
5765 route_vty_short_status_out (vty, binfo);
5766
paul718e3742002-12-13 20:15:29 +00005767 /* print prefix and mask */
5768 if (! display)
5769 route_vty_out_route (p, vty);
5770 else
5771 vty_out (vty, "%*s", 17, " ");
5772
5773 /* Print attribute */
5774 attr = binfo->attr;
5775 if (attr)
5776 {
5777 if (p->family == AF_INET)
5778 {
5779 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005780 vty_out (vty, "%-16s",
5781 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005782 else
5783 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5784 }
5785#ifdef HAVE_IPV6
5786 else if (p->family == AF_INET6)
5787 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005788 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005789 char buf[BUFSIZ];
5790 char buf1[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005791 if (attr->extra->mp_nexthop_len == 16)
paul718e3742002-12-13 20:15:29 +00005792 vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005793 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5794 buf, BUFSIZ));
5795 else if (attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005796 vty_out (vty, "%s(%s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005797 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5798 buf, BUFSIZ),
5799 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5800 buf1, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005801
5802 }
5803#endif /* HAVE_IPV6 */
5804 }
5805
Paul Jakmafb982c22007-05-04 20:15:47 +00005806 label = decode_label (binfo->extra->tag);
paul718e3742002-12-13 20:15:29 +00005807
5808 vty_out (vty, "notag/%d", label);
5809
5810 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005811}
5812
5813/* dampening route */
ajs5a646652004-11-05 01:25:55 +00005814static void
paul718e3742002-12-13 20:15:29 +00005815damp_route_vty_out (struct vty *vty, struct prefix *p,
5816 struct bgp_info *binfo, int display, safi_t safi)
5817{
5818 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005819 int len;
Chris Caputo50aef6f2009-06-23 06:06:49 +00005820 char timebuf[BGP_UPTIME_LEN];
paul718e3742002-12-13 20:15:29 +00005821
paulb40d9392005-08-22 22:34:41 +00005822 /* short status lead text */
5823 route_vty_short_status_out (vty, binfo);
5824
paul718e3742002-12-13 20:15:29 +00005825 /* print prefix and mask */
5826 if (! display)
5827 route_vty_out_route (p, vty);
5828 else
5829 vty_out (vty, "%*s", 17, " ");
5830
5831 len = vty_out (vty, "%s", binfo->peer->host);
5832 len = 17 - len;
5833 if (len < 1)
5834 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5835 else
5836 vty_out (vty, "%*s", len, " ");
5837
Chris Caputo50aef6f2009-06-23 06:06:49 +00005838 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005839
5840 /* Print attribute */
5841 attr = binfo->attr;
5842 if (attr)
5843 {
5844 /* Print aspath */
5845 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005846 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005847
5848 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005849 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005850 }
5851 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005852}
5853
paul718e3742002-12-13 20:15:29 +00005854/* flap route */
ajs5a646652004-11-05 01:25:55 +00005855static void
paul718e3742002-12-13 20:15:29 +00005856flap_route_vty_out (struct vty *vty, struct prefix *p,
5857 struct bgp_info *binfo, int display, safi_t safi)
5858{
5859 struct attr *attr;
5860 struct bgp_damp_info *bdi;
paul718e3742002-12-13 20:15:29 +00005861 char timebuf[BGP_UPTIME_LEN];
5862 int len;
Paul Jakmafb982c22007-05-04 20:15:47 +00005863
5864 if (!binfo->extra)
5865 return;
5866
5867 bdi = binfo->extra->damp_info;
paul718e3742002-12-13 20:15:29 +00005868
paulb40d9392005-08-22 22:34:41 +00005869 /* short status lead text */
5870 route_vty_short_status_out (vty, binfo);
5871
paul718e3742002-12-13 20:15:29 +00005872 /* print prefix and mask */
5873 if (! display)
5874 route_vty_out_route (p, vty);
5875 else
5876 vty_out (vty, "%*s", 17, " ");
5877
5878 len = vty_out (vty, "%s", binfo->peer->host);
5879 len = 16 - len;
5880 if (len < 1)
5881 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5882 else
5883 vty_out (vty, "%*s", len, " ");
5884
5885 len = vty_out (vty, "%d", bdi->flap);
5886 len = 5 - len;
5887 if (len < 1)
5888 vty_out (vty, " ");
5889 else
5890 vty_out (vty, "%*s ", len, " ");
5891
5892 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5893 timebuf, BGP_UPTIME_LEN));
5894
5895 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5896 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
Chris Caputo50aef6f2009-06-23 06:06:49 +00005897 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005898 else
5899 vty_out (vty, "%*s ", 8, " ");
5900
5901 /* Print attribute */
5902 attr = binfo->attr;
5903 if (attr)
5904 {
5905 /* Print aspath */
5906 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005907 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005908
5909 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005910 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005911 }
5912 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005913}
5914
paul94f2b392005-06-28 12:44:16 +00005915static void
paul718e3742002-12-13 20:15:29 +00005916route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5917 struct bgp_info *binfo, afi_t afi, safi_t safi)
5918{
5919 char buf[INET6_ADDRSTRLEN];
5920 char buf1[BUFSIZ];
5921 struct attr *attr;
5922 int sockunion_vty_out (struct vty *, union sockunion *);
John Kemp30b00172011-03-18 17:52:18 +03005923#ifdef HAVE_CLOCK_MONOTONIC
5924 time_t tbuf;
5925#endif
paul718e3742002-12-13 20:15:29 +00005926
5927 attr = binfo->attr;
5928
5929 if (attr)
5930 {
5931 /* Line1 display AS-path, Aggregator */
5932 if (attr->aspath)
5933 {
5934 vty_out (vty, " ");
paulfe69a502005-09-10 16:55:02 +00005935 if (aspath_count_hops (attr->aspath) == 0)
paul718e3742002-12-13 20:15:29 +00005936 vty_out (vty, "Local");
5937 else
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005938 aspath_print_vty (vty, "%s", attr->aspath, "");
paul718e3742002-12-13 20:15:29 +00005939 }
5940
paulb40d9392005-08-22 22:34:41 +00005941 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5942 vty_out (vty, ", (removed)");
hasso93406d82005-02-02 14:40:33 +00005943 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5944 vty_out (vty, ", (stale)");
5945 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04005946 vty_out (vty, ", (aggregated by %u %s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005947 attr->extra->aggregator_as,
5948 inet_ntoa (attr->extra->aggregator_addr));
hasso93406d82005-02-02 14:40:33 +00005949 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5950 vty_out (vty, ", (Received from a RR-client)");
5951 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5952 vty_out (vty, ", (Received from a RS-client)");
5953 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5954 vty_out (vty, ", (history entry)");
5955 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5956 vty_out (vty, ", (suppressed due to dampening)");
paul718e3742002-12-13 20:15:29 +00005957 vty_out (vty, "%s", VTY_NEWLINE);
5958
5959 /* Line2 display Next-hop, Neighbor, Router-id */
5960 if (p->family == AF_INET)
5961 {
5962 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
Paul Jakmafb982c22007-05-04 20:15:47 +00005963 inet_ntoa (attr->extra->mp_nexthop_global_in) :
paul718e3742002-12-13 20:15:29 +00005964 inet_ntoa (attr->nexthop));
5965 }
5966#ifdef HAVE_IPV6
5967 else
5968 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005969 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005970 vty_out (vty, " %s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005971 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
paul718e3742002-12-13 20:15:29 +00005972 buf, INET6_ADDRSTRLEN));
5973 }
5974#endif /* HAVE_IPV6 */
5975
5976 if (binfo->peer == bgp->peer_self)
5977 {
5978 vty_out (vty, " from %s ",
5979 p->family == AF_INET ? "0.0.0.0" : "::");
5980 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5981 }
5982 else
5983 {
5984 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5985 vty_out (vty, " (inaccessible)");
Paul Jakmafb982c22007-05-04 20:15:47 +00005986 else if (binfo->extra && binfo->extra->igpmetric)
Jorge Boncompte [DTI2]ddc943d2012-04-13 13:46:07 +02005987 vty_out (vty, " (metric %u)", binfo->extra->igpmetric);
pauleb821182004-05-01 08:44:08 +00005988 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
paul718e3742002-12-13 20:15:29 +00005989 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005990 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005991 else
5992 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
5993 }
5994 vty_out (vty, "%s", VTY_NEWLINE);
5995
5996#ifdef HAVE_IPV6
5997 /* display nexthop local */
Paul Jakmafb982c22007-05-04 20:15:47 +00005998 if (attr->extra && attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005999 {
6000 vty_out (vty, " (%s)%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00006001 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
paul718e3742002-12-13 20:15:29 +00006002 buf, INET6_ADDRSTRLEN),
6003 VTY_NEWLINE);
6004 }
6005#endif /* HAVE_IPV6 */
6006
6007 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
6008 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
6009
6010 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07006011 vty_out (vty, ", metric %u", attr->med);
paul718e3742002-12-13 20:15:29 +00006012
6013 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07006014 vty_out (vty, ", localpref %u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00006015 else
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07006016 vty_out (vty, ", localpref %u", bgp->default_local_pref);
paul718e3742002-12-13 20:15:29 +00006017
Paul Jakmafb982c22007-05-04 20:15:47 +00006018 if (attr->extra && attr->extra->weight != 0)
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07006019 vty_out (vty, ", weight %u", attr->extra->weight);
paul718e3742002-12-13 20:15:29 +00006020
6021 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6022 vty_out (vty, ", valid");
6023
6024 if (binfo->peer != bgp->peer_self)
6025 {
6026 if (binfo->peer->as == binfo->peer->local_as)
6027 vty_out (vty, ", internal");
6028 else
6029 vty_out (vty, ", %s",
6030 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
6031 }
6032 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
6033 vty_out (vty, ", aggregated, local");
6034 else if (binfo->type != ZEBRA_ROUTE_BGP)
6035 vty_out (vty, ", sourced");
6036 else
6037 vty_out (vty, ", sourced, local");
6038
6039 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
6040 vty_out (vty, ", atomic-aggregate");
6041
Josh Baileyde8d5df2011-07-20 20:46:01 -07006042 if (CHECK_FLAG (binfo->flags, BGP_INFO_MULTIPATH) ||
6043 (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED) &&
6044 bgp_info_mpath_count (binfo)))
6045 vty_out (vty, ", multipath");
6046
paul718e3742002-12-13 20:15:29 +00006047 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
6048 vty_out (vty, ", best");
6049
6050 vty_out (vty, "%s", VTY_NEWLINE);
6051
6052 /* Line 4 display Community */
6053 if (attr->community)
6054 vty_out (vty, " Community: %s%s", attr->community->str,
6055 VTY_NEWLINE);
6056
6057 /* Line 5 display Extended-community */
6058 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
Paul Jakmafb982c22007-05-04 20:15:47 +00006059 vty_out (vty, " Extended Community: %s%s",
6060 attr->extra->ecommunity->str, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006061
6062 /* Line 6 display Originator, Cluster-id */
6063 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
6064 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
6065 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006066 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00006067 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00006068 vty_out (vty, " Originator: %s",
6069 inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00006070
6071 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
6072 {
6073 int i;
6074 vty_out (vty, ", Cluster list: ");
Paul Jakmafb982c22007-05-04 20:15:47 +00006075 for (i = 0; i < attr->extra->cluster->length / 4; i++)
6076 vty_out (vty, "%s ",
6077 inet_ntoa (attr->extra->cluster->list[i]));
paul718e3742002-12-13 20:15:29 +00006078 }
6079 vty_out (vty, "%s", VTY_NEWLINE);
6080 }
Paul Jakma41367172007-08-06 15:24:51 +00006081
Paul Jakmafb982c22007-05-04 20:15:47 +00006082 if (binfo->extra && binfo->extra->damp_info)
paul718e3742002-12-13 20:15:29 +00006083 bgp_damp_info_vty (vty, binfo);
6084
6085 /* Line 7 display Uptime */
John Kemp30b00172011-03-18 17:52:18 +03006086#ifdef HAVE_CLOCK_MONOTONIC
6087 tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
Vladimir L Ivanov213b6cd2010-10-21 14:59:54 +04006088 vty_out (vty, " Last update: %s", ctime(&tbuf));
John Kemp30b00172011-03-18 17:52:18 +03006089#else
6090 vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
6091#endif /* HAVE_CLOCK_MONOTONIC */
paul718e3742002-12-13 20:15:29 +00006092 }
6093 vty_out (vty, "%s", VTY_NEWLINE);
6094}
6095
paulb40d9392005-08-22 22:34:41 +00006096#define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,%s r RIB-failure, S Stale, R Removed%s"
hasso93406d82005-02-02 14:40:33 +00006097#define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
paul718e3742002-12-13 20:15:29 +00006098#define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
6099#define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
6100#define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
6101
6102enum bgp_show_type
6103{
6104 bgp_show_type_normal,
6105 bgp_show_type_regexp,
6106 bgp_show_type_prefix_list,
6107 bgp_show_type_filter_list,
6108 bgp_show_type_route_map,
6109 bgp_show_type_neighbor,
6110 bgp_show_type_cidr_only,
6111 bgp_show_type_prefix_longer,
6112 bgp_show_type_community_all,
6113 bgp_show_type_community,
6114 bgp_show_type_community_exact,
6115 bgp_show_type_community_list,
6116 bgp_show_type_community_list_exact,
6117 bgp_show_type_flap_statistics,
6118 bgp_show_type_flap_address,
6119 bgp_show_type_flap_prefix,
6120 bgp_show_type_flap_cidr_only,
6121 bgp_show_type_flap_regexp,
6122 bgp_show_type_flap_filter_list,
6123 bgp_show_type_flap_prefix_list,
6124 bgp_show_type_flap_prefix_longer,
6125 bgp_show_type_flap_route_map,
6126 bgp_show_type_flap_neighbor,
6127 bgp_show_type_dampend_paths,
6128 bgp_show_type_damp_neighbor
6129};
6130
ajs5a646652004-11-05 01:25:55 +00006131static int
paulfee0f4c2004-09-13 05:12:46 +00006132bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
ajs5a646652004-11-05 01:25:55 +00006133 enum bgp_show_type type, void *output_arg)
paul718e3742002-12-13 20:15:29 +00006134{
paul718e3742002-12-13 20:15:29 +00006135 struct bgp_info *ri;
6136 struct bgp_node *rn;
paul718e3742002-12-13 20:15:29 +00006137 int header = 1;
paul718e3742002-12-13 20:15:29 +00006138 int display;
ajs5a646652004-11-05 01:25:55 +00006139 unsigned long output_count;
paul718e3742002-12-13 20:15:29 +00006140
6141 /* This is first entry point, so reset total line. */
ajs5a646652004-11-05 01:25:55 +00006142 output_count = 0;
paul718e3742002-12-13 20:15:29 +00006143
paul718e3742002-12-13 20:15:29 +00006144 /* Start processing of routes. */
6145 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6146 if (rn->info != NULL)
6147 {
6148 display = 0;
6149
6150 for (ri = rn->info; ri; ri = ri->next)
6151 {
ajs5a646652004-11-05 01:25:55 +00006152 if (type == bgp_show_type_flap_statistics
paul718e3742002-12-13 20:15:29 +00006153 || type == bgp_show_type_flap_address
6154 || type == bgp_show_type_flap_prefix
6155 || type == bgp_show_type_flap_cidr_only
6156 || type == bgp_show_type_flap_regexp
6157 || type == bgp_show_type_flap_filter_list
6158 || type == bgp_show_type_flap_prefix_list
6159 || type == bgp_show_type_flap_prefix_longer
6160 || type == bgp_show_type_flap_route_map
6161 || type == bgp_show_type_flap_neighbor
6162 || type == bgp_show_type_dampend_paths
6163 || type == bgp_show_type_damp_neighbor)
6164 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006165 if (!(ri->extra && ri->extra->damp_info))
paul718e3742002-12-13 20:15:29 +00006166 continue;
6167 }
6168 if (type == bgp_show_type_regexp
6169 || type == bgp_show_type_flap_regexp)
6170 {
ajs5a646652004-11-05 01:25:55 +00006171 regex_t *regex = output_arg;
paul718e3742002-12-13 20:15:29 +00006172
6173 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6174 continue;
6175 }
6176 if (type == bgp_show_type_prefix_list
6177 || type == bgp_show_type_flap_prefix_list)
6178 {
ajs5a646652004-11-05 01:25:55 +00006179 struct prefix_list *plist = output_arg;
paul718e3742002-12-13 20:15:29 +00006180
6181 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6182 continue;
6183 }
6184 if (type == bgp_show_type_filter_list
6185 || type == bgp_show_type_flap_filter_list)
6186 {
ajs5a646652004-11-05 01:25:55 +00006187 struct as_list *as_list = output_arg;
paul718e3742002-12-13 20:15:29 +00006188
6189 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6190 continue;
6191 }
6192 if (type == bgp_show_type_route_map
6193 || type == bgp_show_type_flap_route_map)
6194 {
ajs5a646652004-11-05 01:25:55 +00006195 struct route_map *rmap = output_arg;
paul718e3742002-12-13 20:15:29 +00006196 struct bgp_info binfo;
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00006197 struct attr dummy_attr;
6198 struct attr_extra dummy_extra;
paul718e3742002-12-13 20:15:29 +00006199 int ret;
6200
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00006201 dummy_attr.extra = &dummy_extra;
Paul Jakmafb982c22007-05-04 20:15:47 +00006202 bgp_attr_dup (&dummy_attr, ri->attr);
Jorge Boncompte [DTI2]558d1fe2012-05-07 16:53:05 +00006203
paul718e3742002-12-13 20:15:29 +00006204 binfo.peer = ri->peer;
6205 binfo.attr = &dummy_attr;
6206
6207 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
paul718e3742002-12-13 20:15:29 +00006208 if (ret == RMAP_DENYMATCH)
6209 continue;
6210 }
6211 if (type == bgp_show_type_neighbor
6212 || type == bgp_show_type_flap_neighbor
6213 || type == bgp_show_type_damp_neighbor)
6214 {
ajs5a646652004-11-05 01:25:55 +00006215 union sockunion *su = output_arg;
paul718e3742002-12-13 20:15:29 +00006216
6217 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6218 continue;
6219 }
6220 if (type == bgp_show_type_cidr_only
6221 || type == bgp_show_type_flap_cidr_only)
6222 {
6223 u_int32_t destination;
6224
6225 destination = ntohl (rn->p.u.prefix4.s_addr);
6226 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6227 continue;
6228 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6229 continue;
6230 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6231 continue;
6232 }
6233 if (type == bgp_show_type_prefix_longer
6234 || type == bgp_show_type_flap_prefix_longer)
6235 {
ajs5a646652004-11-05 01:25:55 +00006236 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006237
6238 if (! prefix_match (p, &rn->p))
6239 continue;
6240 }
6241 if (type == bgp_show_type_community_all)
6242 {
6243 if (! ri->attr->community)
6244 continue;
6245 }
6246 if (type == bgp_show_type_community)
6247 {
ajs5a646652004-11-05 01:25:55 +00006248 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006249
6250 if (! ri->attr->community ||
6251 ! community_match (ri->attr->community, com))
6252 continue;
6253 }
6254 if (type == bgp_show_type_community_exact)
6255 {
ajs5a646652004-11-05 01:25:55 +00006256 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006257
6258 if (! ri->attr->community ||
6259 ! community_cmp (ri->attr->community, com))
6260 continue;
6261 }
6262 if (type == bgp_show_type_community_list)
6263 {
ajs5a646652004-11-05 01:25:55 +00006264 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006265
6266 if (! community_list_match (ri->attr->community, list))
6267 continue;
6268 }
6269 if (type == bgp_show_type_community_list_exact)
6270 {
ajs5a646652004-11-05 01:25:55 +00006271 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006272
6273 if (! community_list_exact_match (ri->attr->community, list))
6274 continue;
6275 }
6276 if (type == bgp_show_type_flap_address
6277 || type == bgp_show_type_flap_prefix)
6278 {
ajs5a646652004-11-05 01:25:55 +00006279 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006280
6281 if (! prefix_match (&rn->p, p))
6282 continue;
6283
6284 if (type == bgp_show_type_flap_prefix)
6285 if (p->prefixlen != rn->p.prefixlen)
6286 continue;
6287 }
6288 if (type == bgp_show_type_dampend_paths
6289 || type == bgp_show_type_damp_neighbor)
6290 {
6291 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6292 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6293 continue;
6294 }
6295
6296 if (header)
6297 {
hasso93406d82005-02-02 14:40:33 +00006298 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6299 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6300 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006301 if (type == bgp_show_type_dampend_paths
6302 || type == bgp_show_type_damp_neighbor)
6303 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6304 else if (type == bgp_show_type_flap_statistics
6305 || type == bgp_show_type_flap_address
6306 || type == bgp_show_type_flap_prefix
6307 || type == bgp_show_type_flap_cidr_only
6308 || type == bgp_show_type_flap_regexp
6309 || type == bgp_show_type_flap_filter_list
6310 || type == bgp_show_type_flap_prefix_list
6311 || type == bgp_show_type_flap_prefix_longer
6312 || type == bgp_show_type_flap_route_map
6313 || type == bgp_show_type_flap_neighbor)
6314 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6315 else
6316 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006317 header = 0;
6318 }
6319
6320 if (type == bgp_show_type_dampend_paths
6321 || type == bgp_show_type_damp_neighbor)
ajs5a646652004-11-05 01:25:55 +00006322 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006323 else if (type == bgp_show_type_flap_statistics
6324 || type == bgp_show_type_flap_address
6325 || type == bgp_show_type_flap_prefix
6326 || type == bgp_show_type_flap_cidr_only
6327 || type == bgp_show_type_flap_regexp
6328 || type == bgp_show_type_flap_filter_list
6329 || type == bgp_show_type_flap_prefix_list
6330 || type == bgp_show_type_flap_prefix_longer
6331 || type == bgp_show_type_flap_route_map
6332 || type == bgp_show_type_flap_neighbor)
ajs5a646652004-11-05 01:25:55 +00006333 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006334 else
ajs5a646652004-11-05 01:25:55 +00006335 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006336 display++;
6337 }
6338 if (display)
ajs5a646652004-11-05 01:25:55 +00006339 output_count++;
paul718e3742002-12-13 20:15:29 +00006340 }
6341
6342 /* No route is displayed */
ajs5a646652004-11-05 01:25:55 +00006343 if (output_count == 0)
paul718e3742002-12-13 20:15:29 +00006344 {
6345 if (type == bgp_show_type_normal)
6346 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6347 }
6348 else
6349 vty_out (vty, "%sTotal number of prefixes %ld%s",
ajs5a646652004-11-05 01:25:55 +00006350 VTY_NEWLINE, output_count, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006351
6352 return CMD_SUCCESS;
6353}
6354
ajs5a646652004-11-05 01:25:55 +00006355static int
paulfee0f4c2004-09-13 05:12:46 +00006356bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
ajs5a646652004-11-05 01:25:55 +00006357 enum bgp_show_type type, void *output_arg)
paulfee0f4c2004-09-13 05:12:46 +00006358{
6359 struct bgp_table *table;
6360
6361 if (bgp == NULL) {
6362 bgp = bgp_get_default ();
6363 }
6364
6365 if (bgp == NULL)
6366 {
6367 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6368 return CMD_WARNING;
6369 }
6370
6371
6372 table = bgp->rib[afi][safi];
6373
ajs5a646652004-11-05 01:25:55 +00006374 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
paulfee0f4c2004-09-13 05:12:46 +00006375}
6376
paul718e3742002-12-13 20:15:29 +00006377/* Header of detailed BGP route information */
paul94f2b392005-06-28 12:44:16 +00006378static void
paul718e3742002-12-13 20:15:29 +00006379route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6380 struct bgp_node *rn,
6381 struct prefix_rd *prd, afi_t afi, safi_t safi)
6382{
6383 struct bgp_info *ri;
6384 struct prefix *p;
6385 struct peer *peer;
paul1eb8ef22005-04-07 07:30:20 +00006386 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00006387 char buf1[INET6_ADDRSTRLEN];
6388 char buf2[INET6_ADDRSTRLEN];
6389 int count = 0;
6390 int best = 0;
6391 int suppress = 0;
6392 int no_export = 0;
6393 int no_advertise = 0;
6394 int local_as = 0;
6395 int first = 0;
6396
6397 p = &rn->p;
6398 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6399 (safi == SAFI_MPLS_VPN ?
6400 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6401 safi == SAFI_MPLS_VPN ? ":" : "",
6402 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6403 p->prefixlen, VTY_NEWLINE);
6404
6405 for (ri = rn->info; ri; ri = ri->next)
6406 {
6407 count++;
6408 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6409 {
6410 best = count;
Paul Jakmafb982c22007-05-04 20:15:47 +00006411 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00006412 suppress = 1;
6413 if (ri->attr->community != NULL)
6414 {
6415 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6416 no_advertise = 1;
6417 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6418 no_export = 1;
6419 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6420 local_as = 1;
6421 }
6422 }
6423 }
6424
6425 vty_out (vty, "Paths: (%d available", count);
6426 if (best)
6427 {
6428 vty_out (vty, ", best #%d", best);
6429 if (safi == SAFI_UNICAST)
6430 vty_out (vty, ", table Default-IP-Routing-Table");
6431 }
6432 else
6433 vty_out (vty, ", no best path");
6434 if (no_advertise)
6435 vty_out (vty, ", not advertised to any peer");
6436 else if (no_export)
6437 vty_out (vty, ", not advertised to EBGP peer");
6438 else if (local_as)
6439 vty_out (vty, ", not advertised outside local AS");
6440 if (suppress)
6441 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6442 vty_out (vty, ")%s", VTY_NEWLINE);
6443
6444 /* advertised peer */
paul1eb8ef22005-04-07 07:30:20 +00006445 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00006446 {
6447 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6448 {
6449 if (! first)
6450 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6451 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6452 first = 1;
6453 }
6454 }
6455 if (! first)
6456 vty_out (vty, " Not advertised to any peer");
6457 vty_out (vty, "%s", VTY_NEWLINE);
6458}
6459
6460/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +00006461static int
paulfee0f4c2004-09-13 05:12:46 +00006462bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
paulfd79ac92004-10-13 05:06:08 +00006463 struct bgp_table *rib, const char *ip_str,
6464 afi_t afi, safi_t safi, struct prefix_rd *prd,
6465 int prefix_check)
paul718e3742002-12-13 20:15:29 +00006466{
6467 int ret;
6468 int header;
6469 int display = 0;
6470 struct prefix match;
6471 struct bgp_node *rn;
6472 struct bgp_node *rm;
6473 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00006474 struct bgp_table *table;
6475
paul718e3742002-12-13 20:15:29 +00006476 /* Check IP address argument. */
6477 ret = str2prefix (ip_str, &match);
6478 if (! ret)
6479 {
6480 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6481 return CMD_WARNING;
6482 }
6483
6484 match.family = afi2family (afi);
6485
6486 if (safi == SAFI_MPLS_VPN)
6487 {
paulfee0f4c2004-09-13 05:12:46 +00006488 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
paul718e3742002-12-13 20:15:29 +00006489 {
6490 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6491 continue;
6492
6493 if ((table = rn->info) != NULL)
6494 {
6495 header = 1;
6496
6497 if ((rm = bgp_node_match (table, &match)) != NULL)
6498 {
6499 if (prefix_check && rm->p.prefixlen != match.prefixlen)
Chris Caputo6c88b442010-07-27 16:28:55 +00006500 {
6501 bgp_unlock_node (rm);
6502 continue;
6503 }
paul718e3742002-12-13 20:15:29 +00006504
6505 for (ri = rm->info; ri; ri = ri->next)
6506 {
6507 if (header)
6508 {
6509 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6510 AFI_IP, SAFI_MPLS_VPN);
6511
6512 header = 0;
6513 }
6514 display++;
6515 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6516 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006517
6518 bgp_unlock_node (rm);
paul718e3742002-12-13 20:15:29 +00006519 }
6520 }
6521 }
6522 }
6523 else
6524 {
6525 header = 1;
6526
paulfee0f4c2004-09-13 05:12:46 +00006527 if ((rn = bgp_node_match (rib, &match)) != NULL)
paul718e3742002-12-13 20:15:29 +00006528 {
6529 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6530 {
6531 for (ri = rn->info; ri; ri = ri->next)
6532 {
6533 if (header)
6534 {
6535 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6536 header = 0;
6537 }
6538 display++;
6539 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6540 }
6541 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006542
6543 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00006544 }
6545 }
6546
6547 if (! display)
6548 {
6549 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6550 return CMD_WARNING;
6551 }
6552
6553 return CMD_SUCCESS;
6554}
6555
paulfee0f4c2004-09-13 05:12:46 +00006556/* Display specified route of Main RIB */
paul94f2b392005-06-28 12:44:16 +00006557static int
paulfd79ac92004-10-13 05:06:08 +00006558bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
paulfee0f4c2004-09-13 05:12:46 +00006559 afi_t afi, safi_t safi, struct prefix_rd *prd,
6560 int prefix_check)
6561{
6562 struct bgp *bgp;
6563
6564 /* BGP structure lookup. */
6565 if (view_name)
6566 {
6567 bgp = bgp_lookup_by_name (view_name);
6568 if (bgp == NULL)
6569 {
6570 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6571 return CMD_WARNING;
6572 }
6573 }
6574 else
6575 {
6576 bgp = bgp_get_default ();
6577 if (bgp == NULL)
6578 {
6579 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6580 return CMD_WARNING;
6581 }
6582 }
6583
6584 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6585 afi, safi, prd, prefix_check);
6586}
6587
paul718e3742002-12-13 20:15:29 +00006588/* BGP route print out function. */
6589DEFUN (show_ip_bgp,
6590 show_ip_bgp_cmd,
6591 "show ip bgp",
6592 SHOW_STR
6593 IP_STR
6594 BGP_STR)
6595{
ajs5a646652004-11-05 01:25:55 +00006596 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006597}
6598
6599DEFUN (show_ip_bgp_ipv4,
6600 show_ip_bgp_ipv4_cmd,
6601 "show ip bgp ipv4 (unicast|multicast)",
6602 SHOW_STR
6603 IP_STR
6604 BGP_STR
6605 "Address family\n"
6606 "Address Family modifier\n"
6607 "Address Family modifier\n")
6608{
6609 if (strncmp (argv[0], "m", 1) == 0)
ajs5a646652004-11-05 01:25:55 +00006610 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6611 NULL);
paul718e3742002-12-13 20:15:29 +00006612
ajs5a646652004-11-05 01:25:55 +00006613 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006614}
6615
Michael Lambert95cbbd22010-07-23 14:43:04 -04006616ALIAS (show_ip_bgp_ipv4,
6617 show_bgp_ipv4_safi_cmd,
6618 "show bgp ipv4 (unicast|multicast)",
6619 SHOW_STR
6620 BGP_STR
6621 "Address family\n"
6622 "Address Family modifier\n"
6623 "Address Family modifier\n")
6624
paul718e3742002-12-13 20:15:29 +00006625DEFUN (show_ip_bgp_route,
6626 show_ip_bgp_route_cmd,
6627 "show ip bgp A.B.C.D",
6628 SHOW_STR
6629 IP_STR
6630 BGP_STR
6631 "Network in the BGP routing table to display\n")
6632{
6633 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6634}
6635
6636DEFUN (show_ip_bgp_ipv4_route,
6637 show_ip_bgp_ipv4_route_cmd,
6638 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6639 SHOW_STR
6640 IP_STR
6641 BGP_STR
6642 "Address family\n"
6643 "Address Family modifier\n"
6644 "Address Family modifier\n"
6645 "Network in the BGP routing table to display\n")
6646{
6647 if (strncmp (argv[0], "m", 1) == 0)
6648 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6649
6650 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6651}
6652
Michael Lambert95cbbd22010-07-23 14:43:04 -04006653ALIAS (show_ip_bgp_ipv4_route,
6654 show_bgp_ipv4_safi_route_cmd,
6655 "show bgp ipv4 (unicast|multicast) A.B.C.D",
6656 SHOW_STR
6657 BGP_STR
6658 "Address family\n"
6659 "Address Family modifier\n"
6660 "Address Family modifier\n"
6661 "Network in the BGP routing table to display\n")
6662
paul718e3742002-12-13 20:15:29 +00006663DEFUN (show_ip_bgp_vpnv4_all_route,
6664 show_ip_bgp_vpnv4_all_route_cmd,
6665 "show ip bgp vpnv4 all A.B.C.D",
6666 SHOW_STR
6667 IP_STR
6668 BGP_STR
6669 "Display VPNv4 NLRI specific information\n"
6670 "Display information about all VPNv4 NLRIs\n"
6671 "Network in the BGP routing table to display\n")
6672{
6673 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6674}
6675
6676DEFUN (show_ip_bgp_vpnv4_rd_route,
6677 show_ip_bgp_vpnv4_rd_route_cmd,
6678 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6679 SHOW_STR
6680 IP_STR
6681 BGP_STR
6682 "Display VPNv4 NLRI specific information\n"
6683 "Display information for a route distinguisher\n"
6684 "VPN Route Distinguisher\n"
6685 "Network in the BGP routing table to display\n")
6686{
6687 int ret;
6688 struct prefix_rd prd;
6689
6690 ret = str2prefix_rd (argv[0], &prd);
6691 if (! ret)
6692 {
6693 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6694 return CMD_WARNING;
6695 }
6696 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6697}
6698
6699DEFUN (show_ip_bgp_prefix,
6700 show_ip_bgp_prefix_cmd,
6701 "show ip bgp A.B.C.D/M",
6702 SHOW_STR
6703 IP_STR
6704 BGP_STR
6705 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6706{
6707 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6708}
6709
6710DEFUN (show_ip_bgp_ipv4_prefix,
6711 show_ip_bgp_ipv4_prefix_cmd,
6712 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6713 SHOW_STR
6714 IP_STR
6715 BGP_STR
6716 "Address family\n"
6717 "Address Family modifier\n"
6718 "Address Family modifier\n"
6719 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6720{
6721 if (strncmp (argv[0], "m", 1) == 0)
6722 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6723
6724 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6725}
6726
Michael Lambert95cbbd22010-07-23 14:43:04 -04006727ALIAS (show_ip_bgp_ipv4_prefix,
6728 show_bgp_ipv4_safi_prefix_cmd,
6729 "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
6730 SHOW_STR
6731 BGP_STR
6732 "Address family\n"
6733 "Address Family modifier\n"
6734 "Address Family modifier\n"
6735 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6736
paul718e3742002-12-13 20:15:29 +00006737DEFUN (show_ip_bgp_vpnv4_all_prefix,
6738 show_ip_bgp_vpnv4_all_prefix_cmd,
6739 "show ip bgp vpnv4 all A.B.C.D/M",
6740 SHOW_STR
6741 IP_STR
6742 BGP_STR
6743 "Display VPNv4 NLRI specific information\n"
6744 "Display information about all VPNv4 NLRIs\n"
6745 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6746{
6747 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6748}
6749
6750DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6751 show_ip_bgp_vpnv4_rd_prefix_cmd,
6752 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6753 SHOW_STR
6754 IP_STR
6755 BGP_STR
6756 "Display VPNv4 NLRI specific information\n"
6757 "Display information for a route distinguisher\n"
6758 "VPN Route Distinguisher\n"
6759 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6760{
6761 int ret;
6762 struct prefix_rd prd;
6763
6764 ret = str2prefix_rd (argv[0], &prd);
6765 if (! ret)
6766 {
6767 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6768 return CMD_WARNING;
6769 }
6770 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6771}
6772
6773DEFUN (show_ip_bgp_view,
6774 show_ip_bgp_view_cmd,
6775 "show ip bgp view WORD",
6776 SHOW_STR
6777 IP_STR
6778 BGP_STR
6779 "BGP view\n"
6780 "BGP view name\n")
6781{
paulbb46e942003-10-24 19:02:03 +00006782 struct bgp *bgp;
6783
6784 /* BGP structure lookup. */
6785 bgp = bgp_lookup_by_name (argv[0]);
6786 if (bgp == NULL)
6787 {
6788 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6789 return CMD_WARNING;
6790 }
6791
ajs5a646652004-11-05 01:25:55 +00006792 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006793}
6794
6795DEFUN (show_ip_bgp_view_route,
6796 show_ip_bgp_view_route_cmd,
6797 "show ip bgp view WORD A.B.C.D",
6798 SHOW_STR
6799 IP_STR
6800 BGP_STR
6801 "BGP view\n"
6802 "BGP view name\n"
6803 "Network in the BGP routing table to display\n")
6804{
6805 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6806}
6807
6808DEFUN (show_ip_bgp_view_prefix,
6809 show_ip_bgp_view_prefix_cmd,
6810 "show ip bgp view WORD A.B.C.D/M",
6811 SHOW_STR
6812 IP_STR
6813 BGP_STR
6814 "BGP view\n"
6815 "BGP view name\n"
6816 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6817{
6818 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6819}
6820
6821#ifdef HAVE_IPV6
6822DEFUN (show_bgp,
6823 show_bgp_cmd,
6824 "show bgp",
6825 SHOW_STR
6826 BGP_STR)
6827{
ajs5a646652004-11-05 01:25:55 +00006828 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6829 NULL);
paul718e3742002-12-13 20:15:29 +00006830}
6831
6832ALIAS (show_bgp,
6833 show_bgp_ipv6_cmd,
6834 "show bgp ipv6",
6835 SHOW_STR
6836 BGP_STR
6837 "Address family\n")
6838
Michael Lambert95cbbd22010-07-23 14:43:04 -04006839DEFUN (show_bgp_ipv6_safi,
6840 show_bgp_ipv6_safi_cmd,
6841 "show bgp ipv6 (unicast|multicast)",
6842 SHOW_STR
6843 BGP_STR
6844 "Address family\n"
6845 "Address Family modifier\n"
6846 "Address Family modifier\n")
6847{
6848 if (strncmp (argv[0], "m", 1) == 0)
6849 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6850 NULL);
6851
6852 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6853}
6854
paul718e3742002-12-13 20:15:29 +00006855/* old command */
6856DEFUN (show_ipv6_bgp,
6857 show_ipv6_bgp_cmd,
6858 "show ipv6 bgp",
6859 SHOW_STR
6860 IP_STR
6861 BGP_STR)
6862{
ajs5a646652004-11-05 01:25:55 +00006863 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6864 NULL);
paul718e3742002-12-13 20:15:29 +00006865}
6866
6867DEFUN (show_bgp_route,
6868 show_bgp_route_cmd,
6869 "show bgp X:X::X:X",
6870 SHOW_STR
6871 BGP_STR
6872 "Network in the BGP routing table to display\n")
6873{
6874 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6875}
6876
6877ALIAS (show_bgp_route,
6878 show_bgp_ipv6_route_cmd,
6879 "show bgp ipv6 X:X::X:X",
6880 SHOW_STR
6881 BGP_STR
6882 "Address family\n"
6883 "Network in the BGP routing table to display\n")
6884
Michael Lambert95cbbd22010-07-23 14:43:04 -04006885DEFUN (show_bgp_ipv6_safi_route,
6886 show_bgp_ipv6_safi_route_cmd,
6887 "show bgp ipv6 (unicast|multicast) X:X::X:X",
6888 SHOW_STR
6889 BGP_STR
6890 "Address family\n"
6891 "Address Family modifier\n"
6892 "Address Family modifier\n"
6893 "Network in the BGP routing table to display\n")
6894{
6895 if (strncmp (argv[0], "m", 1) == 0)
6896 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6897
6898 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6899}
6900
paul718e3742002-12-13 20:15:29 +00006901/* old command */
6902DEFUN (show_ipv6_bgp_route,
6903 show_ipv6_bgp_route_cmd,
6904 "show ipv6 bgp X:X::X:X",
6905 SHOW_STR
6906 IP_STR
6907 BGP_STR
6908 "Network in the BGP routing table to display\n")
6909{
6910 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6911}
6912
6913DEFUN (show_bgp_prefix,
6914 show_bgp_prefix_cmd,
6915 "show bgp X:X::X:X/M",
6916 SHOW_STR
6917 BGP_STR
6918 "IPv6 prefix <network>/<length>\n")
6919{
6920 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6921}
6922
6923ALIAS (show_bgp_prefix,
6924 show_bgp_ipv6_prefix_cmd,
6925 "show bgp ipv6 X:X::X:X/M",
6926 SHOW_STR
6927 BGP_STR
6928 "Address family\n"
6929 "IPv6 prefix <network>/<length>\n")
6930
Michael Lambert95cbbd22010-07-23 14:43:04 -04006931DEFUN (show_bgp_ipv6_safi_prefix,
6932 show_bgp_ipv6_safi_prefix_cmd,
6933 "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
6934 SHOW_STR
6935 BGP_STR
6936 "Address family\n"
6937 "Address Family modifier\n"
6938 "Address Family modifier\n"
6939 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6940{
6941 if (strncmp (argv[0], "m", 1) == 0)
6942 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6943
6944 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6945}
6946
paul718e3742002-12-13 20:15:29 +00006947/* old command */
6948DEFUN (show_ipv6_bgp_prefix,
6949 show_ipv6_bgp_prefix_cmd,
6950 "show ipv6 bgp X:X::X:X/M",
6951 SHOW_STR
6952 IP_STR
6953 BGP_STR
6954 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6955{
6956 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6957}
6958
paulbb46e942003-10-24 19:02:03 +00006959DEFUN (show_bgp_view,
6960 show_bgp_view_cmd,
6961 "show bgp view WORD",
6962 SHOW_STR
6963 BGP_STR
6964 "BGP view\n"
6965 "View name\n")
6966{
6967 struct bgp *bgp;
6968
6969 /* BGP structure lookup. */
6970 bgp = bgp_lookup_by_name (argv[0]);
6971 if (bgp == NULL)
6972 {
6973 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6974 return CMD_WARNING;
6975 }
6976
ajs5a646652004-11-05 01:25:55 +00006977 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
paulbb46e942003-10-24 19:02:03 +00006978}
6979
6980ALIAS (show_bgp_view,
6981 show_bgp_view_ipv6_cmd,
6982 "show bgp view WORD ipv6",
6983 SHOW_STR
6984 BGP_STR
6985 "BGP view\n"
6986 "View name\n"
6987 "Address family\n")
6988
6989DEFUN (show_bgp_view_route,
6990 show_bgp_view_route_cmd,
6991 "show bgp view WORD X:X::X:X",
6992 SHOW_STR
6993 BGP_STR
6994 "BGP view\n"
6995 "View name\n"
6996 "Network in the BGP routing table to display\n")
6997{
6998 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6999}
7000
7001ALIAS (show_bgp_view_route,
7002 show_bgp_view_ipv6_route_cmd,
7003 "show bgp view WORD ipv6 X:X::X:X",
7004 SHOW_STR
7005 BGP_STR
7006 "BGP view\n"
7007 "View name\n"
7008 "Address family\n"
7009 "Network in the BGP routing table to display\n")
7010
7011DEFUN (show_bgp_view_prefix,
7012 show_bgp_view_prefix_cmd,
7013 "show bgp view WORD X:X::X:X/M",
7014 SHOW_STR
7015 BGP_STR
7016 "BGP view\n"
7017 "View name\n"
7018 "IPv6 prefix <network>/<length>\n")
7019{
7020 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
7021}
7022
7023ALIAS (show_bgp_view_prefix,
7024 show_bgp_view_ipv6_prefix_cmd,
7025 "show bgp view WORD ipv6 X:X::X:X/M",
7026 SHOW_STR
7027 BGP_STR
7028 "BGP view\n"
7029 "View name\n"
7030 "Address family\n"
7031 "IPv6 prefix <network>/<length>\n")
7032
paul718e3742002-12-13 20:15:29 +00007033/* old command */
7034DEFUN (show_ipv6_mbgp,
7035 show_ipv6_mbgp_cmd,
7036 "show ipv6 mbgp",
7037 SHOW_STR
7038 IP_STR
7039 MBGP_STR)
7040{
ajs5a646652004-11-05 01:25:55 +00007041 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
7042 NULL);
paul718e3742002-12-13 20:15:29 +00007043}
7044
7045/* old command */
7046DEFUN (show_ipv6_mbgp_route,
7047 show_ipv6_mbgp_route_cmd,
7048 "show ipv6 mbgp X:X::X:X",
7049 SHOW_STR
7050 IP_STR
7051 MBGP_STR
7052 "Network in the MBGP routing table to display\n")
7053{
7054 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
7055}
7056
7057/* old command */
7058DEFUN (show_ipv6_mbgp_prefix,
7059 show_ipv6_mbgp_prefix_cmd,
7060 "show ipv6 mbgp X:X::X:X/M",
7061 SHOW_STR
7062 IP_STR
7063 MBGP_STR
7064 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7065{
7066 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
7067}
7068#endif
7069
paul718e3742002-12-13 20:15:29 +00007070
paul94f2b392005-06-28 12:44:16 +00007071static int
paulfd79ac92004-10-13 05:06:08 +00007072bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007073 safi_t safi, enum bgp_show_type type)
7074{
7075 int i;
7076 struct buffer *b;
7077 char *regstr;
7078 int first;
7079 regex_t *regex;
ajs5a646652004-11-05 01:25:55 +00007080 int rc;
paul718e3742002-12-13 20:15:29 +00007081
7082 first = 0;
7083 b = buffer_new (1024);
7084 for (i = 0; i < argc; i++)
7085 {
7086 if (first)
7087 buffer_putc (b, ' ');
7088 else
7089 {
7090 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7091 continue;
7092 first = 1;
7093 }
7094
7095 buffer_putstr (b, argv[i]);
7096 }
7097 buffer_putc (b, '\0');
7098
7099 regstr = buffer_getstr (b);
7100 buffer_free (b);
7101
7102 regex = bgp_regcomp (regstr);
ajs3b8b1852005-01-29 18:19:13 +00007103 XFREE(MTYPE_TMP, regstr);
paul718e3742002-12-13 20:15:29 +00007104 if (! regex)
7105 {
7106 vty_out (vty, "Can't compile regexp %s%s", argv[0],
7107 VTY_NEWLINE);
7108 return CMD_WARNING;
7109 }
7110
ajs5a646652004-11-05 01:25:55 +00007111 rc = bgp_show (vty, NULL, afi, safi, type, regex);
7112 bgp_regex_free (regex);
7113 return rc;
paul718e3742002-12-13 20:15:29 +00007114}
7115
7116DEFUN (show_ip_bgp_regexp,
7117 show_ip_bgp_regexp_cmd,
7118 "show ip bgp regexp .LINE",
7119 SHOW_STR
7120 IP_STR
7121 BGP_STR
7122 "Display routes matching the AS path regular expression\n"
7123 "A regular-expression to match the BGP AS paths\n")
7124{
7125 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7126 bgp_show_type_regexp);
7127}
7128
7129DEFUN (show_ip_bgp_flap_regexp,
7130 show_ip_bgp_flap_regexp_cmd,
7131 "show ip bgp flap-statistics regexp .LINE",
7132 SHOW_STR
7133 IP_STR
7134 BGP_STR
7135 "Display flap statistics of routes\n"
7136 "Display routes matching the AS path regular expression\n"
7137 "A regular-expression to match the BGP AS paths\n")
7138{
7139 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7140 bgp_show_type_flap_regexp);
7141}
7142
7143DEFUN (show_ip_bgp_ipv4_regexp,
7144 show_ip_bgp_ipv4_regexp_cmd,
7145 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7146 SHOW_STR
7147 IP_STR
7148 BGP_STR
7149 "Address family\n"
7150 "Address Family modifier\n"
7151 "Address Family modifier\n"
7152 "Display routes matching the AS path regular expression\n"
7153 "A regular-expression to match the BGP AS paths\n")
7154{
7155 if (strncmp (argv[0], "m", 1) == 0)
7156 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7157 bgp_show_type_regexp);
7158
7159 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7160 bgp_show_type_regexp);
7161}
7162
7163#ifdef HAVE_IPV6
7164DEFUN (show_bgp_regexp,
7165 show_bgp_regexp_cmd,
7166 "show bgp regexp .LINE",
7167 SHOW_STR
7168 BGP_STR
7169 "Display routes matching the AS path regular expression\n"
7170 "A regular-expression to match the BGP AS paths\n")
7171{
7172 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7173 bgp_show_type_regexp);
7174}
7175
7176ALIAS (show_bgp_regexp,
7177 show_bgp_ipv6_regexp_cmd,
7178 "show bgp ipv6 regexp .LINE",
7179 SHOW_STR
7180 BGP_STR
7181 "Address family\n"
7182 "Display routes matching the AS path regular expression\n"
7183 "A regular-expression to match the BGP AS paths\n")
7184
7185/* old command */
7186DEFUN (show_ipv6_bgp_regexp,
7187 show_ipv6_bgp_regexp_cmd,
7188 "show ipv6 bgp regexp .LINE",
7189 SHOW_STR
7190 IP_STR
7191 BGP_STR
7192 "Display routes matching the AS path regular expression\n"
7193 "A regular-expression to match the BGP AS paths\n")
7194{
7195 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7196 bgp_show_type_regexp);
7197}
7198
7199/* old command */
7200DEFUN (show_ipv6_mbgp_regexp,
7201 show_ipv6_mbgp_regexp_cmd,
7202 "show ipv6 mbgp regexp .LINE",
7203 SHOW_STR
7204 IP_STR
7205 BGP_STR
7206 "Display routes matching the AS path regular expression\n"
7207 "A regular-expression to match the MBGP AS paths\n")
7208{
7209 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7210 bgp_show_type_regexp);
7211}
7212#endif /* HAVE_IPV6 */
7213
paul94f2b392005-06-28 12:44:16 +00007214static int
paulfd79ac92004-10-13 05:06:08 +00007215bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007216 safi_t safi, enum bgp_show_type type)
7217{
7218 struct prefix_list *plist;
7219
7220 plist = prefix_list_lookup (afi, prefix_list_str);
7221 if (plist == NULL)
7222 {
7223 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7224 prefix_list_str, VTY_NEWLINE);
7225 return CMD_WARNING;
7226 }
7227
ajs5a646652004-11-05 01:25:55 +00007228 return bgp_show (vty, NULL, afi, safi, type, plist);
paul718e3742002-12-13 20:15:29 +00007229}
7230
7231DEFUN (show_ip_bgp_prefix_list,
7232 show_ip_bgp_prefix_list_cmd,
7233 "show ip bgp prefix-list WORD",
7234 SHOW_STR
7235 IP_STR
7236 BGP_STR
7237 "Display routes conforming to the prefix-list\n"
7238 "IP prefix-list name\n")
7239{
7240 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7241 bgp_show_type_prefix_list);
7242}
7243
7244DEFUN (show_ip_bgp_flap_prefix_list,
7245 show_ip_bgp_flap_prefix_list_cmd,
7246 "show ip bgp flap-statistics prefix-list WORD",
7247 SHOW_STR
7248 IP_STR
7249 BGP_STR
7250 "Display flap statistics of routes\n"
7251 "Display routes conforming to the prefix-list\n"
7252 "IP prefix-list name\n")
7253{
7254 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7255 bgp_show_type_flap_prefix_list);
7256}
7257
7258DEFUN (show_ip_bgp_ipv4_prefix_list,
7259 show_ip_bgp_ipv4_prefix_list_cmd,
7260 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7261 SHOW_STR
7262 IP_STR
7263 BGP_STR
7264 "Address family\n"
7265 "Address Family modifier\n"
7266 "Address Family modifier\n"
7267 "Display routes conforming to the prefix-list\n"
7268 "IP prefix-list name\n")
7269{
7270 if (strncmp (argv[0], "m", 1) == 0)
7271 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7272 bgp_show_type_prefix_list);
7273
7274 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7275 bgp_show_type_prefix_list);
7276}
7277
7278#ifdef HAVE_IPV6
7279DEFUN (show_bgp_prefix_list,
7280 show_bgp_prefix_list_cmd,
7281 "show bgp prefix-list WORD",
7282 SHOW_STR
7283 BGP_STR
7284 "Display routes conforming to the prefix-list\n"
7285 "IPv6 prefix-list name\n")
7286{
7287 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7288 bgp_show_type_prefix_list);
7289}
7290
7291ALIAS (show_bgp_prefix_list,
7292 show_bgp_ipv6_prefix_list_cmd,
7293 "show bgp ipv6 prefix-list WORD",
7294 SHOW_STR
7295 BGP_STR
7296 "Address family\n"
7297 "Display routes conforming to the prefix-list\n"
7298 "IPv6 prefix-list name\n")
7299
7300/* old command */
7301DEFUN (show_ipv6_bgp_prefix_list,
7302 show_ipv6_bgp_prefix_list_cmd,
7303 "show ipv6 bgp prefix-list WORD",
7304 SHOW_STR
7305 IPV6_STR
7306 BGP_STR
7307 "Display routes matching the prefix-list\n"
7308 "IPv6 prefix-list name\n")
7309{
7310 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7311 bgp_show_type_prefix_list);
7312}
7313
7314/* old command */
7315DEFUN (show_ipv6_mbgp_prefix_list,
7316 show_ipv6_mbgp_prefix_list_cmd,
7317 "show ipv6 mbgp prefix-list WORD",
7318 SHOW_STR
7319 IPV6_STR
7320 MBGP_STR
7321 "Display routes matching the prefix-list\n"
7322 "IPv6 prefix-list name\n")
7323{
7324 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7325 bgp_show_type_prefix_list);
7326}
7327#endif /* HAVE_IPV6 */
7328
paul94f2b392005-06-28 12:44:16 +00007329static int
paulfd79ac92004-10-13 05:06:08 +00007330bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007331 safi_t safi, enum bgp_show_type type)
7332{
7333 struct as_list *as_list;
7334
7335 as_list = as_list_lookup (filter);
7336 if (as_list == NULL)
7337 {
7338 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7339 return CMD_WARNING;
7340 }
7341
ajs5a646652004-11-05 01:25:55 +00007342 return bgp_show (vty, NULL, afi, safi, type, as_list);
paul718e3742002-12-13 20:15:29 +00007343}
7344
7345DEFUN (show_ip_bgp_filter_list,
7346 show_ip_bgp_filter_list_cmd,
7347 "show ip bgp filter-list WORD",
7348 SHOW_STR
7349 IP_STR
7350 BGP_STR
7351 "Display routes conforming to the filter-list\n"
7352 "Regular expression access list name\n")
7353{
7354 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7355 bgp_show_type_filter_list);
7356}
7357
7358DEFUN (show_ip_bgp_flap_filter_list,
7359 show_ip_bgp_flap_filter_list_cmd,
7360 "show ip bgp flap-statistics filter-list WORD",
7361 SHOW_STR
7362 IP_STR
7363 BGP_STR
7364 "Display flap statistics of routes\n"
7365 "Display routes conforming to the filter-list\n"
7366 "Regular expression access list name\n")
7367{
7368 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7369 bgp_show_type_flap_filter_list);
7370}
7371
7372DEFUN (show_ip_bgp_ipv4_filter_list,
7373 show_ip_bgp_ipv4_filter_list_cmd,
7374 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7375 SHOW_STR
7376 IP_STR
7377 BGP_STR
7378 "Address family\n"
7379 "Address Family modifier\n"
7380 "Address Family modifier\n"
7381 "Display routes conforming to the filter-list\n"
7382 "Regular expression access list name\n")
7383{
7384 if (strncmp (argv[0], "m", 1) == 0)
7385 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7386 bgp_show_type_filter_list);
7387
7388 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7389 bgp_show_type_filter_list);
7390}
7391
7392#ifdef HAVE_IPV6
7393DEFUN (show_bgp_filter_list,
7394 show_bgp_filter_list_cmd,
7395 "show bgp filter-list WORD",
7396 SHOW_STR
7397 BGP_STR
7398 "Display routes conforming to the filter-list\n"
7399 "Regular expression access list name\n")
7400{
7401 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7402 bgp_show_type_filter_list);
7403}
7404
7405ALIAS (show_bgp_filter_list,
7406 show_bgp_ipv6_filter_list_cmd,
7407 "show bgp ipv6 filter-list WORD",
7408 SHOW_STR
7409 BGP_STR
7410 "Address family\n"
7411 "Display routes conforming to the filter-list\n"
7412 "Regular expression access list name\n")
7413
7414/* old command */
7415DEFUN (show_ipv6_bgp_filter_list,
7416 show_ipv6_bgp_filter_list_cmd,
7417 "show ipv6 bgp filter-list WORD",
7418 SHOW_STR
7419 IPV6_STR
7420 BGP_STR
7421 "Display routes conforming to the filter-list\n"
7422 "Regular expression access list name\n")
7423{
7424 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7425 bgp_show_type_filter_list);
7426}
7427
7428/* old command */
7429DEFUN (show_ipv6_mbgp_filter_list,
7430 show_ipv6_mbgp_filter_list_cmd,
7431 "show ipv6 mbgp filter-list WORD",
7432 SHOW_STR
7433 IPV6_STR
7434 MBGP_STR
7435 "Display routes conforming to the filter-list\n"
7436 "Regular expression access list name\n")
7437{
7438 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7439 bgp_show_type_filter_list);
7440}
7441#endif /* HAVE_IPV6 */
7442
paul94f2b392005-06-28 12:44:16 +00007443static int
paulfd79ac92004-10-13 05:06:08 +00007444bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007445 safi_t safi, enum bgp_show_type type)
7446{
7447 struct route_map *rmap;
7448
7449 rmap = route_map_lookup_by_name (rmap_str);
7450 if (! rmap)
7451 {
7452 vty_out (vty, "%% %s is not a valid route-map name%s",
7453 rmap_str, VTY_NEWLINE);
7454 return CMD_WARNING;
7455 }
7456
ajs5a646652004-11-05 01:25:55 +00007457 return bgp_show (vty, NULL, afi, safi, type, rmap);
paul718e3742002-12-13 20:15:29 +00007458}
7459
7460DEFUN (show_ip_bgp_route_map,
7461 show_ip_bgp_route_map_cmd,
7462 "show ip bgp route-map WORD",
7463 SHOW_STR
7464 IP_STR
7465 BGP_STR
7466 "Display routes matching the route-map\n"
7467 "A route-map to match on\n")
7468{
7469 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7470 bgp_show_type_route_map);
7471}
7472
7473DEFUN (show_ip_bgp_flap_route_map,
7474 show_ip_bgp_flap_route_map_cmd,
7475 "show ip bgp flap-statistics route-map WORD",
7476 SHOW_STR
7477 IP_STR
7478 BGP_STR
7479 "Display flap statistics of routes\n"
7480 "Display routes matching the route-map\n"
7481 "A route-map to match on\n")
7482{
7483 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7484 bgp_show_type_flap_route_map);
7485}
7486
7487DEFUN (show_ip_bgp_ipv4_route_map,
7488 show_ip_bgp_ipv4_route_map_cmd,
7489 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7490 SHOW_STR
7491 IP_STR
7492 BGP_STR
7493 "Address family\n"
7494 "Address Family modifier\n"
7495 "Address Family modifier\n"
7496 "Display routes matching the route-map\n"
7497 "A route-map to match on\n")
7498{
7499 if (strncmp (argv[0], "m", 1) == 0)
7500 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7501 bgp_show_type_route_map);
7502
7503 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7504 bgp_show_type_route_map);
7505}
7506
7507DEFUN (show_bgp_route_map,
7508 show_bgp_route_map_cmd,
7509 "show bgp route-map WORD",
7510 SHOW_STR
7511 BGP_STR
7512 "Display routes matching the route-map\n"
7513 "A route-map to match on\n")
7514{
7515 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7516 bgp_show_type_route_map);
7517}
7518
7519ALIAS (show_bgp_route_map,
7520 show_bgp_ipv6_route_map_cmd,
7521 "show bgp ipv6 route-map WORD",
7522 SHOW_STR
7523 BGP_STR
7524 "Address family\n"
7525 "Display routes matching the route-map\n"
7526 "A route-map to match on\n")
7527
7528DEFUN (show_ip_bgp_cidr_only,
7529 show_ip_bgp_cidr_only_cmd,
7530 "show ip bgp cidr-only",
7531 SHOW_STR
7532 IP_STR
7533 BGP_STR
7534 "Display only routes with non-natural netmasks\n")
7535{
7536 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007537 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007538}
7539
7540DEFUN (show_ip_bgp_flap_cidr_only,
7541 show_ip_bgp_flap_cidr_only_cmd,
7542 "show ip bgp flap-statistics cidr-only",
7543 SHOW_STR
7544 IP_STR
7545 BGP_STR
7546 "Display flap statistics of routes\n"
7547 "Display only routes with non-natural netmasks\n")
7548{
7549 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007550 bgp_show_type_flap_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007551}
7552
7553DEFUN (show_ip_bgp_ipv4_cidr_only,
7554 show_ip_bgp_ipv4_cidr_only_cmd,
7555 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7556 SHOW_STR
7557 IP_STR
7558 BGP_STR
7559 "Address family\n"
7560 "Address Family modifier\n"
7561 "Address Family modifier\n"
7562 "Display only routes with non-natural netmasks\n")
7563{
7564 if (strncmp (argv[0], "m", 1) == 0)
7565 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007566 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007567
7568 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007569 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007570}
7571
7572DEFUN (show_ip_bgp_community_all,
7573 show_ip_bgp_community_all_cmd,
7574 "show ip bgp community",
7575 SHOW_STR
7576 IP_STR
7577 BGP_STR
7578 "Display routes matching the communities\n")
7579{
7580 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007581 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007582}
7583
7584DEFUN (show_ip_bgp_ipv4_community_all,
7585 show_ip_bgp_ipv4_community_all_cmd,
7586 "show ip bgp ipv4 (unicast|multicast) community",
7587 SHOW_STR
7588 IP_STR
7589 BGP_STR
7590 "Address family\n"
7591 "Address Family modifier\n"
7592 "Address Family modifier\n"
7593 "Display routes matching the communities\n")
7594{
7595 if (strncmp (argv[0], "m", 1) == 0)
7596 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007597 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007598
7599 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007600 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007601}
7602
7603#ifdef HAVE_IPV6
7604DEFUN (show_bgp_community_all,
7605 show_bgp_community_all_cmd,
7606 "show bgp community",
7607 SHOW_STR
7608 BGP_STR
7609 "Display routes matching the communities\n")
7610{
7611 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007612 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007613}
7614
7615ALIAS (show_bgp_community_all,
7616 show_bgp_ipv6_community_all_cmd,
7617 "show bgp ipv6 community",
7618 SHOW_STR
7619 BGP_STR
7620 "Address family\n"
7621 "Display routes matching the communities\n")
7622
7623/* old command */
7624DEFUN (show_ipv6_bgp_community_all,
7625 show_ipv6_bgp_community_all_cmd,
7626 "show ipv6 bgp community",
7627 SHOW_STR
7628 IPV6_STR
7629 BGP_STR
7630 "Display routes matching the communities\n")
7631{
7632 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007633 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007634}
7635
7636/* old command */
7637DEFUN (show_ipv6_mbgp_community_all,
7638 show_ipv6_mbgp_community_all_cmd,
7639 "show ipv6 mbgp community",
7640 SHOW_STR
7641 IPV6_STR
7642 MBGP_STR
7643 "Display routes matching the communities\n")
7644{
7645 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007646 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007647}
7648#endif /* HAVE_IPV6 */
7649
paul94f2b392005-06-28 12:44:16 +00007650static int
Michael Lambert95cbbd22010-07-23 14:43:04 -04007651bgp_show_community (struct vty *vty, const char *view_name, int argc,
7652 const char **argv, int exact, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00007653{
7654 struct community *com;
7655 struct buffer *b;
Michael Lambert95cbbd22010-07-23 14:43:04 -04007656 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +00007657 int i;
7658 char *str;
7659 int first = 0;
7660
Michael Lambert95cbbd22010-07-23 14:43:04 -04007661 /* BGP structure lookup */
7662 if (view_name)
7663 {
7664 bgp = bgp_lookup_by_name (view_name);
7665 if (bgp == NULL)
7666 {
7667 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
7668 return CMD_WARNING;
7669 }
7670 }
7671 else
7672 {
7673 bgp = bgp_get_default ();
7674 if (bgp == NULL)
7675 {
7676 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
7677 return CMD_WARNING;
7678 }
7679 }
7680
paul718e3742002-12-13 20:15:29 +00007681 b = buffer_new (1024);
7682 for (i = 0; i < argc; i++)
7683 {
7684 if (first)
7685 buffer_putc (b, ' ');
7686 else
7687 {
7688 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7689 continue;
7690 first = 1;
7691 }
7692
7693 buffer_putstr (b, argv[i]);
7694 }
7695 buffer_putc (b, '\0');
7696
7697 str = buffer_getstr (b);
7698 buffer_free (b);
7699
7700 com = community_str2com (str);
ajs3b8b1852005-01-29 18:19:13 +00007701 XFREE (MTYPE_TMP, str);
paul718e3742002-12-13 20:15:29 +00007702 if (! com)
7703 {
7704 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7705 return CMD_WARNING;
7706 }
7707
Michael Lambert95cbbd22010-07-23 14:43:04 -04007708 return bgp_show (vty, bgp, afi, safi,
ajs5a646652004-11-05 01:25:55 +00007709 (exact ? bgp_show_type_community_exact :
7710 bgp_show_type_community), com);
paul718e3742002-12-13 20:15:29 +00007711}
7712
7713DEFUN (show_ip_bgp_community,
7714 show_ip_bgp_community_cmd,
7715 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7716 SHOW_STR
7717 IP_STR
7718 BGP_STR
7719 "Display routes matching the communities\n"
7720 "community number\n"
7721 "Do not send outside local AS (well-known community)\n"
7722 "Do not advertise to any peer (well-known community)\n"
7723 "Do not export to next AS (well-known community)\n")
7724{
Michael Lambert95cbbd22010-07-23 14:43:04 -04007725 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007726}
7727
7728ALIAS (show_ip_bgp_community,
7729 show_ip_bgp_community2_cmd,
7730 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7731 SHOW_STR
7732 IP_STR
7733 BGP_STR
7734 "Display routes matching the communities\n"
7735 "community number\n"
7736 "Do not send outside local AS (well-known community)\n"
7737 "Do not advertise to any peer (well-known community)\n"
7738 "Do not export to next AS (well-known community)\n"
7739 "community number\n"
7740 "Do not send outside local AS (well-known community)\n"
7741 "Do not advertise to any peer (well-known community)\n"
7742 "Do not export to next AS (well-known community)\n")
7743
7744ALIAS (show_ip_bgp_community,
7745 show_ip_bgp_community3_cmd,
7746 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7747 SHOW_STR
7748 IP_STR
7749 BGP_STR
7750 "Display routes matching the communities\n"
7751 "community number\n"
7752 "Do not send outside local AS (well-known community)\n"
7753 "Do not advertise to any peer (well-known community)\n"
7754 "Do not export to next AS (well-known community)\n"
7755 "community number\n"
7756 "Do not send outside local AS (well-known community)\n"
7757 "Do not advertise to any peer (well-known community)\n"
7758 "Do not export to next AS (well-known community)\n"
7759 "community number\n"
7760 "Do not send outside local AS (well-known community)\n"
7761 "Do not advertise to any peer (well-known community)\n"
7762 "Do not export to next AS (well-known community)\n")
7763
7764ALIAS (show_ip_bgp_community,
7765 show_ip_bgp_community4_cmd,
7766 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7767 SHOW_STR
7768 IP_STR
7769 BGP_STR
7770 "Display routes matching the communities\n"
7771 "community number\n"
7772 "Do not send outside local AS (well-known community)\n"
7773 "Do not advertise to any peer (well-known community)\n"
7774 "Do not export to next AS (well-known community)\n"
7775 "community number\n"
7776 "Do not send outside local AS (well-known community)\n"
7777 "Do not advertise to any peer (well-known community)\n"
7778 "Do not export to next AS (well-known community)\n"
7779 "community number\n"
7780 "Do not send outside local AS (well-known community)\n"
7781 "Do not advertise to any peer (well-known community)\n"
7782 "Do not export to next AS (well-known community)\n"
7783 "community number\n"
7784 "Do not send outside local AS (well-known community)\n"
7785 "Do not advertise to any peer (well-known community)\n"
7786 "Do not export to next AS (well-known community)\n")
7787
7788DEFUN (show_ip_bgp_ipv4_community,
7789 show_ip_bgp_ipv4_community_cmd,
7790 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7791 SHOW_STR
7792 IP_STR
7793 BGP_STR
7794 "Address family\n"
7795 "Address Family modifier\n"
7796 "Address Family modifier\n"
7797 "Display routes matching the communities\n"
7798 "community number\n"
7799 "Do not send outside local AS (well-known community)\n"
7800 "Do not advertise to any peer (well-known community)\n"
7801 "Do not export to next AS (well-known community)\n")
7802{
7803 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04007804 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00007805
Michael Lambert95cbbd22010-07-23 14:43:04 -04007806 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007807}
7808
7809ALIAS (show_ip_bgp_ipv4_community,
7810 show_ip_bgp_ipv4_community2_cmd,
7811 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7812 SHOW_STR
7813 IP_STR
7814 BGP_STR
7815 "Address family\n"
7816 "Address Family modifier\n"
7817 "Address Family modifier\n"
7818 "Display routes matching the communities\n"
7819 "community number\n"
7820 "Do not send outside local AS (well-known community)\n"
7821 "Do not advertise to any peer (well-known community)\n"
7822 "Do not export to next AS (well-known community)\n"
7823 "community number\n"
7824 "Do not send outside local AS (well-known community)\n"
7825 "Do not advertise to any peer (well-known community)\n"
7826 "Do not export to next AS (well-known community)\n")
7827
7828ALIAS (show_ip_bgp_ipv4_community,
7829 show_ip_bgp_ipv4_community3_cmd,
7830 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7831 SHOW_STR
7832 IP_STR
7833 BGP_STR
7834 "Address family\n"
7835 "Address Family modifier\n"
7836 "Address Family modifier\n"
7837 "Display routes matching the communities\n"
7838 "community number\n"
7839 "Do not send outside local AS (well-known community)\n"
7840 "Do not advertise to any peer (well-known community)\n"
7841 "Do not export to next AS (well-known community)\n"
7842 "community number\n"
7843 "Do not send outside local AS (well-known community)\n"
7844 "Do not advertise to any peer (well-known community)\n"
7845 "Do not export to next AS (well-known community)\n"
7846 "community number\n"
7847 "Do not send outside local AS (well-known community)\n"
7848 "Do not advertise to any peer (well-known community)\n"
7849 "Do not export to next AS (well-known community)\n")
7850
7851ALIAS (show_ip_bgp_ipv4_community,
7852 show_ip_bgp_ipv4_community4_cmd,
7853 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7854 SHOW_STR
7855 IP_STR
7856 BGP_STR
7857 "Address family\n"
7858 "Address Family modifier\n"
7859 "Address Family modifier\n"
7860 "Display routes matching the communities\n"
7861 "community number\n"
7862 "Do not send outside local AS (well-known community)\n"
7863 "Do not advertise to any peer (well-known community)\n"
7864 "Do not export to next AS (well-known community)\n"
7865 "community number\n"
7866 "Do not send outside local AS (well-known community)\n"
7867 "Do not advertise to any peer (well-known community)\n"
7868 "Do not export to next AS (well-known community)\n"
7869 "community number\n"
7870 "Do not send outside local AS (well-known community)\n"
7871 "Do not advertise to any peer (well-known community)\n"
7872 "Do not export to next AS (well-known community)\n"
7873 "community number\n"
7874 "Do not send outside local AS (well-known community)\n"
7875 "Do not advertise to any peer (well-known community)\n"
7876 "Do not export to next AS (well-known community)\n")
7877
Michael Lambert95cbbd22010-07-23 14:43:04 -04007878DEFUN (show_bgp_view_afi_safi_community_all,
7879 show_bgp_view_afi_safi_community_all_cmd,
7880#ifdef HAVE_IPV6
7881 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
7882#else
7883 "show bgp view WORD ipv4 (unicast|multicast) community",
7884#endif
7885 SHOW_STR
7886 BGP_STR
7887 "BGP view\n"
7888 "BGP view name\n"
7889 "Address family\n"
7890#ifdef HAVE_IPV6
7891 "Address family\n"
7892#endif
7893 "Address Family modifier\n"
7894 "Address Family modifier\n"
7895 "Display routes containing communities\n")
7896{
7897 int afi;
7898 int safi;
7899 struct bgp *bgp;
7900
7901 /* BGP structure lookup. */
7902 bgp = bgp_lookup_by_name (argv[0]);
7903 if (bgp == NULL)
7904 {
7905 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7906 return CMD_WARNING;
7907 }
7908
7909#ifdef HAVE_IPV6
7910 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7911 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7912#else
7913 afi = AFI_IP;
7914 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7915#endif
7916 return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
7917}
7918
7919DEFUN (show_bgp_view_afi_safi_community,
7920 show_bgp_view_afi_safi_community_cmd,
7921#ifdef HAVE_IPV6
7922 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7923#else
7924 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7925#endif
7926 SHOW_STR
7927 BGP_STR
7928 "BGP view\n"
7929 "BGP view name\n"
7930 "Address family\n"
7931#ifdef HAVE_IPV6
7932 "Address family\n"
7933#endif
7934 "Address family modifier\n"
7935 "Address family modifier\n"
7936 "Display routes matching the communities\n"
7937 "community number\n"
7938 "Do not send outside local AS (well-known community)\n"
7939 "Do not advertise to any peer (well-known community)\n"
7940 "Do not export to next AS (well-known community)\n")
7941{
7942 int afi;
7943 int safi;
7944
7945#ifdef HAVE_IPV6
7946 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7947 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7948 return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
7949#else
7950 afi = AFI_IP;
7951 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7952 return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
7953#endif
7954}
7955
7956ALIAS (show_bgp_view_afi_safi_community,
7957 show_bgp_view_afi_safi_community2_cmd,
7958#ifdef HAVE_IPV6
7959 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7960#else
7961 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7962#endif
7963 SHOW_STR
7964 BGP_STR
7965 "BGP view\n"
7966 "BGP view name\n"
7967 "Address family\n"
7968#ifdef HAVE_IPV6
7969 "Address family\n"
7970#endif
7971 "Address family modifier\n"
7972 "Address family modifier\n"
7973 "Display routes matching the communities\n"
7974 "community number\n"
7975 "Do not send outside local AS (well-known community)\n"
7976 "Do not advertise to any peer (well-known community)\n"
7977 "Do not export to next AS (well-known community)\n"
7978 "community number\n"
7979 "Do not send outside local AS (well-known community)\n"
7980 "Do not advertise to any peer (well-known community)\n"
7981 "Do not export to next AS (well-known community)\n")
7982
7983ALIAS (show_bgp_view_afi_safi_community,
7984 show_bgp_view_afi_safi_community3_cmd,
7985#ifdef HAVE_IPV6
7986 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7987#else
7988 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7989#endif
7990 SHOW_STR
7991 BGP_STR
7992 "BGP view\n"
7993 "BGP view name\n"
7994 "Address family\n"
7995#ifdef HAVE_IPV6
7996 "Address family\n"
7997#endif
7998 "Address family modifier\n"
7999 "Address family modifier\n"
8000 "Display routes matching the communities\n"
8001 "community number\n"
8002 "Do not send outside local AS (well-known community)\n"
8003 "Do not advertise to any peer (well-known community)\n"
8004 "Do not export to next AS (well-known community)\n"
8005 "community number\n"
8006 "Do not send outside local AS (well-known community)\n"
8007 "Do not advertise to any peer (well-known community)\n"
8008 "Do not export to next AS (well-known community)\n"
8009 "community number\n"
8010 "Do not send outside local AS (well-known community)\n"
8011 "Do not advertise to any peer (well-known community)\n"
8012 "Do not export to next AS (well-known community)\n")
8013
8014ALIAS (show_bgp_view_afi_safi_community,
8015 show_bgp_view_afi_safi_community4_cmd,
8016#ifdef HAVE_IPV6
8017 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8018#else
8019 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8020#endif
8021 SHOW_STR
8022 BGP_STR
8023 "BGP view\n"
8024 "BGP view name\n"
8025 "Address family\n"
8026#ifdef HAVE_IPV6
8027 "Address family\n"
8028#endif
8029 "Address family modifier\n"
8030 "Address family modifier\n"
8031 "Display routes matching the communities\n"
8032 "community number\n"
8033 "Do not send outside local AS (well-known community)\n"
8034 "Do not advertise to any peer (well-known community)\n"
8035 "Do not export to next AS (well-known community)\n"
8036 "community number\n"
8037 "Do not send outside local AS (well-known community)\n"
8038 "Do not advertise to any peer (well-known community)\n"
8039 "Do not export to next AS (well-known community)\n"
8040 "community number\n"
8041 "Do not send outside local AS (well-known community)\n"
8042 "Do not advertise to any peer (well-known community)\n"
8043 "Do not export to next AS (well-known community)\n"
8044 "community number\n"
8045 "Do not send outside local AS (well-known community)\n"
8046 "Do not advertise to any peer (well-known community)\n"
8047 "Do not export to next AS (well-known community)\n")
8048
paul718e3742002-12-13 20:15:29 +00008049DEFUN (show_ip_bgp_community_exact,
8050 show_ip_bgp_community_exact_cmd,
8051 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8052 SHOW_STR
8053 IP_STR
8054 BGP_STR
8055 "Display routes matching the communities\n"
8056 "community number\n"
8057 "Do not send outside local AS (well-known community)\n"
8058 "Do not advertise to any peer (well-known community)\n"
8059 "Do not export to next AS (well-known community)\n"
8060 "Exact match of the communities")
8061{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008062 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008063}
8064
8065ALIAS (show_ip_bgp_community_exact,
8066 show_ip_bgp_community2_exact_cmd,
8067 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8068 SHOW_STR
8069 IP_STR
8070 BGP_STR
8071 "Display routes matching the communities\n"
8072 "community number\n"
8073 "Do not send outside local AS (well-known community)\n"
8074 "Do not advertise to any peer (well-known community)\n"
8075 "Do not export to next AS (well-known community)\n"
8076 "community number\n"
8077 "Do not send outside local AS (well-known community)\n"
8078 "Do not advertise to any peer (well-known community)\n"
8079 "Do not export to next AS (well-known community)\n"
8080 "Exact match of the communities")
8081
8082ALIAS (show_ip_bgp_community_exact,
8083 show_ip_bgp_community3_exact_cmd,
8084 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8085 SHOW_STR
8086 IP_STR
8087 BGP_STR
8088 "Display routes matching the communities\n"
8089 "community number\n"
8090 "Do not send outside local AS (well-known community)\n"
8091 "Do not advertise to any peer (well-known community)\n"
8092 "Do not export to next AS (well-known community)\n"
8093 "community number\n"
8094 "Do not send outside local AS (well-known community)\n"
8095 "Do not advertise to any peer (well-known community)\n"
8096 "Do not export to next AS (well-known community)\n"
8097 "community number\n"
8098 "Do not send outside local AS (well-known community)\n"
8099 "Do not advertise to any peer (well-known community)\n"
8100 "Do not export to next AS (well-known community)\n"
8101 "Exact match of the communities")
8102
8103ALIAS (show_ip_bgp_community_exact,
8104 show_ip_bgp_community4_exact_cmd,
8105 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8106 SHOW_STR
8107 IP_STR
8108 BGP_STR
8109 "Display routes matching the communities\n"
8110 "community number\n"
8111 "Do not send outside local AS (well-known community)\n"
8112 "Do not advertise to any peer (well-known community)\n"
8113 "Do not export to next AS (well-known community)\n"
8114 "community number\n"
8115 "Do not send outside local AS (well-known community)\n"
8116 "Do not advertise to any peer (well-known community)\n"
8117 "Do not export to next AS (well-known community)\n"
8118 "community number\n"
8119 "Do not send outside local AS (well-known community)\n"
8120 "Do not advertise to any peer (well-known community)\n"
8121 "Do not export to next AS (well-known community)\n"
8122 "community number\n"
8123 "Do not send outside local AS (well-known community)\n"
8124 "Do not advertise to any peer (well-known community)\n"
8125 "Do not export to next AS (well-known community)\n"
8126 "Exact match of the communities")
8127
8128DEFUN (show_ip_bgp_ipv4_community_exact,
8129 show_ip_bgp_ipv4_community_exact_cmd,
8130 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8131 SHOW_STR
8132 IP_STR
8133 BGP_STR
8134 "Address family\n"
8135 "Address Family modifier\n"
8136 "Address Family modifier\n"
8137 "Display routes matching the communities\n"
8138 "community number\n"
8139 "Do not send outside local AS (well-known community)\n"
8140 "Do not advertise to any peer (well-known community)\n"
8141 "Do not export to next AS (well-known community)\n"
8142 "Exact match of the communities")
8143{
8144 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04008145 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008146
Michael Lambert95cbbd22010-07-23 14:43:04 -04008147 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008148}
8149
8150ALIAS (show_ip_bgp_ipv4_community_exact,
8151 show_ip_bgp_ipv4_community2_exact_cmd,
8152 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8153 SHOW_STR
8154 IP_STR
8155 BGP_STR
8156 "Address family\n"
8157 "Address Family modifier\n"
8158 "Address Family modifier\n"
8159 "Display routes matching the communities\n"
8160 "community number\n"
8161 "Do not send outside local AS (well-known community)\n"
8162 "Do not advertise to any peer (well-known community)\n"
8163 "Do not export to next AS (well-known community)\n"
8164 "community number\n"
8165 "Do not send outside local AS (well-known community)\n"
8166 "Do not advertise to any peer (well-known community)\n"
8167 "Do not export to next AS (well-known community)\n"
8168 "Exact match of the communities")
8169
8170ALIAS (show_ip_bgp_ipv4_community_exact,
8171 show_ip_bgp_ipv4_community3_exact_cmd,
8172 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8173 SHOW_STR
8174 IP_STR
8175 BGP_STR
8176 "Address family\n"
8177 "Address Family modifier\n"
8178 "Address Family modifier\n"
8179 "Display routes matching the communities\n"
8180 "community number\n"
8181 "Do not send outside local AS (well-known community)\n"
8182 "Do not advertise to any peer (well-known community)\n"
8183 "Do not export to next AS (well-known community)\n"
8184 "community number\n"
8185 "Do not send outside local AS (well-known community)\n"
8186 "Do not advertise to any peer (well-known community)\n"
8187 "Do not export to next AS (well-known community)\n"
8188 "community number\n"
8189 "Do not send outside local AS (well-known community)\n"
8190 "Do not advertise to any peer (well-known community)\n"
8191 "Do not export to next AS (well-known community)\n"
8192 "Exact match of the communities")
8193
8194ALIAS (show_ip_bgp_ipv4_community_exact,
8195 show_ip_bgp_ipv4_community4_exact_cmd,
8196 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8197 SHOW_STR
8198 IP_STR
8199 BGP_STR
8200 "Address family\n"
8201 "Address Family modifier\n"
8202 "Address Family modifier\n"
8203 "Display routes matching the communities\n"
8204 "community number\n"
8205 "Do not send outside local AS (well-known community)\n"
8206 "Do not advertise to any peer (well-known community)\n"
8207 "Do not export to next AS (well-known community)\n"
8208 "community number\n"
8209 "Do not send outside local AS (well-known community)\n"
8210 "Do not advertise to any peer (well-known community)\n"
8211 "Do not export to next AS (well-known community)\n"
8212 "community number\n"
8213 "Do not send outside local AS (well-known community)\n"
8214 "Do not advertise to any peer (well-known community)\n"
8215 "Do not export to next AS (well-known community)\n"
8216 "community number\n"
8217 "Do not send outside local AS (well-known community)\n"
8218 "Do not advertise to any peer (well-known community)\n"
8219 "Do not export to next AS (well-known community)\n"
8220 "Exact match of the communities")
8221
8222#ifdef HAVE_IPV6
8223DEFUN (show_bgp_community,
8224 show_bgp_community_cmd,
8225 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
8226 SHOW_STR
8227 BGP_STR
8228 "Display routes matching the communities\n"
8229 "community number\n"
8230 "Do not send outside local AS (well-known community)\n"
8231 "Do not advertise to any peer (well-known community)\n"
8232 "Do not export to next AS (well-known community)\n")
8233{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008234 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008235}
8236
8237ALIAS (show_bgp_community,
8238 show_bgp_ipv6_community_cmd,
8239 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
8240 SHOW_STR
8241 BGP_STR
8242 "Address family\n"
8243 "Display routes matching the communities\n"
8244 "community number\n"
8245 "Do not send outside local AS (well-known community)\n"
8246 "Do not advertise to any peer (well-known community)\n"
8247 "Do not export to next AS (well-known community)\n")
8248
8249ALIAS (show_bgp_community,
8250 show_bgp_community2_cmd,
8251 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8252 SHOW_STR
8253 BGP_STR
8254 "Display routes matching the communities\n"
8255 "community number\n"
8256 "Do not send outside local AS (well-known community)\n"
8257 "Do not advertise to any peer (well-known community)\n"
8258 "Do not export to next AS (well-known community)\n"
8259 "community number\n"
8260 "Do not send outside local AS (well-known community)\n"
8261 "Do not advertise to any peer (well-known community)\n"
8262 "Do not export to next AS (well-known community)\n")
8263
8264ALIAS (show_bgp_community,
8265 show_bgp_ipv6_community2_cmd,
8266 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8267 SHOW_STR
8268 BGP_STR
8269 "Address family\n"
8270 "Display routes matching the communities\n"
8271 "community number\n"
8272 "Do not send outside local AS (well-known community)\n"
8273 "Do not advertise to any peer (well-known community)\n"
8274 "Do not export to next AS (well-known community)\n"
8275 "community number\n"
8276 "Do not send outside local AS (well-known community)\n"
8277 "Do not advertise to any peer (well-known community)\n"
8278 "Do not export to next AS (well-known community)\n")
8279
8280ALIAS (show_bgp_community,
8281 show_bgp_community3_cmd,
8282 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8283 SHOW_STR
8284 BGP_STR
8285 "Display routes matching the communities\n"
8286 "community number\n"
8287 "Do not send outside local AS (well-known community)\n"
8288 "Do not advertise to any peer (well-known community)\n"
8289 "Do not export to next AS (well-known community)\n"
8290 "community number\n"
8291 "Do not send outside local AS (well-known community)\n"
8292 "Do not advertise to any peer (well-known community)\n"
8293 "Do not export to next AS (well-known community)\n"
8294 "community number\n"
8295 "Do not send outside local AS (well-known community)\n"
8296 "Do not advertise to any peer (well-known community)\n"
8297 "Do not export to next AS (well-known community)\n")
8298
8299ALIAS (show_bgp_community,
8300 show_bgp_ipv6_community3_cmd,
8301 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8302 SHOW_STR
8303 BGP_STR
8304 "Address family\n"
8305 "Display routes matching the communities\n"
8306 "community number\n"
8307 "Do not send outside local AS (well-known community)\n"
8308 "Do not advertise to any peer (well-known community)\n"
8309 "Do not export to next AS (well-known community)\n"
8310 "community number\n"
8311 "Do not send outside local AS (well-known community)\n"
8312 "Do not advertise to any peer (well-known community)\n"
8313 "Do not export to next AS (well-known community)\n"
8314 "community number\n"
8315 "Do not send outside local AS (well-known community)\n"
8316 "Do not advertise to any peer (well-known community)\n"
8317 "Do not export to next AS (well-known community)\n")
8318
8319ALIAS (show_bgp_community,
8320 show_bgp_community4_cmd,
8321 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8322 SHOW_STR
8323 BGP_STR
8324 "Display routes matching the communities\n"
8325 "community number\n"
8326 "Do not send outside local AS (well-known community)\n"
8327 "Do not advertise to any peer (well-known community)\n"
8328 "Do not export to next AS (well-known community)\n"
8329 "community number\n"
8330 "Do not send outside local AS (well-known community)\n"
8331 "Do not advertise to any peer (well-known community)\n"
8332 "Do not export to next AS (well-known community)\n"
8333 "community number\n"
8334 "Do not send outside local AS (well-known community)\n"
8335 "Do not advertise to any peer (well-known community)\n"
8336 "Do not export to next AS (well-known community)\n"
8337 "community number\n"
8338 "Do not send outside local AS (well-known community)\n"
8339 "Do not advertise to any peer (well-known community)\n"
8340 "Do not export to next AS (well-known community)\n")
8341
8342ALIAS (show_bgp_community,
8343 show_bgp_ipv6_community4_cmd,
8344 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8345 SHOW_STR
8346 BGP_STR
8347 "Address family\n"
8348 "Display routes matching the communities\n"
8349 "community number\n"
8350 "Do not send outside local AS (well-known community)\n"
8351 "Do not advertise to any peer (well-known community)\n"
8352 "Do not export to next AS (well-known community)\n"
8353 "community number\n"
8354 "Do not send outside local AS (well-known community)\n"
8355 "Do not advertise to any peer (well-known community)\n"
8356 "Do not export to next AS (well-known community)\n"
8357 "community number\n"
8358 "Do not send outside local AS (well-known community)\n"
8359 "Do not advertise to any peer (well-known community)\n"
8360 "Do not export to next AS (well-known community)\n"
8361 "community number\n"
8362 "Do not send outside local AS (well-known community)\n"
8363 "Do not advertise to any peer (well-known community)\n"
8364 "Do not export to next AS (well-known community)\n")
8365
8366/* old command */
8367DEFUN (show_ipv6_bgp_community,
8368 show_ipv6_bgp_community_cmd,
8369 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8370 SHOW_STR
8371 IPV6_STR
8372 BGP_STR
8373 "Display routes matching the communities\n"
8374 "community number\n"
8375 "Do not send outside local AS (well-known community)\n"
8376 "Do not advertise to any peer (well-known community)\n"
8377 "Do not export to next AS (well-known community)\n")
8378{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008379 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008380}
8381
8382/* old command */
8383ALIAS (show_ipv6_bgp_community,
8384 show_ipv6_bgp_community2_cmd,
8385 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8386 SHOW_STR
8387 IPV6_STR
8388 BGP_STR
8389 "Display routes matching the communities\n"
8390 "community number\n"
8391 "Do not send outside local AS (well-known community)\n"
8392 "Do not advertise to any peer (well-known community)\n"
8393 "Do not export to next AS (well-known community)\n"
8394 "community number\n"
8395 "Do not send outside local AS (well-known community)\n"
8396 "Do not advertise to any peer (well-known community)\n"
8397 "Do not export to next AS (well-known community)\n")
8398
8399/* old command */
8400ALIAS (show_ipv6_bgp_community,
8401 show_ipv6_bgp_community3_cmd,
8402 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8403 SHOW_STR
8404 IPV6_STR
8405 BGP_STR
8406 "Display routes matching the communities\n"
8407 "community number\n"
8408 "Do not send outside local AS (well-known community)\n"
8409 "Do not advertise to any peer (well-known community)\n"
8410 "Do not export to next AS (well-known community)\n"
8411 "community number\n"
8412 "Do not send outside local AS (well-known community)\n"
8413 "Do not advertise to any peer (well-known community)\n"
8414 "Do not export to next AS (well-known community)\n"
8415 "community number\n"
8416 "Do not send outside local AS (well-known community)\n"
8417 "Do not advertise to any peer (well-known community)\n"
8418 "Do not export to next AS (well-known community)\n")
8419
8420/* old command */
8421ALIAS (show_ipv6_bgp_community,
8422 show_ipv6_bgp_community4_cmd,
8423 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8424 SHOW_STR
8425 IPV6_STR
8426 BGP_STR
8427 "Display routes matching the communities\n"
8428 "community number\n"
8429 "Do not send outside local AS (well-known community)\n"
8430 "Do not advertise to any peer (well-known community)\n"
8431 "Do not export to next AS (well-known community)\n"
8432 "community number\n"
8433 "Do not send outside local AS (well-known community)\n"
8434 "Do not advertise to any peer (well-known community)\n"
8435 "Do not export to next AS (well-known community)\n"
8436 "community number\n"
8437 "Do not send outside local AS (well-known community)\n"
8438 "Do not advertise to any peer (well-known community)\n"
8439 "Do not export to next AS (well-known community)\n"
8440 "community number\n"
8441 "Do not send outside local AS (well-known community)\n"
8442 "Do not advertise to any peer (well-known community)\n"
8443 "Do not export to next AS (well-known community)\n")
8444
8445DEFUN (show_bgp_community_exact,
8446 show_bgp_community_exact_cmd,
8447 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8448 SHOW_STR
8449 BGP_STR
8450 "Display routes matching the communities\n"
8451 "community number\n"
8452 "Do not send outside local AS (well-known community)\n"
8453 "Do not advertise to any peer (well-known community)\n"
8454 "Do not export to next AS (well-known community)\n"
8455 "Exact match of the communities")
8456{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008457 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008458}
8459
8460ALIAS (show_bgp_community_exact,
8461 show_bgp_ipv6_community_exact_cmd,
8462 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8463 SHOW_STR
8464 BGP_STR
8465 "Address family\n"
8466 "Display routes matching the communities\n"
8467 "community number\n"
8468 "Do not send outside local AS (well-known community)\n"
8469 "Do not advertise to any peer (well-known community)\n"
8470 "Do not export to next AS (well-known community)\n"
8471 "Exact match of the communities")
8472
8473ALIAS (show_bgp_community_exact,
8474 show_bgp_community2_exact_cmd,
8475 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8476 SHOW_STR
8477 BGP_STR
8478 "Display routes matching the communities\n"
8479 "community number\n"
8480 "Do not send outside local AS (well-known community)\n"
8481 "Do not advertise to any peer (well-known community)\n"
8482 "Do not export to next AS (well-known community)\n"
8483 "community number\n"
8484 "Do not send outside local AS (well-known community)\n"
8485 "Do not advertise to any peer (well-known community)\n"
8486 "Do not export to next AS (well-known community)\n"
8487 "Exact match of the communities")
8488
8489ALIAS (show_bgp_community_exact,
8490 show_bgp_ipv6_community2_exact_cmd,
8491 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8492 SHOW_STR
8493 BGP_STR
8494 "Address family\n"
8495 "Display routes matching the communities\n"
8496 "community number\n"
8497 "Do not send outside local AS (well-known community)\n"
8498 "Do not advertise to any peer (well-known community)\n"
8499 "Do not export to next AS (well-known community)\n"
8500 "community number\n"
8501 "Do not send outside local AS (well-known community)\n"
8502 "Do not advertise to any peer (well-known community)\n"
8503 "Do not export to next AS (well-known community)\n"
8504 "Exact match of the communities")
8505
8506ALIAS (show_bgp_community_exact,
8507 show_bgp_community3_exact_cmd,
8508 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8509 SHOW_STR
8510 BGP_STR
8511 "Display routes matching the communities\n"
8512 "community number\n"
8513 "Do not send outside local AS (well-known community)\n"
8514 "Do not advertise to any peer (well-known community)\n"
8515 "Do not export to next AS (well-known community)\n"
8516 "community number\n"
8517 "Do not send outside local AS (well-known community)\n"
8518 "Do not advertise to any peer (well-known community)\n"
8519 "Do not export to next AS (well-known community)\n"
8520 "community number\n"
8521 "Do not send outside local AS (well-known community)\n"
8522 "Do not advertise to any peer (well-known community)\n"
8523 "Do not export to next AS (well-known community)\n"
8524 "Exact match of the communities")
8525
8526ALIAS (show_bgp_community_exact,
8527 show_bgp_ipv6_community3_exact_cmd,
8528 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8529 SHOW_STR
8530 BGP_STR
8531 "Address family\n"
8532 "Display routes matching the communities\n"
8533 "community number\n"
8534 "Do not send outside local AS (well-known community)\n"
8535 "Do not advertise to any peer (well-known community)\n"
8536 "Do not export to next AS (well-known community)\n"
8537 "community number\n"
8538 "Do not send outside local AS (well-known community)\n"
8539 "Do not advertise to any peer (well-known community)\n"
8540 "Do not export to next AS (well-known community)\n"
8541 "community number\n"
8542 "Do not send outside local AS (well-known community)\n"
8543 "Do not advertise to any peer (well-known community)\n"
8544 "Do not export to next AS (well-known community)\n"
8545 "Exact match of the communities")
8546
8547ALIAS (show_bgp_community_exact,
8548 show_bgp_community4_exact_cmd,
8549 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8550 SHOW_STR
8551 BGP_STR
8552 "Display routes matching the communities\n"
8553 "community number\n"
8554 "Do not send outside local AS (well-known community)\n"
8555 "Do not advertise to any peer (well-known community)\n"
8556 "Do not export to next AS (well-known community)\n"
8557 "community number\n"
8558 "Do not send outside local AS (well-known community)\n"
8559 "Do not advertise to any peer (well-known community)\n"
8560 "Do not export to next AS (well-known community)\n"
8561 "community number\n"
8562 "Do not send outside local AS (well-known community)\n"
8563 "Do not advertise to any peer (well-known community)\n"
8564 "Do not export to next AS (well-known community)\n"
8565 "community number\n"
8566 "Do not send outside local AS (well-known community)\n"
8567 "Do not advertise to any peer (well-known community)\n"
8568 "Do not export to next AS (well-known community)\n"
8569 "Exact match of the communities")
8570
8571ALIAS (show_bgp_community_exact,
8572 show_bgp_ipv6_community4_exact_cmd,
8573 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8574 SHOW_STR
8575 BGP_STR
8576 "Address family\n"
8577 "Display routes matching the communities\n"
8578 "community number\n"
8579 "Do not send outside local AS (well-known community)\n"
8580 "Do not advertise to any peer (well-known community)\n"
8581 "Do not export to next AS (well-known community)\n"
8582 "community number\n"
8583 "Do not send outside local AS (well-known community)\n"
8584 "Do not advertise to any peer (well-known community)\n"
8585 "Do not export to next AS (well-known community)\n"
8586 "community number\n"
8587 "Do not send outside local AS (well-known community)\n"
8588 "Do not advertise to any peer (well-known community)\n"
8589 "Do not export to next AS (well-known community)\n"
8590 "community number\n"
8591 "Do not send outside local AS (well-known community)\n"
8592 "Do not advertise to any peer (well-known community)\n"
8593 "Do not export to next AS (well-known community)\n"
8594 "Exact match of the communities")
8595
8596/* old command */
8597DEFUN (show_ipv6_bgp_community_exact,
8598 show_ipv6_bgp_community_exact_cmd,
8599 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8600 SHOW_STR
8601 IPV6_STR
8602 BGP_STR
8603 "Display routes matching the communities\n"
8604 "community number\n"
8605 "Do not send outside local AS (well-known community)\n"
8606 "Do not advertise to any peer (well-known community)\n"
8607 "Do not export to next AS (well-known community)\n"
8608 "Exact match of the communities")
8609{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008610 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008611}
8612
8613/* old command */
8614ALIAS (show_ipv6_bgp_community_exact,
8615 show_ipv6_bgp_community2_exact_cmd,
8616 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8617 SHOW_STR
8618 IPV6_STR
8619 BGP_STR
8620 "Display routes matching the communities\n"
8621 "community number\n"
8622 "Do not send outside local AS (well-known community)\n"
8623 "Do not advertise to any peer (well-known community)\n"
8624 "Do not export to next AS (well-known community)\n"
8625 "community number\n"
8626 "Do not send outside local AS (well-known community)\n"
8627 "Do not advertise to any peer (well-known community)\n"
8628 "Do not export to next AS (well-known community)\n"
8629 "Exact match of the communities")
8630
8631/* old command */
8632ALIAS (show_ipv6_bgp_community_exact,
8633 show_ipv6_bgp_community3_exact_cmd,
8634 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8635 SHOW_STR
8636 IPV6_STR
8637 BGP_STR
8638 "Display routes matching the communities\n"
8639 "community number\n"
8640 "Do not send outside local AS (well-known community)\n"
8641 "Do not advertise to any peer (well-known community)\n"
8642 "Do not export to next AS (well-known community)\n"
8643 "community number\n"
8644 "Do not send outside local AS (well-known community)\n"
8645 "Do not advertise to any peer (well-known community)\n"
8646 "Do not export to next AS (well-known community)\n"
8647 "community number\n"
8648 "Do not send outside local AS (well-known community)\n"
8649 "Do not advertise to any peer (well-known community)\n"
8650 "Do not export to next AS (well-known community)\n"
8651 "Exact match of the communities")
8652
8653/* old command */
8654ALIAS (show_ipv6_bgp_community_exact,
8655 show_ipv6_bgp_community4_exact_cmd,
8656 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8657 SHOW_STR
8658 IPV6_STR
8659 BGP_STR
8660 "Display routes matching the communities\n"
8661 "community number\n"
8662 "Do not send outside local AS (well-known community)\n"
8663 "Do not advertise to any peer (well-known community)\n"
8664 "Do not export to next AS (well-known community)\n"
8665 "community number\n"
8666 "Do not send outside local AS (well-known community)\n"
8667 "Do not advertise to any peer (well-known community)\n"
8668 "Do not export to next AS (well-known community)\n"
8669 "community number\n"
8670 "Do not send outside local AS (well-known community)\n"
8671 "Do not advertise to any peer (well-known community)\n"
8672 "Do not export to next AS (well-known community)\n"
8673 "community number\n"
8674 "Do not send outside local AS (well-known community)\n"
8675 "Do not advertise to any peer (well-known community)\n"
8676 "Do not export to next AS (well-known community)\n"
8677 "Exact match of the communities")
8678
8679/* old command */
8680DEFUN (show_ipv6_mbgp_community,
8681 show_ipv6_mbgp_community_cmd,
8682 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8683 SHOW_STR
8684 IPV6_STR
8685 MBGP_STR
8686 "Display routes matching the communities\n"
8687 "community number\n"
8688 "Do not send outside local AS (well-known community)\n"
8689 "Do not advertise to any peer (well-known community)\n"
8690 "Do not export to next AS (well-known community)\n")
8691{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008692 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008693}
8694
8695/* old command */
8696ALIAS (show_ipv6_mbgp_community,
8697 show_ipv6_mbgp_community2_cmd,
8698 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8699 SHOW_STR
8700 IPV6_STR
8701 MBGP_STR
8702 "Display routes matching the communities\n"
8703 "community number\n"
8704 "Do not send outside local AS (well-known community)\n"
8705 "Do not advertise to any peer (well-known community)\n"
8706 "Do not export to next AS (well-known community)\n"
8707 "community number\n"
8708 "Do not send outside local AS (well-known community)\n"
8709 "Do not advertise to any peer (well-known community)\n"
8710 "Do not export to next AS (well-known community)\n")
8711
8712/* old command */
8713ALIAS (show_ipv6_mbgp_community,
8714 show_ipv6_mbgp_community3_cmd,
8715 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8716 SHOW_STR
8717 IPV6_STR
8718 MBGP_STR
8719 "Display routes matching the communities\n"
8720 "community number\n"
8721 "Do not send outside local AS (well-known community)\n"
8722 "Do not advertise to any peer (well-known community)\n"
8723 "Do not export to next AS (well-known community)\n"
8724 "community number\n"
8725 "Do not send outside local AS (well-known community)\n"
8726 "Do not advertise to any peer (well-known community)\n"
8727 "Do not export to next AS (well-known community)\n"
8728 "community number\n"
8729 "Do not send outside local AS (well-known community)\n"
8730 "Do not advertise to any peer (well-known community)\n"
8731 "Do not export to next AS (well-known community)\n")
8732
8733/* old command */
8734ALIAS (show_ipv6_mbgp_community,
8735 show_ipv6_mbgp_community4_cmd,
8736 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8737 SHOW_STR
8738 IPV6_STR
8739 MBGP_STR
8740 "Display routes matching the communities\n"
8741 "community number\n"
8742 "Do not send outside local AS (well-known community)\n"
8743 "Do not advertise to any peer (well-known community)\n"
8744 "Do not export to next AS (well-known community)\n"
8745 "community number\n"
8746 "Do not send outside local AS (well-known community)\n"
8747 "Do not advertise to any peer (well-known community)\n"
8748 "Do not export to next AS (well-known community)\n"
8749 "community number\n"
8750 "Do not send outside local AS (well-known community)\n"
8751 "Do not advertise to any peer (well-known community)\n"
8752 "Do not export to next AS (well-known community)\n"
8753 "community number\n"
8754 "Do not send outside local AS (well-known community)\n"
8755 "Do not advertise to any peer (well-known community)\n"
8756 "Do not export to next AS (well-known community)\n")
8757
8758/* old command */
8759DEFUN (show_ipv6_mbgp_community_exact,
8760 show_ipv6_mbgp_community_exact_cmd,
8761 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8762 SHOW_STR
8763 IPV6_STR
8764 MBGP_STR
8765 "Display routes matching the communities\n"
8766 "community number\n"
8767 "Do not send outside local AS (well-known community)\n"
8768 "Do not advertise to any peer (well-known community)\n"
8769 "Do not export to next AS (well-known community)\n"
8770 "Exact match of the communities")
8771{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008772 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008773}
8774
8775/* old command */
8776ALIAS (show_ipv6_mbgp_community_exact,
8777 show_ipv6_mbgp_community2_exact_cmd,
8778 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8779 SHOW_STR
8780 IPV6_STR
8781 MBGP_STR
8782 "Display routes matching the communities\n"
8783 "community number\n"
8784 "Do not send outside local AS (well-known community)\n"
8785 "Do not advertise to any peer (well-known community)\n"
8786 "Do not export to next AS (well-known community)\n"
8787 "community number\n"
8788 "Do not send outside local AS (well-known community)\n"
8789 "Do not advertise to any peer (well-known community)\n"
8790 "Do not export to next AS (well-known community)\n"
8791 "Exact match of the communities")
8792
8793/* old command */
8794ALIAS (show_ipv6_mbgp_community_exact,
8795 show_ipv6_mbgp_community3_exact_cmd,
8796 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8797 SHOW_STR
8798 IPV6_STR
8799 MBGP_STR
8800 "Display routes matching the communities\n"
8801 "community number\n"
8802 "Do not send outside local AS (well-known community)\n"
8803 "Do not advertise to any peer (well-known community)\n"
8804 "Do not export to next AS (well-known community)\n"
8805 "community number\n"
8806 "Do not send outside local AS (well-known community)\n"
8807 "Do not advertise to any peer (well-known community)\n"
8808 "Do not export to next AS (well-known community)\n"
8809 "community number\n"
8810 "Do not send outside local AS (well-known community)\n"
8811 "Do not advertise to any peer (well-known community)\n"
8812 "Do not export to next AS (well-known community)\n"
8813 "Exact match of the communities")
8814
8815/* old command */
8816ALIAS (show_ipv6_mbgp_community_exact,
8817 show_ipv6_mbgp_community4_exact_cmd,
8818 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8819 SHOW_STR
8820 IPV6_STR
8821 MBGP_STR
8822 "Display routes matching the communities\n"
8823 "community number\n"
8824 "Do not send outside local AS (well-known community)\n"
8825 "Do not advertise to any peer (well-known community)\n"
8826 "Do not export to next AS (well-known community)\n"
8827 "community number\n"
8828 "Do not send outside local AS (well-known community)\n"
8829 "Do not advertise to any peer (well-known community)\n"
8830 "Do not export to next AS (well-known community)\n"
8831 "community number\n"
8832 "Do not send outside local AS (well-known community)\n"
8833 "Do not advertise to any peer (well-known community)\n"
8834 "Do not export to next AS (well-known community)\n"
8835 "community number\n"
8836 "Do not send outside local AS (well-known community)\n"
8837 "Do not advertise to any peer (well-known community)\n"
8838 "Do not export to next AS (well-known community)\n"
8839 "Exact match of the communities")
8840#endif /* HAVE_IPV6 */
8841
paul94f2b392005-06-28 12:44:16 +00008842static int
paulfd79ac92004-10-13 05:06:08 +00008843bgp_show_community_list (struct vty *vty, const char *com, int exact,
Michael Lambert4c9641b2010-07-22 13:20:55 -04008844 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00008845{
8846 struct community_list *list;
8847
hassofee6e4e2005-02-02 16:29:31 +00008848 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
paul718e3742002-12-13 20:15:29 +00008849 if (list == NULL)
8850 {
8851 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8852 VTY_NEWLINE);
8853 return CMD_WARNING;
8854 }
8855
ajs5a646652004-11-05 01:25:55 +00008856 return bgp_show (vty, NULL, afi, safi,
8857 (exact ? bgp_show_type_community_list_exact :
8858 bgp_show_type_community_list), list);
paul718e3742002-12-13 20:15:29 +00008859}
8860
8861DEFUN (show_ip_bgp_community_list,
8862 show_ip_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008863 "show ip bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008864 SHOW_STR
8865 IP_STR
8866 BGP_STR
8867 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008868 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008869 "community-list name\n")
8870{
8871 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8872}
8873
8874DEFUN (show_ip_bgp_ipv4_community_list,
8875 show_ip_bgp_ipv4_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008876 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008877 SHOW_STR
8878 IP_STR
8879 BGP_STR
8880 "Address family\n"
8881 "Address Family modifier\n"
8882 "Address Family modifier\n"
8883 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008884 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008885 "community-list name\n")
8886{
8887 if (strncmp (argv[0], "m", 1) == 0)
8888 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8889
8890 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8891}
8892
8893DEFUN (show_ip_bgp_community_list_exact,
8894 show_ip_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008895 "show ip bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008896 SHOW_STR
8897 IP_STR
8898 BGP_STR
8899 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008900 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008901 "community-list name\n"
8902 "Exact match of the communities\n")
8903{
8904 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8905}
8906
8907DEFUN (show_ip_bgp_ipv4_community_list_exact,
8908 show_ip_bgp_ipv4_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008909 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008910 SHOW_STR
8911 IP_STR
8912 BGP_STR
8913 "Address family\n"
8914 "Address Family modifier\n"
8915 "Address Family modifier\n"
8916 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008917 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008918 "community-list name\n"
8919 "Exact match of the communities\n")
8920{
8921 if (strncmp (argv[0], "m", 1) == 0)
8922 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8923
8924 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8925}
8926
8927#ifdef HAVE_IPV6
8928DEFUN (show_bgp_community_list,
8929 show_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008930 "show bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008931 SHOW_STR
8932 BGP_STR
8933 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008934 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008935 "community-list name\n")
8936{
8937 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8938}
8939
8940ALIAS (show_bgp_community_list,
8941 show_bgp_ipv6_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008942 "show bgp ipv6 community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008943 SHOW_STR
8944 BGP_STR
8945 "Address family\n"
8946 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008947 "community-list number\n"
paule8e19462006-01-19 20:16:55 +00008948 "community-list name\n")
paul718e3742002-12-13 20:15:29 +00008949
8950/* old command */
8951DEFUN (show_ipv6_bgp_community_list,
8952 show_ipv6_bgp_community_list_cmd,
8953 "show ipv6 bgp community-list WORD",
8954 SHOW_STR
8955 IPV6_STR
8956 BGP_STR
8957 "Display routes matching the community-list\n"
8958 "community-list name\n")
8959{
8960 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8961}
8962
8963/* old command */
8964DEFUN (show_ipv6_mbgp_community_list,
8965 show_ipv6_mbgp_community_list_cmd,
8966 "show ipv6 mbgp community-list WORD",
8967 SHOW_STR
8968 IPV6_STR
8969 MBGP_STR
8970 "Display routes matching the community-list\n"
8971 "community-list name\n")
8972{
8973 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8974}
8975
8976DEFUN (show_bgp_community_list_exact,
8977 show_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008978 "show bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008979 SHOW_STR
8980 BGP_STR
8981 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008982 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008983 "community-list name\n"
8984 "Exact match of the communities\n")
8985{
8986 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8987}
8988
8989ALIAS (show_bgp_community_list_exact,
8990 show_bgp_ipv6_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008991 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008992 SHOW_STR
8993 BGP_STR
8994 "Address family\n"
8995 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008996 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008997 "community-list name\n"
8998 "Exact match of the communities\n")
8999
9000/* old command */
9001DEFUN (show_ipv6_bgp_community_list_exact,
9002 show_ipv6_bgp_community_list_exact_cmd,
9003 "show ipv6 bgp community-list WORD exact-match",
9004 SHOW_STR
9005 IPV6_STR
9006 BGP_STR
9007 "Display routes matching the community-list\n"
9008 "community-list name\n"
9009 "Exact match of the communities\n")
9010{
9011 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
9012}
9013
9014/* old command */
9015DEFUN (show_ipv6_mbgp_community_list_exact,
9016 show_ipv6_mbgp_community_list_exact_cmd,
9017 "show ipv6 mbgp community-list WORD exact-match",
9018 SHOW_STR
9019 IPV6_STR
9020 MBGP_STR
9021 "Display routes matching the community-list\n"
9022 "community-list name\n"
9023 "Exact match of the communities\n")
9024{
9025 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
9026}
9027#endif /* HAVE_IPV6 */
9028
paul94f2b392005-06-28 12:44:16 +00009029static int
paulfd79ac92004-10-13 05:06:08 +00009030bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
paul718e3742002-12-13 20:15:29 +00009031 safi_t safi, enum bgp_show_type type)
9032{
9033 int ret;
9034 struct prefix *p;
9035
9036 p = prefix_new();
9037
9038 ret = str2prefix (prefix, p);
9039 if (! ret)
9040 {
9041 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
9042 return CMD_WARNING;
9043 }
9044
ajs5a646652004-11-05 01:25:55 +00009045 ret = bgp_show (vty, NULL, afi, safi, type, p);
9046 prefix_free(p);
9047 return ret;
paul718e3742002-12-13 20:15:29 +00009048}
9049
9050DEFUN (show_ip_bgp_prefix_longer,
9051 show_ip_bgp_prefix_longer_cmd,
9052 "show ip bgp A.B.C.D/M longer-prefixes",
9053 SHOW_STR
9054 IP_STR
9055 BGP_STR
9056 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9057 "Display route and more specific routes\n")
9058{
9059 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9060 bgp_show_type_prefix_longer);
9061}
9062
9063DEFUN (show_ip_bgp_flap_prefix_longer,
9064 show_ip_bgp_flap_prefix_longer_cmd,
9065 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
9066 SHOW_STR
9067 IP_STR
9068 BGP_STR
9069 "Display flap statistics of routes\n"
9070 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9071 "Display route and more specific routes\n")
9072{
9073 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9074 bgp_show_type_flap_prefix_longer);
9075}
9076
9077DEFUN (show_ip_bgp_ipv4_prefix_longer,
9078 show_ip_bgp_ipv4_prefix_longer_cmd,
9079 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
9080 SHOW_STR
9081 IP_STR
9082 BGP_STR
9083 "Address family\n"
9084 "Address Family modifier\n"
9085 "Address Family modifier\n"
9086 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9087 "Display route and more specific routes\n")
9088{
9089 if (strncmp (argv[0], "m", 1) == 0)
9090 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
9091 bgp_show_type_prefix_longer);
9092
9093 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
9094 bgp_show_type_prefix_longer);
9095}
9096
9097DEFUN (show_ip_bgp_flap_address,
9098 show_ip_bgp_flap_address_cmd,
9099 "show ip bgp flap-statistics A.B.C.D",
9100 SHOW_STR
9101 IP_STR
9102 BGP_STR
9103 "Display flap statistics of routes\n"
9104 "Network in the BGP routing table to display\n")
9105{
9106 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9107 bgp_show_type_flap_address);
9108}
9109
9110DEFUN (show_ip_bgp_flap_prefix,
9111 show_ip_bgp_flap_prefix_cmd,
9112 "show ip bgp flap-statistics A.B.C.D/M",
9113 SHOW_STR
9114 IP_STR
9115 BGP_STR
9116 "Display flap statistics of routes\n"
9117 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
9118{
9119 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9120 bgp_show_type_flap_prefix);
9121}
9122#ifdef HAVE_IPV6
9123DEFUN (show_bgp_prefix_longer,
9124 show_bgp_prefix_longer_cmd,
9125 "show bgp X:X::X:X/M longer-prefixes",
9126 SHOW_STR
9127 BGP_STR
9128 "IPv6 prefix <network>/<length>\n"
9129 "Display route and more specific routes\n")
9130{
9131 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9132 bgp_show_type_prefix_longer);
9133}
9134
9135ALIAS (show_bgp_prefix_longer,
9136 show_bgp_ipv6_prefix_longer_cmd,
9137 "show bgp ipv6 X:X::X:X/M longer-prefixes",
9138 SHOW_STR
9139 BGP_STR
9140 "Address family\n"
9141 "IPv6 prefix <network>/<length>\n"
9142 "Display route and more specific routes\n")
9143
9144/* old command */
9145DEFUN (show_ipv6_bgp_prefix_longer,
9146 show_ipv6_bgp_prefix_longer_cmd,
9147 "show ipv6 bgp X:X::X:X/M longer-prefixes",
9148 SHOW_STR
9149 IPV6_STR
9150 BGP_STR
9151 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9152 "Display route and more specific routes\n")
9153{
9154 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9155 bgp_show_type_prefix_longer);
9156}
9157
9158/* old command */
9159DEFUN (show_ipv6_mbgp_prefix_longer,
9160 show_ipv6_mbgp_prefix_longer_cmd,
9161 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
9162 SHOW_STR
9163 IPV6_STR
9164 MBGP_STR
9165 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9166 "Display route and more specific routes\n")
9167{
9168 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
9169 bgp_show_type_prefix_longer);
9170}
9171#endif /* HAVE_IPV6 */
paulbb46e942003-10-24 19:02:03 +00009172
paul94f2b392005-06-28 12:44:16 +00009173static struct peer *
paulfd79ac92004-10-13 05:06:08 +00009174peer_lookup_in_view (struct vty *vty, const char *view_name,
9175 const char *ip_str)
paulbb46e942003-10-24 19:02:03 +00009176{
9177 int ret;
9178 struct bgp *bgp;
9179 struct peer *peer;
9180 union sockunion su;
9181
9182 /* BGP structure lookup. */
9183 if (view_name)
9184 {
9185 bgp = bgp_lookup_by_name (view_name);
9186 if (! bgp)
9187 {
9188 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
9189 return NULL;
9190 }
9191 }
paul5228ad22004-06-04 17:58:18 +00009192 else
paulbb46e942003-10-24 19:02:03 +00009193 {
9194 bgp = bgp_get_default ();
9195 if (! bgp)
9196 {
9197 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
9198 return NULL;
9199 }
9200 }
9201
9202 /* Get peer sockunion. */
9203 ret = str2sockunion (ip_str, &su);
9204 if (ret < 0)
9205 {
9206 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
9207 return NULL;
9208 }
9209
9210 /* Peer structure lookup. */
9211 peer = peer_lookup (bgp, &su);
9212 if (! peer)
9213 {
9214 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
9215 return NULL;
9216 }
9217
9218 return peer;
9219}
Paul Jakma2815e612006-09-14 02:56:07 +00009220
9221enum bgp_stats
9222{
9223 BGP_STATS_MAXBITLEN = 0,
9224 BGP_STATS_RIB,
9225 BGP_STATS_PREFIXES,
9226 BGP_STATS_TOTPLEN,
9227 BGP_STATS_UNAGGREGATEABLE,
9228 BGP_STATS_MAX_AGGREGATEABLE,
9229 BGP_STATS_AGGREGATES,
9230 BGP_STATS_SPACE,
9231 BGP_STATS_ASPATH_COUNT,
9232 BGP_STATS_ASPATH_MAXHOPS,
9233 BGP_STATS_ASPATH_TOTHOPS,
9234 BGP_STATS_ASPATH_MAXSIZE,
9235 BGP_STATS_ASPATH_TOTSIZE,
9236 BGP_STATS_ASN_HIGHEST,
9237 BGP_STATS_MAX,
9238};
paulbb46e942003-10-24 19:02:03 +00009239
Paul Jakma2815e612006-09-14 02:56:07 +00009240static const char *table_stats_strs[] =
9241{
9242 [BGP_STATS_PREFIXES] = "Total Prefixes",
9243 [BGP_STATS_TOTPLEN] = "Average prefix length",
9244 [BGP_STATS_RIB] = "Total Advertisements",
9245 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
9246 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
9247 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
9248 [BGP_STATS_SPACE] = "Address space advertised",
9249 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
9250 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
9251 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
9252 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
9253 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
9254 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
9255 [BGP_STATS_MAX] = NULL,
9256};
9257
9258struct bgp_table_stats
9259{
9260 struct bgp_table *table;
9261 unsigned long long counts[BGP_STATS_MAX];
9262};
9263
9264#if 0
9265#define TALLY_SIGFIG 100000
9266static unsigned long
9267ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9268{
9269 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9270 unsigned long res = (newtot * TALLY_SIGFIG) / count;
9271 unsigned long ret = newtot / count;
9272
9273 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9274 return ret + 1;
9275 else
9276 return ret;
9277}
9278#endif
9279
9280static int
9281bgp_table_stats_walker (struct thread *t)
9282{
9283 struct bgp_node *rn;
9284 struct bgp_node *top;
9285 struct bgp_table_stats *ts = THREAD_ARG (t);
9286 unsigned int space = 0;
9287
Paul Jakma53d9f672006-10-15 23:41:16 +00009288 if (!(top = bgp_table_top (ts->table)))
9289 return 0;
Paul Jakma2815e612006-09-14 02:56:07 +00009290
9291 switch (top->p.family)
9292 {
9293 case AF_INET:
9294 space = IPV4_MAX_BITLEN;
9295 break;
9296 case AF_INET6:
9297 space = IPV6_MAX_BITLEN;
9298 break;
9299 }
9300
9301 ts->counts[BGP_STATS_MAXBITLEN] = space;
9302
9303 for (rn = top; rn; rn = bgp_route_next (rn))
9304 {
9305 struct bgp_info *ri;
9306 struct bgp_node *prn = rn->parent;
9307 unsigned int rinum = 0;
9308
9309 if (rn == top)
9310 continue;
9311
9312 if (!rn->info)
9313 continue;
9314
9315 ts->counts[BGP_STATS_PREFIXES]++;
9316 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9317
9318#if 0
9319 ts->counts[BGP_STATS_AVGPLEN]
9320 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9321 ts->counts[BGP_STATS_AVGPLEN],
9322 rn->p.prefixlen);
9323#endif
9324
9325 /* check if the prefix is included by any other announcements */
9326 while (prn && !prn->info)
9327 prn = prn->parent;
9328
9329 if (prn == NULL || prn == top)
Paul Jakma8383a9b2006-09-14 03:06:54 +00009330 {
9331 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9332 /* announced address space */
9333 if (space)
9334 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9335 }
Paul Jakma2815e612006-09-14 02:56:07 +00009336 else if (prn->info)
9337 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9338
Paul Jakma2815e612006-09-14 02:56:07 +00009339 for (ri = rn->info; ri; ri = ri->next)
9340 {
9341 rinum++;
9342 ts->counts[BGP_STATS_RIB]++;
9343
9344 if (ri->attr &&
9345 (CHECK_FLAG (ri->attr->flag,
9346 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9347 ts->counts[BGP_STATS_AGGREGATES]++;
9348
9349 /* as-path stats */
9350 if (ri->attr && ri->attr->aspath)
9351 {
9352 unsigned int hops = aspath_count_hops (ri->attr->aspath);
9353 unsigned int size = aspath_size (ri->attr->aspath);
9354 as_t highest = aspath_highest (ri->attr->aspath);
9355
9356 ts->counts[BGP_STATS_ASPATH_COUNT]++;
9357
9358 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9359 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9360
9361 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9362 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9363
9364 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9365 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9366#if 0
9367 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9368 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9369 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9370 hops);
9371 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9372 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9373 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9374 size);
9375#endif
9376 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9377 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9378 }
9379 }
9380 }
9381 return 0;
9382}
9383
9384static int
9385bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9386{
9387 struct bgp_table_stats ts;
9388 unsigned int i;
9389
9390 if (!bgp->rib[afi][safi])
9391 {
9392 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9393 return CMD_WARNING;
9394 }
9395
9396 memset (&ts, 0, sizeof (ts));
9397 ts.table = bgp->rib[afi][safi];
9398 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9399
9400 vty_out (vty, "BGP %s RIB statistics%s%s",
9401 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9402
9403 for (i = 0; i < BGP_STATS_MAX; i++)
9404 {
9405 if (!table_stats_strs[i])
9406 continue;
9407
9408 switch (i)
9409 {
9410#if 0
9411 case BGP_STATS_ASPATH_AVGHOPS:
9412 case BGP_STATS_ASPATH_AVGSIZE:
9413 case BGP_STATS_AVGPLEN:
9414 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9415 vty_out (vty, "%12.2f",
9416 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9417 break;
9418#endif
9419 case BGP_STATS_ASPATH_TOTHOPS:
9420 case BGP_STATS_ASPATH_TOTSIZE:
9421 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9422 vty_out (vty, "%12.2f",
9423 ts.counts[i] ?
9424 (float)ts.counts[i] /
9425 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9426 : 0);
9427 break;
9428 case BGP_STATS_TOTPLEN:
9429 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9430 vty_out (vty, "%12.2f",
9431 ts.counts[i] ?
9432 (float)ts.counts[i] /
9433 (float)ts.counts[BGP_STATS_PREFIXES]
9434 : 0);
9435 break;
9436 case BGP_STATS_SPACE:
9437 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9438 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9439 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9440 break;
Paul Jakma30a22312008-08-15 14:05:22 +01009441 vty_out (vty, "%30s: ", "%% announced ");
Paul Jakma2815e612006-09-14 02:56:07 +00009442 vty_out (vty, "%12.2f%s",
9443 100 * (float)ts.counts[BGP_STATS_SPACE] /
Paul Jakma56395af2006-10-27 16:58:20 +00009444 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
Paul Jakma2815e612006-09-14 02:56:07 +00009445 VTY_NEWLINE);
9446 vty_out (vty, "%30s: ", "/8 equivalent ");
9447 vty_out (vty, "%12.2f%s",
9448 (float)ts.counts[BGP_STATS_SPACE] /
9449 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9450 VTY_NEWLINE);
9451 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9452 break;
9453 vty_out (vty, "%30s: ", "/24 equivalent ");
9454 vty_out (vty, "%12.2f",
9455 (float)ts.counts[BGP_STATS_SPACE] /
9456 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9457 break;
9458 default:
9459 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9460 vty_out (vty, "%12llu", ts.counts[i]);
9461 }
9462
9463 vty_out (vty, "%s", VTY_NEWLINE);
9464 }
9465 return CMD_SUCCESS;
9466}
9467
9468static int
9469bgp_table_stats_vty (struct vty *vty, const char *name,
9470 const char *afi_str, const char *safi_str)
9471{
9472 struct bgp *bgp;
9473 afi_t afi;
9474 safi_t safi;
9475
9476 if (name)
9477 bgp = bgp_lookup_by_name (name);
9478 else
9479 bgp = bgp_get_default ();
9480
9481 if (!bgp)
9482 {
9483 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9484 return CMD_WARNING;
9485 }
9486 if (strncmp (afi_str, "ipv", 3) == 0)
9487 {
9488 if (strncmp (afi_str, "ipv4", 4) == 0)
9489 afi = AFI_IP;
9490 else if (strncmp (afi_str, "ipv6", 4) == 0)
9491 afi = AFI_IP6;
9492 else
9493 {
9494 vty_out (vty, "%% Invalid address family %s%s",
9495 afi_str, VTY_NEWLINE);
9496 return CMD_WARNING;
9497 }
9498 if (strncmp (safi_str, "m", 1) == 0)
9499 safi = SAFI_MULTICAST;
9500 else if (strncmp (safi_str, "u", 1) == 0)
9501 safi = SAFI_UNICAST;
Denis Ovsienko42e6d742011-07-14 12:36:19 +04009502 else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0)
9503 safi = SAFI_MPLS_LABELED_VPN;
Paul Jakma2815e612006-09-14 02:56:07 +00009504 else
9505 {
9506 vty_out (vty, "%% Invalid subsequent address family %s%s",
9507 safi_str, VTY_NEWLINE);
9508 return CMD_WARNING;
9509 }
9510 }
9511 else
9512 {
9513 vty_out (vty, "%% Invalid address family %s%s",
9514 afi_str, VTY_NEWLINE);
9515 return CMD_WARNING;
9516 }
9517
Paul Jakma2815e612006-09-14 02:56:07 +00009518 return bgp_table_stats (vty, bgp, afi, safi);
9519}
9520
9521DEFUN (show_bgp_statistics,
9522 show_bgp_statistics_cmd,
9523 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9524 SHOW_STR
9525 BGP_STR
9526 "Address family\n"
9527 "Address family\n"
9528 "Address Family modifier\n"
9529 "Address Family modifier\n"
9530 "BGP RIB advertisement statistics\n")
9531{
9532 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9533}
9534
9535ALIAS (show_bgp_statistics,
9536 show_bgp_statistics_vpnv4_cmd,
9537 "show bgp (ipv4) (vpnv4) statistics",
9538 SHOW_STR
9539 BGP_STR
9540 "Address family\n"
9541 "Address Family modifier\n"
9542 "BGP RIB advertisement statistics\n")
9543
9544DEFUN (show_bgp_statistics_view,
9545 show_bgp_statistics_view_cmd,
9546 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9547 SHOW_STR
9548 BGP_STR
9549 "BGP view\n"
9550 "Address family\n"
9551 "Address family\n"
9552 "Address Family modifier\n"
9553 "Address Family modifier\n"
9554 "BGP RIB advertisement statistics\n")
9555{
9556 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9557}
9558
9559ALIAS (show_bgp_statistics_view,
9560 show_bgp_statistics_view_vpnv4_cmd,
9561 "show bgp view WORD (ipv4) (vpnv4) statistics",
9562 SHOW_STR
9563 BGP_STR
9564 "BGP view\n"
9565 "Address family\n"
9566 "Address Family modifier\n"
9567 "BGP RIB advertisement statistics\n")
9568
Paul Jakmaff7924f2006-09-04 01:10:36 +00009569enum bgp_pcounts
9570{
9571 PCOUNT_ADJ_IN = 0,
9572 PCOUNT_DAMPED,
9573 PCOUNT_REMOVED,
9574 PCOUNT_HISTORY,
9575 PCOUNT_STALE,
9576 PCOUNT_VALID,
9577 PCOUNT_ALL,
9578 PCOUNT_COUNTED,
9579 PCOUNT_PFCNT, /* the figure we display to users */
9580 PCOUNT_MAX,
9581};
9582
9583static const char *pcount_strs[] =
9584{
9585 [PCOUNT_ADJ_IN] = "Adj-in",
9586 [PCOUNT_DAMPED] = "Damped",
9587 [PCOUNT_REMOVED] = "Removed",
9588 [PCOUNT_HISTORY] = "History",
9589 [PCOUNT_STALE] = "Stale",
9590 [PCOUNT_VALID] = "Valid",
9591 [PCOUNT_ALL] = "All RIB",
9592 [PCOUNT_COUNTED] = "PfxCt counted",
9593 [PCOUNT_PFCNT] = "Useable",
9594 [PCOUNT_MAX] = NULL,
9595};
9596
Paul Jakma2815e612006-09-14 02:56:07 +00009597struct peer_pcounts
9598{
9599 unsigned int count[PCOUNT_MAX];
9600 const struct peer *peer;
9601 const struct bgp_table *table;
9602};
9603
Paul Jakmaff7924f2006-09-04 01:10:36 +00009604static int
Paul Jakma2815e612006-09-14 02:56:07 +00009605bgp_peer_count_walker (struct thread *t)
Paul Jakmaff7924f2006-09-04 01:10:36 +00009606{
9607 struct bgp_node *rn;
Paul Jakma2815e612006-09-14 02:56:07 +00009608 struct peer_pcounts *pc = THREAD_ARG (t);
9609 const struct peer *peer = pc->peer;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009610
Paul Jakma2815e612006-09-14 02:56:07 +00009611 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009612 {
9613 struct bgp_adj_in *ain;
Paul Jakma2815e612006-09-14 02:56:07 +00009614 struct bgp_info *ri;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009615
9616 for (ain = rn->adj_in; ain; ain = ain->next)
9617 if (ain->peer == peer)
Paul Jakma2815e612006-09-14 02:56:07 +00009618 pc->count[PCOUNT_ADJ_IN]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009619
Paul Jakmaff7924f2006-09-04 01:10:36 +00009620 for (ri = rn->info; ri; ri = ri->next)
9621 {
9622 char buf[SU_ADDRSTRLEN];
9623
9624 if (ri->peer != peer)
9625 continue;
9626
Paul Jakma2815e612006-09-14 02:56:07 +00009627 pc->count[PCOUNT_ALL]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009628
9629 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
Paul Jakma2815e612006-09-14 02:56:07 +00009630 pc->count[PCOUNT_DAMPED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009631 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
Paul Jakma2815e612006-09-14 02:56:07 +00009632 pc->count[PCOUNT_HISTORY]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009633 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
Paul Jakma2815e612006-09-14 02:56:07 +00009634 pc->count[PCOUNT_REMOVED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009635 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma2815e612006-09-14 02:56:07 +00009636 pc->count[PCOUNT_STALE]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009637 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
Paul Jakma2815e612006-09-14 02:56:07 +00009638 pc->count[PCOUNT_VALID]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009639 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakma2815e612006-09-14 02:56:07 +00009640 pc->count[PCOUNT_PFCNT]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009641
9642 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9643 {
Paul Jakma2815e612006-09-14 02:56:07 +00009644 pc->count[PCOUNT_COUNTED]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009645 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009646 plog_warn (peer->log,
9647 "%s [pcount] %s/%d is counted but flags 0x%x",
9648 peer->host,
9649 inet_ntop(rn->p.family, &rn->p.u.prefix,
9650 buf, SU_ADDRSTRLEN),
9651 rn->p.prefixlen,
9652 ri->flags);
9653 }
9654 else
9655 {
Paul Jakma1a392d42006-09-07 00:24:49 +00009656 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009657 plog_warn (peer->log,
9658 "%s [pcount] %s/%d not counted but flags 0x%x",
9659 peer->host,
9660 inet_ntop(rn->p.family, &rn->p.u.prefix,
9661 buf, SU_ADDRSTRLEN),
9662 rn->p.prefixlen,
9663 ri->flags);
9664 }
9665 }
9666 }
Paul Jakma2815e612006-09-14 02:56:07 +00009667 return 0;
9668}
Paul Jakmaff7924f2006-09-04 01:10:36 +00009669
Paul Jakma2815e612006-09-14 02:56:07 +00009670static int
9671bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9672{
9673 struct peer_pcounts pcounts = { .peer = peer };
9674 unsigned int i;
9675
9676 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9677 || !peer->bgp->rib[afi][safi])
9678 {
9679 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9680 return CMD_WARNING;
9681 }
9682
9683 memset (&pcounts, 0, sizeof(pcounts));
9684 pcounts.peer = peer;
9685 pcounts.table = peer->bgp->rib[afi][safi];
9686
9687 /* in-place call via thread subsystem so as to record execution time
9688 * stats for the thread-walk (i.e. ensure this can't be blamed on
9689 * on just vty_read()).
9690 */
9691 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9692
Paul Jakmaff7924f2006-09-04 01:10:36 +00009693 vty_out (vty, "Prefix counts for %s, %s%s",
9694 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9695 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9696 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9697 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9698
9699 for (i = 0; i < PCOUNT_MAX; i++)
Paul Jakma2815e612006-09-14 02:56:07 +00009700 vty_out (vty, "%20s: %-10d%s",
9701 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
Paul Jakmaff7924f2006-09-04 01:10:36 +00009702
Paul Jakma2815e612006-09-14 02:56:07 +00009703 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
Paul Jakmaff7924f2006-09-04 01:10:36 +00009704 {
9705 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9706 peer->host, VTY_NEWLINE);
9707 vty_out (vty, "Please report this bug, with the above command output%s",
9708 VTY_NEWLINE);
9709 }
9710
9711 return CMD_SUCCESS;
9712}
9713
9714DEFUN (show_ip_bgp_neighbor_prefix_counts,
9715 show_ip_bgp_neighbor_prefix_counts_cmd,
9716 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9717 SHOW_STR
9718 IP_STR
9719 BGP_STR
9720 "Detailed information on TCP and BGP neighbor connections\n"
9721 "Neighbor to display information about\n"
9722 "Neighbor to display information about\n"
9723 "Display detailed prefix count information\n")
9724{
9725 struct peer *peer;
9726
9727 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9728 if (! peer)
9729 return CMD_WARNING;
9730
9731 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9732}
9733
9734DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9735 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9736 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9737 SHOW_STR
9738 BGP_STR
9739 "Address family\n"
9740 "Detailed information on TCP and BGP neighbor connections\n"
9741 "Neighbor to display information about\n"
9742 "Neighbor to display information about\n"
9743 "Display detailed prefix count information\n")
9744{
9745 struct peer *peer;
9746
9747 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9748 if (! peer)
9749 return CMD_WARNING;
9750
9751 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9752}
9753
9754DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9755 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9756 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9757 SHOW_STR
9758 IP_STR
9759 BGP_STR
9760 "Address family\n"
9761 "Address Family modifier\n"
9762 "Address Family modifier\n"
9763 "Detailed information on TCP and BGP neighbor connections\n"
9764 "Neighbor to display information about\n"
9765 "Neighbor to display information about\n"
9766 "Display detailed prefix count information\n")
9767{
9768 struct peer *peer;
9769
9770 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9771 if (! peer)
9772 return CMD_WARNING;
9773
9774 if (strncmp (argv[0], "m", 1) == 0)
9775 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9776
9777 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9778}
9779
9780DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9781 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9782 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9783 SHOW_STR
9784 IP_STR
9785 BGP_STR
9786 "Address family\n"
9787 "Address Family modifier\n"
9788 "Address Family modifier\n"
9789 "Detailed information on TCP and BGP neighbor connections\n"
9790 "Neighbor to display information about\n"
9791 "Neighbor to display information about\n"
9792 "Display detailed prefix count information\n")
9793{
9794 struct peer *peer;
9795
9796 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9797 if (! peer)
9798 return CMD_WARNING;
9799
9800 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9801}
9802
9803
paul94f2b392005-06-28 12:44:16 +00009804static void
paul718e3742002-12-13 20:15:29 +00009805show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9806 int in)
9807{
9808 struct bgp_table *table;
9809 struct bgp_adj_in *ain;
9810 struct bgp_adj_out *adj;
9811 unsigned long output_count;
9812 struct bgp_node *rn;
9813 int header1 = 1;
9814 struct bgp *bgp;
9815 int header2 = 1;
9816
paulbb46e942003-10-24 19:02:03 +00009817 bgp = peer->bgp;
paul718e3742002-12-13 20:15:29 +00009818
9819 if (! bgp)
9820 return;
9821
9822 table = bgp->rib[afi][safi];
9823
9824 output_count = 0;
9825
9826 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9827 PEER_STATUS_DEFAULT_ORIGINATE))
9828 {
9829 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
hasso93406d82005-02-02 14:40:33 +00009830 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9831 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009832
9833 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9834 VTY_NEWLINE, VTY_NEWLINE);
9835 header1 = 0;
9836 }
9837
9838 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9839 if (in)
9840 {
9841 for (ain = rn->adj_in; ain; ain = ain->next)
9842 if (ain->peer == peer)
9843 {
9844 if (header1)
9845 {
9846 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
hasso93406d82005-02-02 14:40:33 +00009847 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9848 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009849 header1 = 0;
9850 }
9851 if (header2)
9852 {
9853 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9854 header2 = 0;
9855 }
9856 if (ain->attr)
9857 {
9858 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9859 output_count++;
9860 }
9861 }
9862 }
9863 else
9864 {
9865 for (adj = rn->adj_out; adj; adj = adj->next)
9866 if (adj->peer == peer)
9867 {
9868 if (header1)
9869 {
9870 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
hasso93406d82005-02-02 14:40:33 +00009871 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9872 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009873 header1 = 0;
9874 }
9875 if (header2)
9876 {
9877 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9878 header2 = 0;
9879 }
9880 if (adj->attr)
9881 {
9882 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9883 output_count++;
9884 }
9885 }
9886 }
9887
9888 if (output_count != 0)
9889 vty_out (vty, "%sTotal number of prefixes %ld%s",
9890 VTY_NEWLINE, output_count, VTY_NEWLINE);
9891}
9892
paul94f2b392005-06-28 12:44:16 +00009893static int
paulbb46e942003-10-24 19:02:03 +00009894peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9895{
paul718e3742002-12-13 20:15:29 +00009896 if (! peer || ! peer->afc[afi][safi])
9897 {
9898 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9899 return CMD_WARNING;
9900 }
9901
9902 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9903 {
9904 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9905 VTY_NEWLINE);
9906 return CMD_WARNING;
9907 }
9908
9909 show_adj_route (vty, peer, afi, safi, in);
9910
9911 return CMD_SUCCESS;
9912}
9913
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009914DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9915 show_ip_bgp_view_neighbor_advertised_route_cmd,
9916 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9917 SHOW_STR
9918 IP_STR
9919 BGP_STR
9920 "BGP view\n"
9921 "View name\n"
9922 "Detailed information on TCP and BGP neighbor connections\n"
9923 "Neighbor to display information about\n"
9924 "Neighbor to display information about\n"
9925 "Display the routes advertised to a BGP neighbor\n")
9926{
9927 struct peer *peer;
9928
9929 if (argc == 2)
9930 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9931 else
9932 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9933
9934 if (! peer)
9935 return CMD_WARNING;
9936
9937 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9938}
9939
9940ALIAS (show_ip_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009941 show_ip_bgp_neighbor_advertised_route_cmd,
9942 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9943 SHOW_STR
9944 IP_STR
9945 BGP_STR
9946 "Detailed information on TCP and BGP neighbor connections\n"
9947 "Neighbor to display information about\n"
9948 "Neighbor to display information about\n"
9949 "Display the routes advertised to a BGP neighbor\n")
paul718e3742002-12-13 20:15:29 +00009950
9951DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9952 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9953 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9954 SHOW_STR
9955 IP_STR
9956 BGP_STR
9957 "Address family\n"
9958 "Address Family modifier\n"
9959 "Address Family modifier\n"
9960 "Detailed information on TCP and BGP neighbor connections\n"
9961 "Neighbor to display information about\n"
9962 "Neighbor to display information about\n"
9963 "Display the routes advertised to a BGP neighbor\n")
9964{
paulbb46e942003-10-24 19:02:03 +00009965 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00009966
paulbb46e942003-10-24 19:02:03 +00009967 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9968 if (! peer)
9969 return CMD_WARNING;
9970
9971 if (strncmp (argv[0], "m", 1) == 0)
9972 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9973
9974 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
paul718e3742002-12-13 20:15:29 +00009975}
9976
9977#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +00009978DEFUN (show_bgp_view_neighbor_advertised_route,
9979 show_bgp_view_neighbor_advertised_route_cmd,
9980 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9981 SHOW_STR
9982 BGP_STR
9983 "BGP view\n"
9984 "View name\n"
9985 "Detailed information on TCP and BGP neighbor connections\n"
9986 "Neighbor to display information about\n"
9987 "Neighbor to display information about\n"
9988 "Display the routes advertised to a BGP neighbor\n")
9989{
9990 struct peer *peer;
9991
9992 if (argc == 2)
9993 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9994 else
9995 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9996
9997 if (! peer)
9998 return CMD_WARNING;
9999
10000 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
10001}
10002
10003ALIAS (show_bgp_view_neighbor_advertised_route,
10004 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
10005 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10006 SHOW_STR
10007 BGP_STR
10008 "BGP view\n"
10009 "View name\n"
10010 "Address family\n"
10011 "Detailed information on TCP and BGP neighbor connections\n"
10012 "Neighbor to display information about\n"
10013 "Neighbor to display information about\n"
10014 "Display the routes advertised to a BGP neighbor\n")
10015
10016DEFUN (show_bgp_view_neighbor_received_routes,
10017 show_bgp_view_neighbor_received_routes_cmd,
10018 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
10019 SHOW_STR
10020 BGP_STR
10021 "BGP view\n"
10022 "View name\n"
10023 "Detailed information on TCP and BGP neighbor connections\n"
10024 "Neighbor to display information about\n"
10025 "Neighbor to display information about\n"
10026 "Display the received routes from neighbor\n")
10027{
10028 struct peer *peer;
10029
10030 if (argc == 2)
10031 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10032 else
10033 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10034
10035 if (! peer)
10036 return CMD_WARNING;
10037
10038 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
10039}
10040
10041ALIAS (show_bgp_view_neighbor_received_routes,
10042 show_bgp_view_ipv6_neighbor_received_routes_cmd,
10043 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10044 SHOW_STR
10045 BGP_STR
10046 "BGP view\n"
10047 "View name\n"
10048 "Address family\n"
10049 "Detailed information on TCP and BGP neighbor connections\n"
10050 "Neighbor to display information about\n"
10051 "Neighbor to display information about\n"
10052 "Display the received routes from neighbor\n")
10053
10054ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010055 show_bgp_neighbor_advertised_route_cmd,
10056 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10057 SHOW_STR
10058 BGP_STR
10059 "Detailed information on TCP and BGP neighbor connections\n"
10060 "Neighbor to display information about\n"
10061 "Neighbor to display information about\n"
10062 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +000010063
10064ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010065 show_bgp_ipv6_neighbor_advertised_route_cmd,
10066 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10067 SHOW_STR
10068 BGP_STR
10069 "Address family\n"
10070 "Detailed information on TCP and BGP neighbor connections\n"
10071 "Neighbor to display information about\n"
10072 "Neighbor to display information about\n"
10073 "Display the routes advertised to a BGP neighbor\n")
10074
10075/* old command */
paulbb46e942003-10-24 19:02:03 +000010076ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010077 ipv6_bgp_neighbor_advertised_route_cmd,
10078 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10079 SHOW_STR
10080 IPV6_STR
10081 BGP_STR
10082 "Detailed information on TCP and BGP neighbor connections\n"
10083 "Neighbor to display information about\n"
10084 "Neighbor to display information about\n"
10085 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +000010086
paul718e3742002-12-13 20:15:29 +000010087/* old command */
10088DEFUN (ipv6_mbgp_neighbor_advertised_route,
10089 ipv6_mbgp_neighbor_advertised_route_cmd,
10090 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10091 SHOW_STR
10092 IPV6_STR
10093 MBGP_STR
10094 "Detailed information on TCP and BGP neighbor connections\n"
10095 "Neighbor to display information about\n"
10096 "Neighbor to display information about\n"
10097 "Display the routes advertised to a BGP neighbor\n")
10098{
paulbb46e942003-10-24 19:02:03 +000010099 struct peer *peer;
10100
10101 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10102 if (! peer)
10103 return CMD_WARNING;
10104
10105 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
paul718e3742002-12-13 20:15:29 +000010106}
10107#endif /* HAVE_IPV6 */
10108
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010010109DEFUN (show_ip_bgp_view_neighbor_received_routes,
10110 show_ip_bgp_view_neighbor_received_routes_cmd,
10111 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
10112 SHOW_STR
10113 IP_STR
10114 BGP_STR
10115 "BGP view\n"
10116 "View name\n"
10117 "Detailed information on TCP and BGP neighbor connections\n"
10118 "Neighbor to display information about\n"
10119 "Neighbor to display information about\n"
10120 "Display the received routes from neighbor\n")
10121{
10122 struct peer *peer;
10123
10124 if (argc == 2)
10125 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10126 else
10127 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10128
10129 if (! peer)
10130 return CMD_WARNING;
10131
10132 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
10133}
10134
10135ALIAS (show_ip_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010136 show_ip_bgp_neighbor_received_routes_cmd,
10137 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10138 SHOW_STR
10139 IP_STR
10140 BGP_STR
10141 "Detailed information on TCP and BGP neighbor connections\n"
10142 "Neighbor to display information about\n"
10143 "Neighbor to display information about\n"
10144 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010145
10146DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
10147 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
10148 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
10149 SHOW_STR
10150 IP_STR
10151 BGP_STR
10152 "Address family\n"
10153 "Address Family modifier\n"
10154 "Address Family modifier\n"
10155 "Detailed information on TCP and BGP neighbor connections\n"
10156 "Neighbor to display information about\n"
10157 "Neighbor to display information about\n"
10158 "Display the received routes from neighbor\n")
10159{
paulbb46e942003-10-24 19:02:03 +000010160 struct peer *peer;
paul718e3742002-12-13 20:15:29 +000010161
paulbb46e942003-10-24 19:02:03 +000010162 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10163 if (! peer)
10164 return CMD_WARNING;
10165
10166 if (strncmp (argv[0], "m", 1) == 0)
10167 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
10168
10169 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
paul718e3742002-12-13 20:15:29 +000010170}
10171
Michael Lambert95cbbd22010-07-23 14:43:04 -040010172DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
10173 show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
10174#ifdef HAVE_IPV6
10175 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10176#else
10177 "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10178#endif
10179 SHOW_STR
10180 BGP_STR
10181 "BGP view\n"
10182 "BGP view name\n"
10183 "Address family\n"
10184#ifdef HAVE_IPV6
10185 "Address family\n"
10186#endif
10187 "Address family modifier\n"
10188 "Address family modifier\n"
10189 "Detailed information on TCP and BGP neighbor connections\n"
10190 "Neighbor to display information about\n"
10191 "Neighbor to display information about\n"
10192 "Display the advertised routes to neighbor\n"
10193 "Display the received routes from neighbor\n")
10194{
10195 int afi;
10196 int safi;
10197 int in;
10198 struct peer *peer;
10199
10200#ifdef HAVE_IPV6
10201 peer = peer_lookup_in_view (vty, argv[0], argv[3]);
10202#else
10203 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10204#endif
10205
10206 if (! peer)
10207 return CMD_WARNING;
10208
10209#ifdef HAVE_IPV6
10210 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10211 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10212 in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
10213#else
10214 afi = AFI_IP;
10215 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10216 in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
10217#endif
10218
10219 return peer_adj_routes (vty, peer, afi, safi, in);
10220}
10221
paul718e3742002-12-13 20:15:29 +000010222DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
10223 show_ip_bgp_neighbor_received_prefix_filter_cmd,
10224 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10225 SHOW_STR
10226 IP_STR
10227 BGP_STR
10228 "Detailed information on TCP and BGP neighbor connections\n"
10229 "Neighbor to display information about\n"
10230 "Neighbor to display information about\n"
10231 "Display information received from a BGP neighbor\n"
10232 "Display the prefixlist filter\n")
10233{
10234 char name[BUFSIZ];
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010235 union sockunion su;
paul718e3742002-12-13 20:15:29 +000010236 struct peer *peer;
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010237 int count, ret;
paul718e3742002-12-13 20:15:29 +000010238
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010239 ret = str2sockunion (argv[0], &su);
10240 if (ret < 0)
10241 {
10242 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
10243 return CMD_WARNING;
10244 }
paul718e3742002-12-13 20:15:29 +000010245
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010246 peer = peer_lookup (NULL, &su);
paul718e3742002-12-13 20:15:29 +000010247 if (! peer)
10248 return CMD_WARNING;
10249
10250 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10251 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10252 if (count)
10253 {
10254 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10255 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10256 }
10257
10258 return CMD_SUCCESS;
10259}
10260
10261DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
10262 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
10263 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10264 SHOW_STR
10265 IP_STR
10266 BGP_STR
10267 "Address family\n"
10268 "Address Family modifier\n"
10269 "Address Family modifier\n"
10270 "Detailed information on TCP and BGP neighbor connections\n"
10271 "Neighbor to display information about\n"
10272 "Neighbor to display information about\n"
10273 "Display information received from a BGP neighbor\n"
10274 "Display the prefixlist filter\n")
10275{
10276 char name[BUFSIZ];
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010277 union sockunion su;
paul718e3742002-12-13 20:15:29 +000010278 struct peer *peer;
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010279 int count, ret;
paul718e3742002-12-13 20:15:29 +000010280
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010281 ret = str2sockunion (argv[1], &su);
10282 if (ret < 0)
10283 {
10284 vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
10285 return CMD_WARNING;
10286 }
paul718e3742002-12-13 20:15:29 +000010287
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010288 peer = peer_lookup (NULL, &su);
paul718e3742002-12-13 20:15:29 +000010289 if (! peer)
10290 return CMD_WARNING;
10291
10292 if (strncmp (argv[0], "m", 1) == 0)
10293 {
10294 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
10295 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10296 if (count)
10297 {
10298 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
10299 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10300 }
10301 }
10302 else
10303 {
10304 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10305 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10306 if (count)
10307 {
10308 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10309 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10310 }
10311 }
10312
10313 return CMD_SUCCESS;
10314}
10315
10316
10317#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010318ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010319 show_bgp_neighbor_received_routes_cmd,
10320 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10321 SHOW_STR
10322 BGP_STR
10323 "Detailed information on TCP and BGP neighbor connections\n"
10324 "Neighbor to display information about\n"
10325 "Neighbor to display information about\n"
10326 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010327
paulbb46e942003-10-24 19:02:03 +000010328ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010329 show_bgp_ipv6_neighbor_received_routes_cmd,
10330 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10331 SHOW_STR
10332 BGP_STR
10333 "Address family\n"
10334 "Detailed information on TCP and BGP neighbor connections\n"
10335 "Neighbor to display information about\n"
10336 "Neighbor to display information about\n"
10337 "Display the received routes from neighbor\n")
10338
10339DEFUN (show_bgp_neighbor_received_prefix_filter,
10340 show_bgp_neighbor_received_prefix_filter_cmd,
10341 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10342 SHOW_STR
10343 BGP_STR
10344 "Detailed information on TCP and BGP neighbor connections\n"
10345 "Neighbor to display information about\n"
10346 "Neighbor to display information about\n"
10347 "Display information received from a BGP neighbor\n"
10348 "Display the prefixlist filter\n")
10349{
10350 char name[BUFSIZ];
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010351 union sockunion su;
paul718e3742002-12-13 20:15:29 +000010352 struct peer *peer;
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010353 int count, ret;
paul718e3742002-12-13 20:15:29 +000010354
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010355 ret = str2sockunion (argv[0], &su);
10356 if (ret < 0)
10357 {
10358 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
10359 return CMD_WARNING;
10360 }
paul718e3742002-12-13 20:15:29 +000010361
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010362 peer = peer_lookup (NULL, &su);
paul718e3742002-12-13 20:15:29 +000010363 if (! peer)
10364 return CMD_WARNING;
10365
10366 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10367 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10368 if (count)
10369 {
10370 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10371 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10372 }
10373
10374 return CMD_SUCCESS;
10375}
10376
10377ALIAS (show_bgp_neighbor_received_prefix_filter,
10378 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10379 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10380 SHOW_STR
10381 BGP_STR
10382 "Address family\n"
10383 "Detailed information on TCP and BGP neighbor connections\n"
10384 "Neighbor to display information about\n"
10385 "Neighbor to display information about\n"
10386 "Display information received from a BGP neighbor\n"
10387 "Display the prefixlist filter\n")
10388
10389/* old command */
paulbb46e942003-10-24 19:02:03 +000010390ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010391 ipv6_bgp_neighbor_received_routes_cmd,
10392 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10393 SHOW_STR
10394 IPV6_STR
10395 BGP_STR
10396 "Detailed information on TCP and BGP neighbor connections\n"
10397 "Neighbor to display information about\n"
10398 "Neighbor to display information about\n"
10399 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010400
10401/* old command */
10402DEFUN (ipv6_mbgp_neighbor_received_routes,
10403 ipv6_mbgp_neighbor_received_routes_cmd,
10404 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10405 SHOW_STR
10406 IPV6_STR
10407 MBGP_STR
10408 "Detailed information on TCP and BGP neighbor connections\n"
10409 "Neighbor to display information about\n"
10410 "Neighbor to display information about\n"
10411 "Display the received routes from neighbor\n")
10412{
paulbb46e942003-10-24 19:02:03 +000010413 struct peer *peer;
10414
10415 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10416 if (! peer)
10417 return CMD_WARNING;
10418
10419 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
paul718e3742002-12-13 20:15:29 +000010420}
paulbb46e942003-10-24 19:02:03 +000010421
10422DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10423 show_bgp_view_neighbor_received_prefix_filter_cmd,
10424 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10425 SHOW_STR
10426 BGP_STR
10427 "BGP view\n"
10428 "View name\n"
10429 "Detailed information on TCP and BGP neighbor connections\n"
10430 "Neighbor to display information about\n"
10431 "Neighbor to display information about\n"
10432 "Display information received from a BGP neighbor\n"
10433 "Display the prefixlist filter\n")
10434{
10435 char name[BUFSIZ];
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010436 union sockunion su;
paulbb46e942003-10-24 19:02:03 +000010437 struct peer *peer;
10438 struct bgp *bgp;
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010439 int count, ret;
paulbb46e942003-10-24 19:02:03 +000010440
10441 /* BGP structure lookup. */
10442 bgp = bgp_lookup_by_name (argv[0]);
10443 if (bgp == NULL)
10444 {
10445 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10446 return CMD_WARNING;
10447 }
10448
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010449 ret = str2sockunion (argv[1], &su);
10450 if (ret < 0)
10451 {
10452 vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
10453 return CMD_WARNING;
10454 }
paulbb46e942003-10-24 19:02:03 +000010455
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +020010456 peer = peer_lookup (bgp, &su);
paulbb46e942003-10-24 19:02:03 +000010457 if (! peer)
10458 return CMD_WARNING;
10459
10460 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10461 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10462 if (count)
10463 {
10464 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10465 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10466 }
10467
10468 return CMD_SUCCESS;
10469}
10470
10471ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10472 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10473 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10474 SHOW_STR
10475 BGP_STR
10476 "BGP view\n"
10477 "View name\n"
10478 "Address family\n"
10479 "Detailed information on TCP and BGP neighbor connections\n"
10480 "Neighbor to display information about\n"
10481 "Neighbor to display information about\n"
10482 "Display information received from a BGP neighbor\n"
10483 "Display the prefixlist filter\n")
paul718e3742002-12-13 20:15:29 +000010484#endif /* HAVE_IPV6 */
10485
paul94f2b392005-06-28 12:44:16 +000010486static int
paulbb46e942003-10-24 19:02:03 +000010487bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
paul718e3742002-12-13 20:15:29 +000010488 safi_t safi, enum bgp_show_type type)
10489{
paul718e3742002-12-13 20:15:29 +000010490 if (! peer || ! peer->afc[afi][safi])
10491 {
10492 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +000010493 return CMD_WARNING;
10494 }
10495
ajs5a646652004-11-05 01:25:55 +000010496 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
paul718e3742002-12-13 20:15:29 +000010497}
10498
10499DEFUN (show_ip_bgp_neighbor_routes,
10500 show_ip_bgp_neighbor_routes_cmd,
10501 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10502 SHOW_STR
10503 IP_STR
10504 BGP_STR
10505 "Detailed information on TCP and BGP neighbor connections\n"
10506 "Neighbor to display information about\n"
10507 "Neighbor to display information about\n"
10508 "Display routes learned from neighbor\n")
10509{
paulbb46e942003-10-24 19:02:03 +000010510 struct peer *peer;
10511
10512 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10513 if (! peer)
10514 return CMD_WARNING;
10515
10516 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010517 bgp_show_type_neighbor);
10518}
10519
10520DEFUN (show_ip_bgp_neighbor_flap,
10521 show_ip_bgp_neighbor_flap_cmd,
10522 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10523 SHOW_STR
10524 IP_STR
10525 BGP_STR
10526 "Detailed information on TCP and BGP neighbor connections\n"
10527 "Neighbor to display information about\n"
10528 "Neighbor to display information about\n"
10529 "Display flap statistics of the routes learned from neighbor\n")
10530{
paulbb46e942003-10-24 19:02:03 +000010531 struct peer *peer;
10532
10533 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10534 if (! peer)
10535 return CMD_WARNING;
10536
10537 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010538 bgp_show_type_flap_neighbor);
10539}
10540
10541DEFUN (show_ip_bgp_neighbor_damp,
10542 show_ip_bgp_neighbor_damp_cmd,
10543 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10544 SHOW_STR
10545 IP_STR
10546 BGP_STR
10547 "Detailed information on TCP and BGP neighbor connections\n"
10548 "Neighbor to display information about\n"
10549 "Neighbor to display information about\n"
10550 "Display the dampened routes received from neighbor\n")
10551{
paulbb46e942003-10-24 19:02:03 +000010552 struct peer *peer;
10553
10554 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10555 if (! peer)
10556 return CMD_WARNING;
10557
10558 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010559 bgp_show_type_damp_neighbor);
10560}
10561
10562DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10563 show_ip_bgp_ipv4_neighbor_routes_cmd,
10564 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10565 SHOW_STR
10566 IP_STR
10567 BGP_STR
10568 "Address family\n"
10569 "Address Family modifier\n"
10570 "Address Family modifier\n"
10571 "Detailed information on TCP and BGP neighbor connections\n"
10572 "Neighbor to display information about\n"
10573 "Neighbor to display information about\n"
10574 "Display routes learned from neighbor\n")
10575{
paulbb46e942003-10-24 19:02:03 +000010576 struct peer *peer;
10577
10578 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10579 if (! peer)
10580 return CMD_WARNING;
10581
paul718e3742002-12-13 20:15:29 +000010582 if (strncmp (argv[0], "m", 1) == 0)
paulbb46e942003-10-24 19:02:03 +000010583 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000010584 bgp_show_type_neighbor);
10585
paulbb46e942003-10-24 19:02:03 +000010586 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010587 bgp_show_type_neighbor);
10588}
paulbb46e942003-10-24 19:02:03 +000010589
paulfee0f4c2004-09-13 05:12:46 +000010590DEFUN (show_ip_bgp_view_rsclient,
10591 show_ip_bgp_view_rsclient_cmd,
10592 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10593 SHOW_STR
10594 IP_STR
10595 BGP_STR
10596 "BGP view\n"
10597 "BGP view name\n"
10598 "Information about Route Server Client\n"
10599 NEIGHBOR_ADDR_STR)
10600{
10601 struct bgp_table *table;
10602 struct peer *peer;
10603
10604 if (argc == 2)
10605 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10606 else
10607 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10608
10609 if (! peer)
10610 return CMD_WARNING;
10611
10612 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10613 {
10614 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10615 VTY_NEWLINE);
10616 return CMD_WARNING;
10617 }
10618
10619 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10620 PEER_FLAG_RSERVER_CLIENT))
10621 {
10622 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10623 VTY_NEWLINE);
10624 return CMD_WARNING;
10625 }
10626
10627 table = peer->rib[AFI_IP][SAFI_UNICAST];
10628
ajs5a646652004-11-05 01:25:55 +000010629 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000010630}
10631
10632ALIAS (show_ip_bgp_view_rsclient,
10633 show_ip_bgp_rsclient_cmd,
10634 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10635 SHOW_STR
10636 IP_STR
10637 BGP_STR
10638 "Information about Route Server Client\n"
10639 NEIGHBOR_ADDR_STR)
10640
Michael Lambert95cbbd22010-07-23 14:43:04 -040010641DEFUN (show_bgp_view_ipv4_safi_rsclient,
10642 show_bgp_view_ipv4_safi_rsclient_cmd,
10643 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10644 SHOW_STR
10645 BGP_STR
10646 "BGP view\n"
10647 "BGP view name\n"
10648 "Address family\n"
10649 "Address Family modifier\n"
10650 "Address Family modifier\n"
10651 "Information about Route Server Client\n"
10652 NEIGHBOR_ADDR_STR)
10653{
10654 struct bgp_table *table;
10655 struct peer *peer;
10656 safi_t safi;
10657
10658 if (argc == 3) {
10659 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10660 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10661 } else {
10662 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10663 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10664 }
10665
10666 if (! peer)
10667 return CMD_WARNING;
10668
10669 if (! peer->afc[AFI_IP][safi])
10670 {
10671 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10672 VTY_NEWLINE);
10673 return CMD_WARNING;
10674 }
10675
10676 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10677 PEER_FLAG_RSERVER_CLIENT))
10678 {
10679 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10680 VTY_NEWLINE);
10681 return CMD_WARNING;
10682 }
10683
10684 table = peer->rib[AFI_IP][safi];
10685
10686 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10687}
10688
10689ALIAS (show_bgp_view_ipv4_safi_rsclient,
10690 show_bgp_ipv4_safi_rsclient_cmd,
10691 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10692 SHOW_STR
10693 BGP_STR
10694 "Address family\n"
10695 "Address Family modifier\n"
10696 "Address Family modifier\n"
10697 "Information about Route Server Client\n"
10698 NEIGHBOR_ADDR_STR)
10699
paulfee0f4c2004-09-13 05:12:46 +000010700DEFUN (show_ip_bgp_view_rsclient_route,
10701 show_ip_bgp_view_rsclient_route_cmd,
Michael Lamberta8bf6f52008-09-24 17:23:11 +010010702 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
paulfee0f4c2004-09-13 05:12:46 +000010703 SHOW_STR
10704 IP_STR
10705 BGP_STR
10706 "BGP view\n"
10707 "BGP view name\n"
10708 "Information about Route Server Client\n"
10709 NEIGHBOR_ADDR_STR
10710 "Network in the BGP routing table to display\n")
10711{
10712 struct bgp *bgp;
10713 struct peer *peer;
10714
10715 /* BGP structure lookup. */
10716 if (argc == 3)
10717 {
10718 bgp = bgp_lookup_by_name (argv[0]);
10719 if (bgp == NULL)
10720 {
10721 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10722 return CMD_WARNING;
10723 }
10724 }
10725 else
10726 {
10727 bgp = bgp_get_default ();
10728 if (bgp == NULL)
10729 {
10730 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10731 return CMD_WARNING;
10732 }
10733 }
10734
10735 if (argc == 3)
10736 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10737 else
10738 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10739
10740 if (! peer)
10741 return CMD_WARNING;
10742
10743 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10744 {
10745 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10746 VTY_NEWLINE);
10747 return CMD_WARNING;
10748}
10749
10750 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10751 PEER_FLAG_RSERVER_CLIENT))
10752 {
10753 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10754 VTY_NEWLINE);
10755 return CMD_WARNING;
10756 }
10757
10758 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10759 (argc == 3) ? argv[2] : argv[1],
10760 AFI_IP, SAFI_UNICAST, NULL, 0);
10761}
10762
10763ALIAS (show_ip_bgp_view_rsclient_route,
10764 show_ip_bgp_rsclient_route_cmd,
10765 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10766 SHOW_STR
10767 IP_STR
10768 BGP_STR
10769 "Information about Route Server Client\n"
10770 NEIGHBOR_ADDR_STR
10771 "Network in the BGP routing table to display\n")
10772
Michael Lambert95cbbd22010-07-23 14:43:04 -040010773DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
10774 show_bgp_view_ipv4_safi_rsclient_route_cmd,
10775 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10776 SHOW_STR
10777 BGP_STR
10778 "BGP view\n"
10779 "BGP view name\n"
10780 "Address family\n"
10781 "Address Family modifier\n"
10782 "Address Family modifier\n"
10783 "Information about Route Server Client\n"
10784 NEIGHBOR_ADDR_STR
10785 "Network in the BGP routing table to display\n")
10786{
10787 struct bgp *bgp;
10788 struct peer *peer;
10789 safi_t safi;
10790
10791 /* BGP structure lookup. */
10792 if (argc == 4)
10793 {
10794 bgp = bgp_lookup_by_name (argv[0]);
10795 if (bgp == NULL)
10796 {
10797 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10798 return CMD_WARNING;
10799 }
10800 }
10801 else
10802 {
10803 bgp = bgp_get_default ();
10804 if (bgp == NULL)
10805 {
10806 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10807 return CMD_WARNING;
10808 }
10809 }
10810
10811 if (argc == 4) {
10812 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10813 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10814 } else {
10815 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10816 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10817 }
10818
10819 if (! peer)
10820 return CMD_WARNING;
10821
10822 if (! peer->afc[AFI_IP][safi])
10823 {
10824 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10825 VTY_NEWLINE);
10826 return CMD_WARNING;
10827}
10828
10829 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10830 PEER_FLAG_RSERVER_CLIENT))
10831 {
10832 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10833 VTY_NEWLINE);
10834 return CMD_WARNING;
10835 }
10836
10837 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10838 (argc == 4) ? argv[3] : argv[2],
10839 AFI_IP, safi, NULL, 0);
10840}
10841
10842ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
10843 show_bgp_ipv4_safi_rsclient_route_cmd,
10844 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10845 SHOW_STR
10846 BGP_STR
10847 "Address family\n"
10848 "Address Family modifier\n"
10849 "Address Family modifier\n"
10850 "Information about Route Server Client\n"
10851 NEIGHBOR_ADDR_STR
10852 "Network in the BGP routing table to display\n")
10853
paulfee0f4c2004-09-13 05:12:46 +000010854DEFUN (show_ip_bgp_view_rsclient_prefix,
10855 show_ip_bgp_view_rsclient_prefix_cmd,
10856 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10857 SHOW_STR
10858 IP_STR
10859 BGP_STR
10860 "BGP view\n"
10861 "BGP view name\n"
10862 "Information about Route Server Client\n"
10863 NEIGHBOR_ADDR_STR
10864 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10865{
10866 struct bgp *bgp;
10867 struct peer *peer;
10868
10869 /* BGP structure lookup. */
10870 if (argc == 3)
10871 {
10872 bgp = bgp_lookup_by_name (argv[0]);
10873 if (bgp == NULL)
10874 {
10875 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10876 return CMD_WARNING;
10877 }
10878 }
10879 else
10880 {
10881 bgp = bgp_get_default ();
10882 if (bgp == NULL)
10883 {
10884 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10885 return CMD_WARNING;
10886 }
10887 }
10888
10889 if (argc == 3)
10890 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10891 else
10892 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10893
10894 if (! peer)
10895 return CMD_WARNING;
10896
10897 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10898 {
10899 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10900 VTY_NEWLINE);
10901 return CMD_WARNING;
10902}
10903
10904 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10905 PEER_FLAG_RSERVER_CLIENT))
10906{
10907 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10908 VTY_NEWLINE);
10909 return CMD_WARNING;
10910 }
10911
10912 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10913 (argc == 3) ? argv[2] : argv[1],
10914 AFI_IP, SAFI_UNICAST, NULL, 1);
10915}
10916
10917ALIAS (show_ip_bgp_view_rsclient_prefix,
10918 show_ip_bgp_rsclient_prefix_cmd,
10919 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10920 SHOW_STR
10921 IP_STR
10922 BGP_STR
10923 "Information about Route Server Client\n"
10924 NEIGHBOR_ADDR_STR
10925 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10926
Michael Lambert95cbbd22010-07-23 14:43:04 -040010927DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
10928 show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
10929 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10930 SHOW_STR
10931 BGP_STR
10932 "BGP view\n"
10933 "BGP view name\n"
10934 "Address family\n"
10935 "Address Family modifier\n"
10936 "Address Family modifier\n"
10937 "Information about Route Server Client\n"
10938 NEIGHBOR_ADDR_STR
10939 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10940{
10941 struct bgp *bgp;
10942 struct peer *peer;
10943 safi_t safi;
10944
10945 /* BGP structure lookup. */
10946 if (argc == 4)
10947 {
10948 bgp = bgp_lookup_by_name (argv[0]);
10949 if (bgp == NULL)
10950 {
10951 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10952 return CMD_WARNING;
10953 }
10954 }
10955 else
10956 {
10957 bgp = bgp_get_default ();
10958 if (bgp == NULL)
10959 {
10960 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10961 return CMD_WARNING;
10962 }
10963 }
10964
10965 if (argc == 4) {
10966 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10967 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10968 } else {
10969 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10970 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10971 }
10972
10973 if (! peer)
10974 return CMD_WARNING;
10975
10976 if (! peer->afc[AFI_IP][safi])
10977 {
10978 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10979 VTY_NEWLINE);
10980 return CMD_WARNING;
10981}
10982
10983 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10984 PEER_FLAG_RSERVER_CLIENT))
10985{
10986 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10987 VTY_NEWLINE);
10988 return CMD_WARNING;
10989 }
10990
10991 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10992 (argc == 4) ? argv[3] : argv[2],
10993 AFI_IP, safi, NULL, 1);
10994}
10995
10996ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
10997 show_bgp_ipv4_safi_rsclient_prefix_cmd,
10998 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10999 SHOW_STR
11000 BGP_STR
11001 "Address family\n"
11002 "Address Family modifier\n"
11003 "Address Family modifier\n"
11004 "Information about Route Server Client\n"
11005 NEIGHBOR_ADDR_STR
11006 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
paulfee0f4c2004-09-13 05:12:46 +000011007
paul718e3742002-12-13 20:15:29 +000011008#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000011009DEFUN (show_bgp_view_neighbor_routes,
11010 show_bgp_view_neighbor_routes_cmd,
11011 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
11012 SHOW_STR
11013 BGP_STR
11014 "BGP view\n"
11015 "BGP view name\n"
11016 "Detailed information on TCP and BGP neighbor connections\n"
11017 "Neighbor to display information about\n"
11018 "Neighbor to display information about\n"
11019 "Display routes learned from neighbor\n")
11020{
11021 struct peer *peer;
11022
11023 if (argc == 2)
11024 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11025 else
11026 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11027
11028 if (! peer)
11029 return CMD_WARNING;
11030
11031 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
11032 bgp_show_type_neighbor);
11033}
11034
11035ALIAS (show_bgp_view_neighbor_routes,
11036 show_bgp_view_ipv6_neighbor_routes_cmd,
11037 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
11038 SHOW_STR
11039 BGP_STR
11040 "BGP view\n"
11041 "BGP view name\n"
11042 "Address family\n"
11043 "Detailed information on TCP and BGP neighbor connections\n"
11044 "Neighbor to display information about\n"
11045 "Neighbor to display information about\n"
11046 "Display routes learned from neighbor\n")
11047
11048DEFUN (show_bgp_view_neighbor_damp,
11049 show_bgp_view_neighbor_damp_cmd,
11050 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11051 SHOW_STR
11052 BGP_STR
11053 "BGP view\n"
11054 "BGP view name\n"
11055 "Detailed information on TCP and BGP neighbor connections\n"
11056 "Neighbor to display information about\n"
11057 "Neighbor to display information about\n"
11058 "Display the dampened routes received from neighbor\n")
11059{
11060 struct peer *peer;
11061
11062 if (argc == 2)
11063 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11064 else
11065 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11066
11067 if (! peer)
11068 return CMD_WARNING;
11069
11070 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
11071 bgp_show_type_damp_neighbor);
11072}
11073
11074ALIAS (show_bgp_view_neighbor_damp,
11075 show_bgp_view_ipv6_neighbor_damp_cmd,
11076 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11077 SHOW_STR
11078 BGP_STR
11079 "BGP view\n"
11080 "BGP view name\n"
11081 "Address family\n"
11082 "Detailed information on TCP and BGP neighbor connections\n"
11083 "Neighbor to display information about\n"
11084 "Neighbor to display information about\n"
11085 "Display the dampened routes received from neighbor\n")
11086
11087DEFUN (show_bgp_view_neighbor_flap,
11088 show_bgp_view_neighbor_flap_cmd,
11089 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11090 SHOW_STR
11091 BGP_STR
11092 "BGP view\n"
11093 "BGP view name\n"
11094 "Detailed information on TCP and BGP neighbor connections\n"
11095 "Neighbor to display information about\n"
11096 "Neighbor to display information about\n"
11097 "Display flap statistics of the routes learned from neighbor\n")
11098{
11099 struct peer *peer;
11100
11101 if (argc == 2)
11102 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11103 else
11104 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11105
11106 if (! peer)
11107 return CMD_WARNING;
11108
11109 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
11110 bgp_show_type_flap_neighbor);
11111}
11112
11113ALIAS (show_bgp_view_neighbor_flap,
11114 show_bgp_view_ipv6_neighbor_flap_cmd,
11115 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11116 SHOW_STR
11117 BGP_STR
11118 "BGP view\n"
11119 "BGP view name\n"
11120 "Address family\n"
11121 "Detailed information on TCP and BGP neighbor connections\n"
11122 "Neighbor to display information about\n"
11123 "Neighbor to display information about\n"
11124 "Display flap statistics of the routes learned from neighbor\n")
11125
11126ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011127 show_bgp_neighbor_routes_cmd,
11128 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
11129 SHOW_STR
11130 BGP_STR
11131 "Detailed information on TCP and BGP neighbor connections\n"
11132 "Neighbor to display information about\n"
11133 "Neighbor to display information about\n"
11134 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011135
paulbb46e942003-10-24 19:02:03 +000011136
11137ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011138 show_bgp_ipv6_neighbor_routes_cmd,
11139 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
11140 SHOW_STR
11141 BGP_STR
11142 "Address family\n"
11143 "Detailed information on TCP and BGP neighbor connections\n"
11144 "Neighbor to display information about\n"
11145 "Neighbor to display information about\n"
11146 "Display routes learned from neighbor\n")
11147
11148/* old command */
paulbb46e942003-10-24 19:02:03 +000011149ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011150 ipv6_bgp_neighbor_routes_cmd,
11151 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
11152 SHOW_STR
11153 IPV6_STR
11154 BGP_STR
11155 "Detailed information on TCP and BGP neighbor connections\n"
11156 "Neighbor to display information about\n"
11157 "Neighbor to display information about\n"
11158 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011159
11160/* old command */
11161DEFUN (ipv6_mbgp_neighbor_routes,
11162 ipv6_mbgp_neighbor_routes_cmd,
11163 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
11164 SHOW_STR
11165 IPV6_STR
11166 MBGP_STR
11167 "Detailed information on TCP and BGP neighbor connections\n"
11168 "Neighbor to display information about\n"
11169 "Neighbor to display information about\n"
11170 "Display routes learned from neighbor\n")
11171{
paulbb46e942003-10-24 19:02:03 +000011172 struct peer *peer;
11173
11174 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11175 if (! peer)
11176 return CMD_WARNING;
11177
11178 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000011179 bgp_show_type_neighbor);
11180}
paulbb46e942003-10-24 19:02:03 +000011181
11182ALIAS (show_bgp_view_neighbor_flap,
11183 show_bgp_neighbor_flap_cmd,
11184 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11185 SHOW_STR
11186 BGP_STR
11187 "Detailed information on TCP and BGP neighbor connections\n"
11188 "Neighbor to display information about\n"
11189 "Neighbor to display information about\n"
11190 "Display flap statistics of the routes learned from neighbor\n")
11191
11192ALIAS (show_bgp_view_neighbor_flap,
11193 show_bgp_ipv6_neighbor_flap_cmd,
11194 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11195 SHOW_STR
11196 BGP_STR
11197 "Address family\n"
11198 "Detailed information on TCP and BGP neighbor connections\n"
11199 "Neighbor to display information about\n"
11200 "Neighbor to display information about\n"
11201 "Display flap statistics of the routes learned from neighbor\n")
11202
11203ALIAS (show_bgp_view_neighbor_damp,
11204 show_bgp_neighbor_damp_cmd,
11205 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11206 SHOW_STR
11207 BGP_STR
11208 "Detailed information on TCP and BGP neighbor connections\n"
11209 "Neighbor to display information about\n"
11210 "Neighbor to display information about\n"
11211 "Display the dampened routes received from neighbor\n")
11212
11213ALIAS (show_bgp_view_neighbor_damp,
11214 show_bgp_ipv6_neighbor_damp_cmd,
11215 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11216 SHOW_STR
11217 BGP_STR
11218 "Address family\n"
11219 "Detailed information on TCP and BGP neighbor connections\n"
11220 "Neighbor to display information about\n"
11221 "Neighbor to display information about\n"
paulc001ae62003-11-03 12:37:43 +000011222 "Display the dampened routes received from neighbor\n")
paulfee0f4c2004-09-13 05:12:46 +000011223
11224DEFUN (show_bgp_view_rsclient,
11225 show_bgp_view_rsclient_cmd,
11226 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
11227 SHOW_STR
11228 BGP_STR
11229 "BGP view\n"
11230 "BGP view name\n"
11231 "Information about Route Server Client\n"
11232 NEIGHBOR_ADDR_STR)
11233{
11234 struct bgp_table *table;
11235 struct peer *peer;
11236
11237 if (argc == 2)
11238 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11239 else
11240 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11241
11242 if (! peer)
11243 return CMD_WARNING;
11244
11245 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11246 {
11247 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11248 VTY_NEWLINE);
11249 return CMD_WARNING;
11250 }
11251
11252 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11253 PEER_FLAG_RSERVER_CLIENT))
11254 {
11255 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11256 VTY_NEWLINE);
11257 return CMD_WARNING;
11258 }
11259
11260 table = peer->rib[AFI_IP6][SAFI_UNICAST];
11261
ajs5a646652004-11-05 01:25:55 +000011262 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000011263}
11264
11265ALIAS (show_bgp_view_rsclient,
11266 show_bgp_rsclient_cmd,
11267 "show bgp rsclient (A.B.C.D|X:X::X:X)",
11268 SHOW_STR
11269 BGP_STR
11270 "Information about Route Server Client\n"
11271 NEIGHBOR_ADDR_STR)
11272
Michael Lambert95cbbd22010-07-23 14:43:04 -040011273DEFUN (show_bgp_view_ipv6_safi_rsclient,
11274 show_bgp_view_ipv6_safi_rsclient_cmd,
11275 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11276 SHOW_STR
11277 BGP_STR
11278 "BGP view\n"
11279 "BGP view name\n"
11280 "Address family\n"
11281 "Address Family modifier\n"
11282 "Address Family modifier\n"
11283 "Information about Route Server Client\n"
11284 NEIGHBOR_ADDR_STR)
11285{
11286 struct bgp_table *table;
11287 struct peer *peer;
11288 safi_t safi;
11289
11290 if (argc == 3) {
11291 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11292 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11293 } else {
11294 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11295 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11296 }
11297
11298 if (! peer)
11299 return CMD_WARNING;
11300
11301 if (! peer->afc[AFI_IP6][safi])
11302 {
11303 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11304 VTY_NEWLINE);
11305 return CMD_WARNING;
11306 }
11307
11308 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11309 PEER_FLAG_RSERVER_CLIENT))
11310 {
11311 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11312 VTY_NEWLINE);
11313 return CMD_WARNING;
11314 }
11315
11316 table = peer->rib[AFI_IP6][safi];
11317
11318 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
11319}
11320
11321ALIAS (show_bgp_view_ipv6_safi_rsclient,
11322 show_bgp_ipv6_safi_rsclient_cmd,
11323 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11324 SHOW_STR
11325 BGP_STR
11326 "Address family\n"
11327 "Address Family modifier\n"
11328 "Address Family modifier\n"
11329 "Information about Route Server Client\n"
11330 NEIGHBOR_ADDR_STR)
11331
paulfee0f4c2004-09-13 05:12:46 +000011332DEFUN (show_bgp_view_rsclient_route,
11333 show_bgp_view_rsclient_route_cmd,
11334 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11335 SHOW_STR
11336 BGP_STR
11337 "BGP view\n"
11338 "BGP view name\n"
11339 "Information about Route Server Client\n"
11340 NEIGHBOR_ADDR_STR
11341 "Network in the BGP routing table to display\n")
11342{
11343 struct bgp *bgp;
11344 struct peer *peer;
11345
11346 /* BGP structure lookup. */
11347 if (argc == 3)
11348 {
11349 bgp = bgp_lookup_by_name (argv[0]);
11350 if (bgp == NULL)
11351 {
11352 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11353 return CMD_WARNING;
11354 }
11355 }
11356 else
11357 {
11358 bgp = bgp_get_default ();
11359 if (bgp == NULL)
11360 {
11361 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11362 return CMD_WARNING;
11363 }
11364 }
11365
11366 if (argc == 3)
11367 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11368 else
11369 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11370
11371 if (! peer)
11372 return CMD_WARNING;
11373
11374 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11375 {
11376 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11377 VTY_NEWLINE);
11378 return CMD_WARNING;
11379 }
11380
11381 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11382 PEER_FLAG_RSERVER_CLIENT))
11383 {
11384 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11385 VTY_NEWLINE);
11386 return CMD_WARNING;
11387 }
11388
11389 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11390 (argc == 3) ? argv[2] : argv[1],
11391 AFI_IP6, SAFI_UNICAST, NULL, 0);
11392}
11393
11394ALIAS (show_bgp_view_rsclient_route,
11395 show_bgp_rsclient_route_cmd,
11396 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11397 SHOW_STR
11398 BGP_STR
11399 "Information about Route Server Client\n"
11400 NEIGHBOR_ADDR_STR
11401 "Network in the BGP routing table to display\n")
11402
Michael Lambert95cbbd22010-07-23 14:43:04 -040011403DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
11404 show_bgp_view_ipv6_safi_rsclient_route_cmd,
11405 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11406 SHOW_STR
11407 BGP_STR
11408 "BGP view\n"
11409 "BGP view name\n"
11410 "Address family\n"
11411 "Address Family modifier\n"
11412 "Address Family modifier\n"
11413 "Information about Route Server Client\n"
11414 NEIGHBOR_ADDR_STR
11415 "Network in the BGP routing table to display\n")
11416{
11417 struct bgp *bgp;
11418 struct peer *peer;
11419 safi_t safi;
11420
11421 /* BGP structure lookup. */
11422 if (argc == 4)
11423 {
11424 bgp = bgp_lookup_by_name (argv[0]);
11425 if (bgp == NULL)
11426 {
11427 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11428 return CMD_WARNING;
11429 }
11430 }
11431 else
11432 {
11433 bgp = bgp_get_default ();
11434 if (bgp == NULL)
11435 {
11436 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11437 return CMD_WARNING;
11438 }
11439 }
11440
11441 if (argc == 4) {
11442 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11443 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11444 } else {
11445 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11446 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11447 }
11448
11449 if (! peer)
11450 return CMD_WARNING;
11451
11452 if (! peer->afc[AFI_IP6][safi])
11453 {
11454 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11455 VTY_NEWLINE);
11456 return CMD_WARNING;
11457}
11458
11459 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11460 PEER_FLAG_RSERVER_CLIENT))
11461 {
11462 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11463 VTY_NEWLINE);
11464 return CMD_WARNING;
11465 }
11466
11467 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11468 (argc == 4) ? argv[3] : argv[2],
11469 AFI_IP6, safi, NULL, 0);
11470}
11471
11472ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
11473 show_bgp_ipv6_safi_rsclient_route_cmd,
11474 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11475 SHOW_STR
11476 BGP_STR
11477 "Address family\n"
11478 "Address Family modifier\n"
11479 "Address Family modifier\n"
11480 "Information about Route Server Client\n"
11481 NEIGHBOR_ADDR_STR
11482 "Network in the BGP routing table to display\n")
11483
paulfee0f4c2004-09-13 05:12:46 +000011484DEFUN (show_bgp_view_rsclient_prefix,
11485 show_bgp_view_rsclient_prefix_cmd,
11486 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11487 SHOW_STR
11488 BGP_STR
11489 "BGP view\n"
11490 "BGP view name\n"
11491 "Information about Route Server Client\n"
11492 NEIGHBOR_ADDR_STR
11493 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11494{
11495 struct bgp *bgp;
11496 struct peer *peer;
11497
11498 /* BGP structure lookup. */
11499 if (argc == 3)
11500 {
11501 bgp = bgp_lookup_by_name (argv[0]);
11502 if (bgp == NULL)
11503 {
11504 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11505 return CMD_WARNING;
11506 }
11507 }
11508 else
11509 {
11510 bgp = bgp_get_default ();
11511 if (bgp == NULL)
11512 {
11513 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11514 return CMD_WARNING;
11515 }
11516 }
11517
11518 if (argc == 3)
11519 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11520 else
11521 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11522
11523 if (! peer)
11524 return CMD_WARNING;
11525
11526 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11527 {
11528 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11529 VTY_NEWLINE);
11530 return CMD_WARNING;
11531 }
11532
11533 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11534 PEER_FLAG_RSERVER_CLIENT))
11535 {
11536 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11537 VTY_NEWLINE);
11538 return CMD_WARNING;
11539 }
11540
11541 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11542 (argc == 3) ? argv[2] : argv[1],
11543 AFI_IP6, SAFI_UNICAST, NULL, 1);
11544}
11545
11546ALIAS (show_bgp_view_rsclient_prefix,
11547 show_bgp_rsclient_prefix_cmd,
11548 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11549 SHOW_STR
11550 BGP_STR
11551 "Information about Route Server Client\n"
11552 NEIGHBOR_ADDR_STR
11553 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11554
Michael Lambert95cbbd22010-07-23 14:43:04 -040011555DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
11556 show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
11557 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11558 SHOW_STR
11559 BGP_STR
11560 "BGP view\n"
11561 "BGP view name\n"
11562 "Address family\n"
11563 "Address Family modifier\n"
11564 "Address Family modifier\n"
11565 "Information about Route Server Client\n"
11566 NEIGHBOR_ADDR_STR
11567 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11568{
11569 struct bgp *bgp;
11570 struct peer *peer;
11571 safi_t safi;
11572
11573 /* BGP structure lookup. */
11574 if (argc == 4)
11575 {
11576 bgp = bgp_lookup_by_name (argv[0]);
11577 if (bgp == NULL)
11578 {
11579 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11580 return CMD_WARNING;
11581 }
11582 }
11583 else
11584 {
11585 bgp = bgp_get_default ();
11586 if (bgp == NULL)
11587 {
11588 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11589 return CMD_WARNING;
11590 }
11591 }
11592
11593 if (argc == 4) {
11594 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11595 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11596 } else {
11597 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11598 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11599 }
11600
11601 if (! peer)
11602 return CMD_WARNING;
11603
11604 if (! peer->afc[AFI_IP6][safi])
11605 {
11606 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11607 VTY_NEWLINE);
11608 return CMD_WARNING;
11609}
11610
11611 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11612 PEER_FLAG_RSERVER_CLIENT))
11613{
11614 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11615 VTY_NEWLINE);
11616 return CMD_WARNING;
11617 }
11618
11619 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11620 (argc == 4) ? argv[3] : argv[2],
11621 AFI_IP6, safi, NULL, 1);
11622}
11623
11624ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
11625 show_bgp_ipv6_safi_rsclient_prefix_cmd,
11626 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11627 SHOW_STR
11628 BGP_STR
11629 "Address family\n"
11630 "Address Family modifier\n"
11631 "Address Family modifier\n"
11632 "Information about Route Server Client\n"
11633 NEIGHBOR_ADDR_STR
11634 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11635
paul718e3742002-12-13 20:15:29 +000011636#endif /* HAVE_IPV6 */
11637
11638struct bgp_table *bgp_distance_table;
11639
11640struct bgp_distance
11641{
11642 /* Distance value for the IP source prefix. */
11643 u_char distance;
11644
11645 /* Name of the access-list to be matched. */
11646 char *access_list;
11647};
11648
paul94f2b392005-06-28 12:44:16 +000011649static struct bgp_distance *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080011650bgp_distance_new (void)
paul718e3742002-12-13 20:15:29 +000011651{
Stephen Hemminger393deb92008-08-18 14:13:29 -070011652 return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
paul718e3742002-12-13 20:15:29 +000011653}
11654
paul94f2b392005-06-28 12:44:16 +000011655static void
paul718e3742002-12-13 20:15:29 +000011656bgp_distance_free (struct bgp_distance *bdistance)
11657{
11658 XFREE (MTYPE_BGP_DISTANCE, bdistance);
11659}
11660
paul94f2b392005-06-28 12:44:16 +000011661static int
paulfd79ac92004-10-13 05:06:08 +000011662bgp_distance_set (struct vty *vty, const char *distance_str,
11663 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011664{
11665 int ret;
11666 struct prefix_ipv4 p;
11667 u_char distance;
11668 struct bgp_node *rn;
11669 struct bgp_distance *bdistance;
11670
11671 ret = str2prefix_ipv4 (ip_str, &p);
11672 if (ret == 0)
11673 {
11674 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11675 return CMD_WARNING;
11676 }
11677
11678 distance = atoi (distance_str);
11679
11680 /* Get BGP distance node. */
11681 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
11682 if (rn->info)
11683 {
11684 bdistance = rn->info;
11685 bgp_unlock_node (rn);
11686 }
11687 else
11688 {
11689 bdistance = bgp_distance_new ();
11690 rn->info = bdistance;
11691 }
11692
11693 /* Set distance value. */
11694 bdistance->distance = distance;
11695
11696 /* Reset access-list configuration. */
11697 if (bdistance->access_list)
11698 {
11699 free (bdistance->access_list);
11700 bdistance->access_list = NULL;
11701 }
11702 if (access_list_str)
11703 bdistance->access_list = strdup (access_list_str);
11704
11705 return CMD_SUCCESS;
11706}
11707
paul94f2b392005-06-28 12:44:16 +000011708static int
paulfd79ac92004-10-13 05:06:08 +000011709bgp_distance_unset (struct vty *vty, const char *distance_str,
11710 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011711{
11712 int ret;
11713 struct prefix_ipv4 p;
11714 u_char distance;
11715 struct bgp_node *rn;
11716 struct bgp_distance *bdistance;
11717
11718 ret = str2prefix_ipv4 (ip_str, &p);
11719 if (ret == 0)
11720 {
11721 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11722 return CMD_WARNING;
11723 }
11724
11725 distance = atoi (distance_str);
11726
11727 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
11728 if (! rn)
11729 {
11730 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
11731 return CMD_WARNING;
11732 }
11733
11734 bdistance = rn->info;
11735
11736 if (bdistance->access_list)
11737 free (bdistance->access_list);
11738 bgp_distance_free (bdistance);
11739
11740 rn->info = NULL;
11741 bgp_unlock_node (rn);
11742 bgp_unlock_node (rn);
11743
11744 return CMD_SUCCESS;
11745}
11746
paul718e3742002-12-13 20:15:29 +000011747/* Apply BGP information to distance method. */
11748u_char
11749bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
11750{
11751 struct bgp_node *rn;
11752 struct prefix_ipv4 q;
11753 struct peer *peer;
11754 struct bgp_distance *bdistance;
11755 struct access_list *alist;
11756 struct bgp_static *bgp_static;
11757
11758 if (! bgp)
11759 return 0;
11760
11761 if (p->family != AF_INET)
11762 return 0;
11763
11764 peer = rinfo->peer;
11765
11766 if (peer->su.sa.sa_family != AF_INET)
11767 return 0;
11768
11769 memset (&q, 0, sizeof (struct prefix_ipv4));
11770 q.family = AF_INET;
11771 q.prefix = peer->su.sin.sin_addr;
11772 q.prefixlen = IPV4_MAX_BITLEN;
11773
11774 /* Check source address. */
11775 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11776 if (rn)
11777 {
11778 bdistance = rn->info;
11779 bgp_unlock_node (rn);
11780
11781 if (bdistance->access_list)
11782 {
11783 alist = access_list_lookup (AFI_IP, bdistance->access_list);
11784 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11785 return bdistance->distance;
11786 }
11787 else
11788 return bdistance->distance;
11789 }
11790
11791 /* Backdoor check. */
11792 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11793 if (rn)
11794 {
11795 bgp_static = rn->info;
11796 bgp_unlock_node (rn);
11797
11798 if (bgp_static->backdoor)
11799 {
11800 if (bgp->distance_local)
11801 return bgp->distance_local;
11802 else
11803 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11804 }
11805 }
11806
Jorge Boncompte [DTI2]6d85b152012-05-07 16:52:54 +000011807 if (peer->sort == BGP_PEER_EBGP)
paul718e3742002-12-13 20:15:29 +000011808 {
11809 if (bgp->distance_ebgp)
11810 return bgp->distance_ebgp;
11811 return ZEBRA_EBGP_DISTANCE_DEFAULT;
11812 }
11813 else
11814 {
11815 if (bgp->distance_ibgp)
11816 return bgp->distance_ibgp;
11817 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11818 }
11819}
11820
11821DEFUN (bgp_distance,
11822 bgp_distance_cmd,
11823 "distance bgp <1-255> <1-255> <1-255>",
11824 "Define an administrative distance\n"
11825 "BGP distance\n"
11826 "Distance for routes external to the AS\n"
11827 "Distance for routes internal to the AS\n"
11828 "Distance for local routes\n")
11829{
11830 struct bgp *bgp;
11831
11832 bgp = vty->index;
11833
11834 bgp->distance_ebgp = atoi (argv[0]);
11835 bgp->distance_ibgp = atoi (argv[1]);
11836 bgp->distance_local = atoi (argv[2]);
11837 return CMD_SUCCESS;
11838}
11839
11840DEFUN (no_bgp_distance,
11841 no_bgp_distance_cmd,
11842 "no distance bgp <1-255> <1-255> <1-255>",
11843 NO_STR
11844 "Define an administrative distance\n"
11845 "BGP distance\n"
11846 "Distance for routes external to the AS\n"
11847 "Distance for routes internal to the AS\n"
11848 "Distance for local routes\n")
11849{
11850 struct bgp *bgp;
11851
11852 bgp = vty->index;
11853
11854 bgp->distance_ebgp= 0;
11855 bgp->distance_ibgp = 0;
11856 bgp->distance_local = 0;
11857 return CMD_SUCCESS;
11858}
11859
11860ALIAS (no_bgp_distance,
11861 no_bgp_distance2_cmd,
11862 "no distance bgp",
11863 NO_STR
11864 "Define an administrative distance\n"
11865 "BGP distance\n")
11866
11867DEFUN (bgp_distance_source,
11868 bgp_distance_source_cmd,
11869 "distance <1-255> A.B.C.D/M",
11870 "Define an administrative distance\n"
11871 "Administrative distance\n"
11872 "IP source prefix\n")
11873{
11874 bgp_distance_set (vty, argv[0], argv[1], NULL);
11875 return CMD_SUCCESS;
11876}
11877
11878DEFUN (no_bgp_distance_source,
11879 no_bgp_distance_source_cmd,
11880 "no distance <1-255> A.B.C.D/M",
11881 NO_STR
11882 "Define an administrative distance\n"
11883 "Administrative distance\n"
11884 "IP source prefix\n")
11885{
11886 bgp_distance_unset (vty, argv[0], argv[1], NULL);
11887 return CMD_SUCCESS;
11888}
11889
11890DEFUN (bgp_distance_source_access_list,
11891 bgp_distance_source_access_list_cmd,
11892 "distance <1-255> A.B.C.D/M WORD",
11893 "Define an administrative distance\n"
11894 "Administrative distance\n"
11895 "IP source prefix\n"
11896 "Access list name\n")
11897{
11898 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11899 return CMD_SUCCESS;
11900}
11901
11902DEFUN (no_bgp_distance_source_access_list,
11903 no_bgp_distance_source_access_list_cmd,
11904 "no distance <1-255> A.B.C.D/M WORD",
11905 NO_STR
11906 "Define an administrative distance\n"
11907 "Administrative distance\n"
11908 "IP source prefix\n"
11909 "Access list name\n")
11910{
11911 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11912 return CMD_SUCCESS;
11913}
11914
11915DEFUN (bgp_damp_set,
11916 bgp_damp_set_cmd,
11917 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11918 "BGP Specific commands\n"
11919 "Enable route-flap dampening\n"
11920 "Half-life time for the penalty\n"
11921 "Value to start reusing a route\n"
11922 "Value to start suppressing a route\n"
11923 "Maximum duration to suppress a stable route\n")
11924{
11925 struct bgp *bgp;
11926 int half = DEFAULT_HALF_LIFE * 60;
11927 int reuse = DEFAULT_REUSE;
11928 int suppress = DEFAULT_SUPPRESS;
11929 int max = 4 * half;
11930
11931 if (argc == 4)
11932 {
11933 half = atoi (argv[0]) * 60;
11934 reuse = atoi (argv[1]);
11935 suppress = atoi (argv[2]);
11936 max = atoi (argv[3]) * 60;
11937 }
11938 else if (argc == 1)
11939 {
11940 half = atoi (argv[0]) * 60;
11941 max = 4 * half;
11942 }
11943
11944 bgp = vty->index;
11945 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11946 half, reuse, suppress, max);
11947}
11948
11949ALIAS (bgp_damp_set,
11950 bgp_damp_set2_cmd,
11951 "bgp dampening <1-45>",
11952 "BGP Specific commands\n"
11953 "Enable route-flap dampening\n"
11954 "Half-life time for the penalty\n")
11955
11956ALIAS (bgp_damp_set,
11957 bgp_damp_set3_cmd,
11958 "bgp dampening",
11959 "BGP Specific commands\n"
11960 "Enable route-flap dampening\n")
11961
11962DEFUN (bgp_damp_unset,
11963 bgp_damp_unset_cmd,
11964 "no bgp dampening",
11965 NO_STR
11966 "BGP Specific commands\n"
11967 "Enable route-flap dampening\n")
11968{
11969 struct bgp *bgp;
11970
11971 bgp = vty->index;
11972 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11973}
11974
11975ALIAS (bgp_damp_unset,
11976 bgp_damp_unset2_cmd,
11977 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11978 NO_STR
11979 "BGP Specific commands\n"
11980 "Enable route-flap dampening\n"
11981 "Half-life time for the penalty\n"
11982 "Value to start reusing a route\n"
11983 "Value to start suppressing a route\n"
11984 "Maximum duration to suppress a stable route\n")
11985
11986DEFUN (show_ip_bgp_dampened_paths,
11987 show_ip_bgp_dampened_paths_cmd,
11988 "show ip bgp dampened-paths",
11989 SHOW_STR
11990 IP_STR
11991 BGP_STR
11992 "Display paths suppressed due to dampening\n")
11993{
ajs5a646652004-11-05 01:25:55 +000011994 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11995 NULL);
paul718e3742002-12-13 20:15:29 +000011996}
11997
11998DEFUN (show_ip_bgp_flap_statistics,
11999 show_ip_bgp_flap_statistics_cmd,
12000 "show ip bgp flap-statistics",
12001 SHOW_STR
12002 IP_STR
12003 BGP_STR
12004 "Display flap statistics of routes\n")
12005{
ajs5a646652004-11-05 01:25:55 +000012006 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
12007 bgp_show_type_flap_statistics, NULL);
paul718e3742002-12-13 20:15:29 +000012008}
12009
12010/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +000012011static int
paulfd79ac92004-10-13 05:06:08 +000012012bgp_clear_damp_route (struct vty *vty, const char *view_name,
12013 const char *ip_str, afi_t afi, safi_t safi,
12014 struct prefix_rd *prd, int prefix_check)
paul718e3742002-12-13 20:15:29 +000012015{
12016 int ret;
12017 struct prefix match;
12018 struct bgp_node *rn;
12019 struct bgp_node *rm;
12020 struct bgp_info *ri;
12021 struct bgp_info *ri_temp;
12022 struct bgp *bgp;
12023 struct bgp_table *table;
12024
12025 /* BGP structure lookup. */
12026 if (view_name)
12027 {
12028 bgp = bgp_lookup_by_name (view_name);
12029 if (bgp == NULL)
12030 {
12031 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
12032 return CMD_WARNING;
12033 }
12034 }
12035 else
12036 {
12037 bgp = bgp_get_default ();
12038 if (bgp == NULL)
12039 {
12040 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
12041 return CMD_WARNING;
12042 }
12043 }
12044
12045 /* Check IP address argument. */
12046 ret = str2prefix (ip_str, &match);
12047 if (! ret)
12048 {
12049 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
12050 return CMD_WARNING;
12051 }
12052
12053 match.family = afi2family (afi);
12054
12055 if (safi == SAFI_MPLS_VPN)
12056 {
12057 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
12058 {
12059 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
12060 continue;
12061
12062 if ((table = rn->info) != NULL)
12063 if ((rm = bgp_node_match (table, &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000012064 {
12065 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
12066 {
12067 ri = rm->info;
12068 while (ri)
12069 {
12070 if (ri->extra && ri->extra->damp_info)
12071 {
12072 ri_temp = ri->next;
12073 bgp_damp_info_free (ri->extra->damp_info, 1);
12074 ri = ri_temp;
12075 }
12076 else
12077 ri = ri->next;
12078 }
12079 }
12080
12081 bgp_unlock_node (rm);
12082 }
paul718e3742002-12-13 20:15:29 +000012083 }
12084 }
12085 else
12086 {
12087 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000012088 {
12089 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
12090 {
12091 ri = rn->info;
12092 while (ri)
12093 {
12094 if (ri->extra && ri->extra->damp_info)
12095 {
12096 ri_temp = ri->next;
12097 bgp_damp_info_free (ri->extra->damp_info, 1);
12098 ri = ri_temp;
12099 }
12100 else
12101 ri = ri->next;
12102 }
12103 }
12104
12105 bgp_unlock_node (rn);
12106 }
paul718e3742002-12-13 20:15:29 +000012107 }
12108
12109 return CMD_SUCCESS;
12110}
12111
12112DEFUN (clear_ip_bgp_dampening,
12113 clear_ip_bgp_dampening_cmd,
12114 "clear ip bgp dampening",
12115 CLEAR_STR
12116 IP_STR
12117 BGP_STR
12118 "Clear route flap dampening information\n")
12119{
12120 bgp_damp_info_clean ();
12121 return CMD_SUCCESS;
12122}
12123
12124DEFUN (clear_ip_bgp_dampening_prefix,
12125 clear_ip_bgp_dampening_prefix_cmd,
12126 "clear ip bgp dampening A.B.C.D/M",
12127 CLEAR_STR
12128 IP_STR
12129 BGP_STR
12130 "Clear route flap dampening information\n"
12131 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
12132{
12133 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12134 SAFI_UNICAST, NULL, 1);
12135}
12136
12137DEFUN (clear_ip_bgp_dampening_address,
12138 clear_ip_bgp_dampening_address_cmd,
12139 "clear ip bgp dampening A.B.C.D",
12140 CLEAR_STR
12141 IP_STR
12142 BGP_STR
12143 "Clear route flap dampening information\n"
12144 "Network to clear damping information\n")
12145{
12146 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12147 SAFI_UNICAST, NULL, 0);
12148}
12149
12150DEFUN (clear_ip_bgp_dampening_address_mask,
12151 clear_ip_bgp_dampening_address_mask_cmd,
12152 "clear ip bgp dampening A.B.C.D A.B.C.D",
12153 CLEAR_STR
12154 IP_STR
12155 BGP_STR
12156 "Clear route flap dampening information\n"
12157 "Network to clear damping information\n"
12158 "Network mask\n")
12159{
12160 int ret;
12161 char prefix_str[BUFSIZ];
12162
12163 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
12164 if (! ret)
12165 {
12166 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
12167 return CMD_WARNING;
12168 }
12169
12170 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
12171 SAFI_UNICAST, NULL, 0);
12172}
12173
paul94f2b392005-06-28 12:44:16 +000012174static int
paul718e3742002-12-13 20:15:29 +000012175bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
12176 afi_t afi, safi_t safi, int *write)
12177{
12178 struct bgp_node *prn;
12179 struct bgp_node *rn;
12180 struct bgp_table *table;
12181 struct prefix *p;
12182 struct prefix_rd *prd;
12183 struct bgp_static *bgp_static;
12184 u_int32_t label;
12185 char buf[SU_ADDRSTRLEN];
12186 char rdbuf[RD_ADDRSTRLEN];
12187
12188 /* Network configuration. */
12189 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
12190 if ((table = prn->info) != NULL)
12191 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
12192 if ((bgp_static = rn->info) != NULL)
12193 {
12194 p = &rn->p;
12195 prd = (struct prefix_rd *) &prn->p;
12196
12197 /* "address-family" display. */
12198 bgp_config_write_family_header (vty, afi, safi, write);
12199
12200 /* "network" configuration display. */
12201 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
12202 label = decode_label (bgp_static->tag);
12203
12204 vty_out (vty, " network %s/%d rd %s tag %d",
12205 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12206 p->prefixlen,
12207 rdbuf, label);
12208 vty_out (vty, "%s", VTY_NEWLINE);
12209 }
12210 return 0;
12211}
12212
12213/* Configuration of static route announcement and aggregate
12214 information. */
12215int
12216bgp_config_write_network (struct vty *vty, struct bgp *bgp,
12217 afi_t afi, safi_t safi, int *write)
12218{
12219 struct bgp_node *rn;
12220 struct prefix *p;
12221 struct bgp_static *bgp_static;
12222 struct bgp_aggregate *bgp_aggregate;
12223 char buf[SU_ADDRSTRLEN];
12224
12225 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
12226 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
12227
12228 /* Network configuration. */
12229 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
12230 if ((bgp_static = rn->info) != NULL)
12231 {
12232 p = &rn->p;
12233
12234 /* "address-family" display. */
12235 bgp_config_write_family_header (vty, afi, safi, write);
12236
12237 /* "network" configuration display. */
12238 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12239 {
12240 u_int32_t destination;
12241 struct in_addr netmask;
12242
12243 destination = ntohl (p->u.prefix4.s_addr);
12244 masklen2ip (p->prefixlen, &netmask);
12245 vty_out (vty, " network %s",
12246 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
12247
12248 if ((IN_CLASSC (destination) && p->prefixlen == 24)
12249 || (IN_CLASSB (destination) && p->prefixlen == 16)
12250 || (IN_CLASSA (destination) && p->prefixlen == 8)
12251 || p->u.prefix4.s_addr == 0)
12252 {
12253 /* Natural mask is not display. */
12254 }
12255 else
12256 vty_out (vty, " mask %s", inet_ntoa (netmask));
12257 }
12258 else
12259 {
12260 vty_out (vty, " network %s/%d",
12261 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12262 p->prefixlen);
12263 }
12264
12265 if (bgp_static->rmap.name)
12266 vty_out (vty, " route-map %s", bgp_static->rmap.name);
Paul Jakma41367172007-08-06 15:24:51 +000012267 else
12268 {
12269 if (bgp_static->backdoor)
12270 vty_out (vty, " backdoor");
Paul Jakma41367172007-08-06 15:24:51 +000012271 }
paul718e3742002-12-13 20:15:29 +000012272
12273 vty_out (vty, "%s", VTY_NEWLINE);
12274 }
12275
12276 /* Aggregate-address configuration. */
12277 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
12278 if ((bgp_aggregate = rn->info) != NULL)
12279 {
12280 p = &rn->p;
12281
12282 /* "address-family" display. */
12283 bgp_config_write_family_header (vty, afi, safi, write);
12284
12285 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12286 {
12287 struct in_addr netmask;
12288
12289 masklen2ip (p->prefixlen, &netmask);
12290 vty_out (vty, " aggregate-address %s %s",
12291 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12292 inet_ntoa (netmask));
12293 }
12294 else
12295 {
12296 vty_out (vty, " aggregate-address %s/%d",
12297 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12298 p->prefixlen);
12299 }
12300
12301 if (bgp_aggregate->as_set)
12302 vty_out (vty, " as-set");
12303
12304 if (bgp_aggregate->summary_only)
12305 vty_out (vty, " summary-only");
12306
12307 vty_out (vty, "%s", VTY_NEWLINE);
12308 }
12309
12310 return 0;
12311}
12312
12313int
12314bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
12315{
12316 struct bgp_node *rn;
12317 struct bgp_distance *bdistance;
12318
12319 /* Distance configuration. */
12320 if (bgp->distance_ebgp
12321 && bgp->distance_ibgp
12322 && bgp->distance_local
12323 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
12324 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
12325 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
12326 vty_out (vty, " distance bgp %d %d %d%s",
12327 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
12328 VTY_NEWLINE);
12329
12330 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
12331 if ((bdistance = rn->info) != NULL)
12332 {
12333 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
12334 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
12335 bdistance->access_list ? bdistance->access_list : "",
12336 VTY_NEWLINE);
12337 }
12338
12339 return 0;
12340}
12341
12342/* Allocate routing table structure and install commands. */
12343void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080012344bgp_route_init (void)
paul718e3742002-12-13 20:15:29 +000012345{
12346 /* Init BGP distance table. */
Paul Jakma64e580a2006-02-21 01:09:01 +000012347 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +000012348
12349 /* IPv4 BGP commands. */
12350 install_element (BGP_NODE, &bgp_network_cmd);
12351 install_element (BGP_NODE, &bgp_network_mask_cmd);
12352 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
12353 install_element (BGP_NODE, &bgp_network_route_map_cmd);
12354 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
12355 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
12356 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
12357 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
12358 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
12359 install_element (BGP_NODE, &no_bgp_network_cmd);
12360 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
12361 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
12362 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
12363 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
12364 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12365 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
12366 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
12367 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
12368
12369 install_element (BGP_NODE, &aggregate_address_cmd);
12370 install_element (BGP_NODE, &aggregate_address_mask_cmd);
12371 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
12372 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
12373 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
12374 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
12375 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
12376 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
12377 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
12378 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
12379 install_element (BGP_NODE, &no_aggregate_address_cmd);
12380 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
12381 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
12382 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
12383 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
12384 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
12385 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
12386 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
12387 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12388 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12389
12390 /* IPv4 unicast configuration. */
12391 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
12392 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
12393 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
12394 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
12395 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
12396 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012397 install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
paul718e3742002-12-13 20:15:29 +000012398 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
12399 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
12400 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
12401 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
12402 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012403
paul718e3742002-12-13 20:15:29 +000012404 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
12405 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
12406 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
12407 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
12408 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
12409 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
12410 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
12411 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
12412 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
12413 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
12414 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
12415 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
12416 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
12417 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
12418 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
12419 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
12420 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
12421 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
12422 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12423 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12424
12425 /* IPv4 multicast configuration. */
12426 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
12427 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
12428 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
12429 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
12430 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
12431 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
12432 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
12433 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
12434 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
12435 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
12436 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
12437 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12438 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
12439 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
12440 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
12441 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
12442 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
12443 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
12444 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
12445 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
12446 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
12447 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
12448 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
12449 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
12450 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
12451 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
12452 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
12453 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
12454 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
12455 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
12456 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12457 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12458
12459 install_element (VIEW_NODE, &show_ip_bgp_cmd);
12460 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012461 install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012462 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
12463 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012464 install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012465 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12466 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12467 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
12468 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012469 install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012470 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12471 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12472 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
12473 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
12474 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
12475 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
12476 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12477 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
12478 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12479 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
12480 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12481 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
12482 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12483 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
12484 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12485 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
12486 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12487 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
12488 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
12489 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
12490 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
12491 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
12492 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
12493 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
12494 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012495 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12496 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
12497 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
12498 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
12499 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012500 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
12501 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
12502 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
12503 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
12504 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12505 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12506 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12507 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12508 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
12509 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12510 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
12511 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12512 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
12513 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12514 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12515 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12516 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12517 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012518 install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012519 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
12520 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12521 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12522 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12523 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
12524 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
12525 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
12526 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
12527 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12528 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
12529 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
12530 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12531 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12532 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
12533 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
12534 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012535 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012536 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012537 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012538 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012539 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012540 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012541 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12542 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012543 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012544 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012545 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012546 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012547 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012548 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012549
12550 /* Restricted node: VIEW_NODE - (set of dangerous commands) */
12551 install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
12552 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012553 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012554 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12555 install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
12556 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012557 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012558 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12559 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12560 install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
12561 install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
12562 install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
12563 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
12564 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
12565 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
12566 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
12567 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
12568 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
12569 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012570 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12571 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
12572 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
12573 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
12574 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012575 install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
12576 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
12577 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
12578 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
12579 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12580 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12581 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12582 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12583 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012584 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012585 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012586 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012587 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012588 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012589 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012590 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012591
12592 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
12593 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012594 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012595 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
12596 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012597 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012598 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12599 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12600 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
12601 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012602 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012603 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12604 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12605 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
12606 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
12607 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
12608 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
12609 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12610 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
12611 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12612 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
12613 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12614 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
12615 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12616 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
12617 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12618 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
12619 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12620 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
12621 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
12622 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
12623 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
12624 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
12625 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
12626 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
12627 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012628 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12629 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
12630 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
12631 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
12632 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012633 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
12634 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
12635 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
12636 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
12637 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12638 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12639 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12640 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12641 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
12642 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12643 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
12644 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12645 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
12646 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12647 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12648 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12649 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12650 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012651 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012652 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
12653 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12654 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12655 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12656 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
12657 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
12658 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
12659 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
12660 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12661 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
12662 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
12663 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12664 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12665 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
12666 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
12667 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012668 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012669 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012670 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012671 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012672 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012673 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012674 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12675 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012676 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012677 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012678 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012679 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012680 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012681 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012682
12683 /* BGP dampening clear commands */
12684 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
12685 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
12686 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
12687 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
12688
Paul Jakmaff7924f2006-09-04 01:10:36 +000012689 /* prefix count */
12690 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
12691 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
12692 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
paul718e3742002-12-13 20:15:29 +000012693#ifdef HAVE_IPV6
Paul Jakmaff7924f2006-09-04 01:10:36 +000012694 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
12695
paul718e3742002-12-13 20:15:29 +000012696 /* New config IPv6 BGP commands. */
12697 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
12698 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
12699 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
12700 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
12701
12702 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
12703 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
12704 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
12705 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
12706
G.Balaji73bfe0b2011-09-23 22:36:20 +053012707 install_element (BGP_IPV6M_NODE, &ipv6_bgp_network_cmd);
12708 install_element (BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd);
12709
paul718e3742002-12-13 20:15:29 +000012710 /* Old config IPv6 BGP commands. */
12711 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
12712 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
12713
12714 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
12715 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
12716 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
12717 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
12718
12719 install_element (VIEW_NODE, &show_bgp_cmd);
12720 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012721 install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012722 install_element (VIEW_NODE, &show_bgp_route_cmd);
12723 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012724 install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012725 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
12726 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012727 install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012728 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
12729 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
12730 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
12731 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
12732 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
12733 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
12734 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
12735 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
12736 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
12737 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
12738 install_element (VIEW_NODE, &show_bgp_community_cmd);
12739 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
12740 install_element (VIEW_NODE, &show_bgp_community2_cmd);
12741 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
12742 install_element (VIEW_NODE, &show_bgp_community3_cmd);
12743 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
12744 install_element (VIEW_NODE, &show_bgp_community4_cmd);
12745 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
12746 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
12747 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
12748 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
12749 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
12750 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
12751 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
12752 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
12753 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
12754 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
12755 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
12756 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
12757 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12758 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
12759 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12760 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
12761 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12762 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
12763 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12764 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
12765 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12766 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12767 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012768 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
12769 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12770 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
12771 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012772 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012773 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012774 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012775 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012776 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012777 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012778 install_element (VIEW_NODE, &show_bgp_view_cmd);
12779 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
12780 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
12781 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
12782 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
12783 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
12784 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12785 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12786 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12787 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12788 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
12789 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12790 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12791 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12792 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
12793 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12794 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
12795 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012796 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012797 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012798 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012799 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012800 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012801 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012802
12803 /* Restricted:
12804 * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
12805 */
12806 install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
12807 install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012808 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012809 install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
12810 install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012811 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012812 install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
12813 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
12814 install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
12815 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
12816 install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
12817 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
12818 install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
12819 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
12820 install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
12821 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
12822 install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
12823 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
12824 install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
12825 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
12826 install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
12827 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
12828 install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012829 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012830 install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012831 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012832 install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
12833 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
12834 install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
12835 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
12836 install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12837 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12838 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012839 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012840 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012841 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012842
12843 install_element (ENABLE_NODE, &show_bgp_cmd);
12844 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012845 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012846 install_element (ENABLE_NODE, &show_bgp_route_cmd);
12847 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012848 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012849 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
12850 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012851 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012852 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
12853 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
12854 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
12855 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
12856 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
12857 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
12858 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
12859 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
12860 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
12861 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
12862 install_element (ENABLE_NODE, &show_bgp_community_cmd);
12863 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
12864 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
12865 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
12866 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
12867 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
12868 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
12869 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
12870 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12871 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12872 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12873 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12874 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12875 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12876 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12877 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12878 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12879 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12880 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12881 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12882 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12883 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12884 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12885 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12886 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12887 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12888 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12889 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12890 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12891 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012892 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12893 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12894 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12895 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012896 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012897 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012898 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012899 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012900 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012901 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012902 install_element (ENABLE_NODE, &show_bgp_view_cmd);
12903 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12904 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12905 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12906 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12907 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12908 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12909 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12910 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12911 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12912 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12913 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12914 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12915 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12916 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12917 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12918 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12919 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012920 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012921 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012922 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012923 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012924 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012925 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma2815e612006-09-14 02:56:07 +000012926
12927 /* Statistics */
12928 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12929 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12930 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12931 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12932
paul718e3742002-12-13 20:15:29 +000012933 /* old command */
12934 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12935 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12936 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12937 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12938 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12939 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12940 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12941 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12942 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12943 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12944 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12945 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12946 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12947 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12948 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12949 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12950 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12951 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12952 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12953 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12954 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12955 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12956 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12957 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12958 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12959 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12960 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12961 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12962 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12963 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12964 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12965 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12966 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12967 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12968 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12969 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
paulbb46e942003-10-24 19:02:03 +000012970
paul718e3742002-12-13 20:15:29 +000012971 /* old command */
12972 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12973 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12974 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12975 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12976 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12977 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12978 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12979 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12980 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12981 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12982 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12983 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12984 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12985 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12986 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12987 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12988 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12989 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12990 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12991 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12992 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12993 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12994 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12995 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12996 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12997 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12998 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12999 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
13000 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
13001 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
13002 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
13003 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
13004 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
13005 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
13006 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
13007 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
13008
13009 /* old command */
13010 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
13011 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
13012 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
13013 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
13014
13015 /* old command */
13016 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
13017 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
13018 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
13019 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
13020
13021 /* old command */
13022 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
13023 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
13024 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
13025 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
13026#endif /* HAVE_IPV6 */
13027
13028 install_element (BGP_NODE, &bgp_distance_cmd);
13029 install_element (BGP_NODE, &no_bgp_distance_cmd);
13030 install_element (BGP_NODE, &no_bgp_distance2_cmd);
13031 install_element (BGP_NODE, &bgp_distance_source_cmd);
13032 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
13033 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
13034 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
13035
13036 install_element (BGP_NODE, &bgp_damp_set_cmd);
13037 install_element (BGP_NODE, &bgp_damp_set2_cmd);
13038 install_element (BGP_NODE, &bgp_damp_set3_cmd);
13039 install_element (BGP_NODE, &bgp_damp_unset_cmd);
13040 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
13041 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
13042 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
13043 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
13044 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
13045 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000013046
13047 /* Deprecated AS-Pathlimit commands */
13048 install_element (BGP_NODE, &bgp_network_ttl_cmd);
13049 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
13050 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
13051 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
13052 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13053 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13054
13055 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
13056 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
13057 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13058 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
13059 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13060 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
13061
13062 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
13063 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
13064 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
13065 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
13066 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13067 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13068
13069 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
13070 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
13071 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13072 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
13073 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13074 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
13075
13076 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
13077 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
13078 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
13079 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
13080 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13081 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13082
13083 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
13084 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
13085 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13086 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
13087 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13088 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
Paul Jakma3bde17f2011-03-23 10:30:30 +000013089
13090#ifdef HAVE_IPV6
Paul Jakmac8f3fe32010-12-05 20:28:02 +000013091 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
13092 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
Paul Jakma3bde17f2011-03-23 10:30:30 +000013093#endif
paul718e3742002-12-13 20:15:29 +000013094}
Chris Caputo228da422009-07-18 05:44:03 +000013095
13096void
13097bgp_route_finish (void)
13098{
13099 bgp_table_unlock (bgp_distance_table);
13100 bgp_distance_table = NULL;
13101}