blob: 087f83961446e6c5f3d23608e55a2d0bce1faf33 [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{
325 u_int32_t new_pref;
326 u_int32_t exist_pref;
327 u_int32_t new_med;
328 u_int32_t exist_med;
Paul Jakmafb982c22007-05-04 20:15:47 +0000329 u_int32_t new_weight = 0;
330 u_int32_t exist_weight = 0;
paul718e3742002-12-13 20:15:29 +0000331 struct in_addr new_id;
332 struct in_addr exist_id;
333 int new_cluster;
334 int exist_cluster;
335 int internal_as_route = 0;
336 int confed_as_route = 0;
337 int ret;
Josh Bailey96450fa2011-07-20 20:45:12 -0700338 uint32_t newm, existm;
339
340 *paths_eq = 0;
paul718e3742002-12-13 20:15:29 +0000341
342 /* 0. Null check. */
343 if (new == NULL)
344 return 0;
345 if (exist == NULL)
346 return 1;
347
348 /* 1. Weight check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000349 if (new->attr->extra)
350 new_weight = new->attr->extra->weight;
351 if (exist->attr->extra)
352 exist_weight = exist->attr->extra->weight;
353 if (new_weight > exist_weight)
paul718e3742002-12-13 20:15:29 +0000354 return 1;
Paul Jakmafb982c22007-05-04 20:15:47 +0000355 if (new_weight < exist_weight)
paul718e3742002-12-13 20:15:29 +0000356 return 0;
357
358 /* 2. Local preference check. */
359 if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
360 new_pref = new->attr->local_pref;
361 else
362 new_pref = bgp->default_local_pref;
363
364 if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
365 exist_pref = exist->attr->local_pref;
366 else
367 exist_pref = bgp->default_local_pref;
368
369 if (new_pref > exist_pref)
370 return 1;
371 if (new_pref < exist_pref)
372 return 0;
373
374 /* 3. Local route check. */
375 if (new->sub_type == BGP_ROUTE_STATIC)
376 return 1;
377 if (exist->sub_type == BGP_ROUTE_STATIC)
378 return 0;
379
380 if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
381 return 1;
382 if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
383 return 0;
384
385 if (new->sub_type == BGP_ROUTE_AGGREGATE)
386 return 1;
387 if (exist->sub_type == BGP_ROUTE_AGGREGATE)
388 return 0;
389
390 /* 4. AS path length check. */
391 if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
392 {
paulfe69a502005-09-10 16:55:02 +0000393 int exist_hops = aspath_count_hops (exist->attr->aspath);
394 int exist_confeds = aspath_count_confeds (exist->attr->aspath);
395
hasso68118452005-04-08 15:40:36 +0000396 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
397 {
paulfe69a502005-09-10 16:55:02 +0000398 int aspath_hops;
399
400 aspath_hops = aspath_count_hops (new->attr->aspath);
401 aspath_hops += aspath_count_confeds (new->attr->aspath);
402
403 if ( aspath_hops < (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000404 return 1;
paulfe69a502005-09-10 16:55:02 +0000405 if ( aspath_hops > (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000406 return 0;
407 }
408 else
409 {
paulfe69a502005-09-10 16:55:02 +0000410 int newhops = aspath_count_hops (new->attr->aspath);
411
412 if (newhops < exist_hops)
hasso68118452005-04-08 15:40:36 +0000413 return 1;
paulfe69a502005-09-10 16:55:02 +0000414 if (newhops > exist_hops)
hasso68118452005-04-08 15:40:36 +0000415 return 0;
416 }
paul718e3742002-12-13 20:15:29 +0000417 }
418
419 /* 5. Origin check. */
420 if (new->attr->origin < exist->attr->origin)
421 return 1;
422 if (new->attr->origin > exist->attr->origin)
423 return 0;
424
425 /* 6. MED check. */
paulfe69a502005-09-10 16:55:02 +0000426 internal_as_route = (aspath_count_hops (new->attr->aspath) == 0
427 && aspath_count_hops (exist->attr->aspath) == 0);
428 confed_as_route = (aspath_count_confeds (new->attr->aspath) > 0
429 && aspath_count_confeds (exist->attr->aspath) > 0
430 && aspath_count_hops (new->attr->aspath) == 0
431 && aspath_count_hops (exist->attr->aspath) == 0);
paul718e3742002-12-13 20:15:29 +0000432
433 if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
434 || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
435 && confed_as_route)
436 || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
437 || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
438 || internal_as_route)
439 {
440 new_med = bgp_med_value (new->attr, bgp);
441 exist_med = bgp_med_value (exist->attr, bgp);
442
443 if (new_med < exist_med)
444 return 1;
445 if (new_med > exist_med)
446 return 0;
447 }
448
449 /* 7. Peer type check. */
450 if (peer_sort (new->peer) == BGP_PEER_EBGP
451 && peer_sort (exist->peer) == BGP_PEER_IBGP)
452 return 1;
453 if (peer_sort (new->peer) == BGP_PEER_EBGP
454 && peer_sort (exist->peer) == BGP_PEER_CONFED)
455 return 1;
456 if (peer_sort (new->peer) == BGP_PEER_IBGP
457 && peer_sort (exist->peer) == BGP_PEER_EBGP)
458 return 0;
459 if (peer_sort (new->peer) == BGP_PEER_CONFED
460 && peer_sort (exist->peer) == BGP_PEER_EBGP)
461 return 0;
462
463 /* 8. IGP metric check. */
Josh Bailey96450fa2011-07-20 20:45:12 -0700464 newm = (new->extra ? new->extra->igpmetric : 0);
465 existm = (exist->extra ? exist->extra->igpmetric : 0);
466 if (newm < existm)
467 ret = 1;
468 if (newm > existm)
469 ret = 0;
paul718e3742002-12-13 20:15:29 +0000470
471 /* 9. Maximum path check. */
Josh Bailey96450fa2011-07-20 20:45:12 -0700472 if (newm == existm)
473 {
474 if ((peer_sort (new->peer) == BGP_PEER_IBGP))
475 {
476 if (aspath_cmp (new->attr->aspath, exist->attr->aspath))
477 *paths_eq = 1;
478 }
479 else if (new->peer->as == exist->peer->as)
480 *paths_eq = 1;
481 }
482 else
483 {
484 /*
485 * TODO: If unequal cost ibgp multipath is enabled we can
486 * mark the paths as equal here instead of returning
487 */
488 return ret;
489 }
paul718e3742002-12-13 20:15:29 +0000490
491 /* 10. If both paths are external, prefer the path that was received
492 first (the oldest one). This step minimizes route-flap, since a
493 newer path won't displace an older one, even if it was the
494 preferred route based on the additional decision criteria below. */
495 if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
496 && peer_sort (new->peer) == BGP_PEER_EBGP
497 && peer_sort (exist->peer) == BGP_PEER_EBGP)
498 {
499 if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
500 return 1;
501 if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
502 return 0;
503 }
504
505 /* 11. Rourter-ID comparision. */
506 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +0000507 new_id.s_addr = new->attr->extra->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000508 else
509 new_id.s_addr = new->peer->remote_id.s_addr;
510 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +0000511 exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000512 else
513 exist_id.s_addr = exist->peer->remote_id.s_addr;
514
515 if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
516 return 1;
517 if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
518 return 0;
519
520 /* 12. Cluster length comparision. */
521 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
Paul Jakmafb982c22007-05-04 20:15:47 +0000522 new_cluster = new->attr->extra->cluster->length;
paul718e3742002-12-13 20:15:29 +0000523 else
524 new_cluster = 0;
525 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
Paul Jakmafb982c22007-05-04 20:15:47 +0000526 exist_cluster = exist->attr->extra->cluster->length;
paul718e3742002-12-13 20:15:29 +0000527 else
528 exist_cluster = 0;
529
530 if (new_cluster < exist_cluster)
531 return 1;
532 if (new_cluster > exist_cluster)
533 return 0;
534
535 /* 13. Neighbor address comparision. */
536 ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
537
538 if (ret == 1)
539 return 0;
540 if (ret == -1)
541 return 1;
542
543 return 1;
544}
545
paul94f2b392005-06-28 12:44:16 +0000546static enum filter_type
paul718e3742002-12-13 20:15:29 +0000547bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
548 afi_t afi, safi_t safi)
549{
550 struct bgp_filter *filter;
551
552 filter = &peer->filter[afi][safi];
553
Paul Jakma650f76c2009-06-25 18:06:31 +0100554#define FILTER_EXIST_WARN(F,f,filter) \
555 if (BGP_DEBUG (update, UPDATE_IN) \
556 && !(F ## _IN (filter))) \
557 plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
558 peer->host, #f, F ## _IN_NAME(filter));
559
560 if (DISTRIBUTE_IN_NAME (filter)) {
561 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
562
paul718e3742002-12-13 20:15:29 +0000563 if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
564 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100565 }
paul718e3742002-12-13 20:15:29 +0000566
Paul Jakma650f76c2009-06-25 18:06:31 +0100567 if (PREFIX_LIST_IN_NAME (filter)) {
568 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
569
paul718e3742002-12-13 20:15:29 +0000570 if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
571 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100572 }
paul718e3742002-12-13 20:15:29 +0000573
Paul Jakma650f76c2009-06-25 18:06:31 +0100574 if (FILTER_LIST_IN_NAME (filter)) {
575 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
576
paul718e3742002-12-13 20:15:29 +0000577 if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
578 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100579 }
580
paul718e3742002-12-13 20:15:29 +0000581 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100582#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000583}
584
paul94f2b392005-06-28 12:44:16 +0000585static enum filter_type
paul718e3742002-12-13 20:15:29 +0000586bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
587 afi_t afi, safi_t safi)
588{
589 struct bgp_filter *filter;
590
591 filter = &peer->filter[afi][safi];
592
Paul Jakma650f76c2009-06-25 18:06:31 +0100593#define FILTER_EXIST_WARN(F,f,filter) \
594 if (BGP_DEBUG (update, UPDATE_OUT) \
595 && !(F ## _OUT (filter))) \
596 plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
597 peer->host, #f, F ## _OUT_NAME(filter));
598
599 if (DISTRIBUTE_OUT_NAME (filter)) {
600 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
601
paul718e3742002-12-13 20:15:29 +0000602 if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
603 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100604 }
paul718e3742002-12-13 20:15:29 +0000605
Paul Jakma650f76c2009-06-25 18:06:31 +0100606 if (PREFIX_LIST_OUT_NAME (filter)) {
607 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
608
paul718e3742002-12-13 20:15:29 +0000609 if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
610 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100611 }
paul718e3742002-12-13 20:15:29 +0000612
Paul Jakma650f76c2009-06-25 18:06:31 +0100613 if (FILTER_LIST_OUT_NAME (filter)) {
614 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
615
paul718e3742002-12-13 20:15:29 +0000616 if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
617 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100618 }
paul718e3742002-12-13 20:15:29 +0000619
620 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100621#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000622}
623
624/* If community attribute includes no_export then return 1. */
paul94f2b392005-06-28 12:44:16 +0000625static int
paul718e3742002-12-13 20:15:29 +0000626bgp_community_filter (struct peer *peer, struct attr *attr)
627{
628 if (attr->community)
629 {
630 /* NO_ADVERTISE check. */
631 if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
632 return 1;
633
634 /* NO_EXPORT check. */
635 if (peer_sort (peer) == BGP_PEER_EBGP &&
636 community_include (attr->community, COMMUNITY_NO_EXPORT))
637 return 1;
638
639 /* NO_EXPORT_SUBCONFED check. */
640 if (peer_sort (peer) == BGP_PEER_EBGP
641 || peer_sort (peer) == BGP_PEER_CONFED)
642 if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
643 return 1;
644 }
645 return 0;
646}
647
648/* Route reflection loop check. */
649static int
650bgp_cluster_filter (struct peer *peer, struct attr *attr)
651{
652 struct in_addr cluster_id;
653
Paul Jakmafb982c22007-05-04 20:15:47 +0000654 if (attr->extra && attr->extra->cluster)
paul718e3742002-12-13 20:15:29 +0000655 {
656 if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
657 cluster_id = peer->bgp->cluster_id;
658 else
659 cluster_id = peer->bgp->router_id;
660
Paul Jakmafb982c22007-05-04 20:15:47 +0000661 if (cluster_loop_check (attr->extra->cluster, cluster_id))
paul718e3742002-12-13 20:15:29 +0000662 return 1;
663 }
664 return 0;
665}
666
paul94f2b392005-06-28 12:44:16 +0000667static int
paul718e3742002-12-13 20:15:29 +0000668bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
669 afi_t afi, safi_t safi)
670{
671 struct bgp_filter *filter;
672 struct bgp_info info;
673 route_map_result_t ret;
674
675 filter = &peer->filter[afi][safi];
676
677 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000678 if (peer->weight)
679 (bgp_attr_extra_get (attr))->weight = peer->weight;
paul718e3742002-12-13 20:15:29 +0000680
681 /* Route map apply. */
682 if (ROUTE_MAP_IN_NAME (filter))
683 {
684 /* Duplicate current value to new strucutre for modification. */
685 info.peer = peer;
686 info.attr = attr;
687
paulac41b2a2003-08-12 05:32:27 +0000688 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
689
paul718e3742002-12-13 20:15:29 +0000690 /* Apply BGP route map to the attribute. */
691 ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
paulac41b2a2003-08-12 05:32:27 +0000692
693 peer->rmap_type = 0;
694
paul718e3742002-12-13 20:15:29 +0000695 if (ret == RMAP_DENYMATCH)
696 {
697 /* Free newly generated AS path and community by route-map. */
698 bgp_attr_flush (attr);
699 return RMAP_DENY;
700 }
701 }
702 return RMAP_PERMIT;
703}
704
paul94f2b392005-06-28 12:44:16 +0000705static int
paulfee0f4c2004-09-13 05:12:46 +0000706bgp_export_modifier (struct peer *rsclient, struct peer *peer,
707 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
708{
709 struct bgp_filter *filter;
710 struct bgp_info info;
711 route_map_result_t ret;
712
713 filter = &peer->filter[afi][safi];
714
715 /* Route map apply. */
716 if (ROUTE_MAP_EXPORT_NAME (filter))
717 {
718 /* Duplicate current value to new strucutre for modification. */
719 info.peer = rsclient;
720 info.attr = attr;
721
722 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
723
724 /* Apply BGP route map to the attribute. */
725 ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
726
727 rsclient->rmap_type = 0;
728
729 if (ret == RMAP_DENYMATCH)
730 {
731 /* Free newly generated AS path and community by route-map. */
732 bgp_attr_flush (attr);
733 return RMAP_DENY;
734 }
735 }
736 return RMAP_PERMIT;
737}
738
paul94f2b392005-06-28 12:44:16 +0000739static int
paulfee0f4c2004-09-13 05:12:46 +0000740bgp_import_modifier (struct peer *rsclient, struct peer *peer,
741 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
742{
743 struct bgp_filter *filter;
744 struct bgp_info info;
745 route_map_result_t ret;
746
747 filter = &rsclient->filter[afi][safi];
748
749 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000750 if (peer->weight)
751 (bgp_attr_extra_get (attr))->weight = peer->weight;
paulfee0f4c2004-09-13 05:12:46 +0000752
753 /* Route map apply. */
754 if (ROUTE_MAP_IMPORT_NAME (filter))
755 {
756 /* Duplicate current value to new strucutre for modification. */
757 info.peer = peer;
758 info.attr = attr;
759
760 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
761
762 /* Apply BGP route map to the attribute. */
763 ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
764
765 peer->rmap_type = 0;
766
767 if (ret == RMAP_DENYMATCH)
768 {
769 /* Free newly generated AS path and community by route-map. */
770 bgp_attr_flush (attr);
771 return RMAP_DENY;
772 }
773 }
774 return RMAP_PERMIT;
775}
776
paul94f2b392005-06-28 12:44:16 +0000777static int
paul718e3742002-12-13 20:15:29 +0000778bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
779 struct attr *attr, afi_t afi, safi_t safi)
780{
781 int ret;
782 char buf[SU_ADDRSTRLEN];
783 struct bgp_filter *filter;
paul718e3742002-12-13 20:15:29 +0000784 struct peer *from;
785 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +0000786 int transparent;
787 int reflect;
Josh Bailey0b597ef2011-07-20 20:49:11 -0700788 struct attr *riattr;
paul718e3742002-12-13 20:15:29 +0000789
790 from = ri->peer;
791 filter = &peer->filter[afi][safi];
792 bgp = peer->bgp;
Josh Bailey0b597ef2011-07-20 20:49:11 -0700793 riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
paul718e3742002-12-13 20:15:29 +0000794
Paul Jakma750e8142008-07-22 21:11:48 +0000795 if (DISABLE_BGP_ANNOUNCE)
796 return 0;
paul718e3742002-12-13 20:15:29 +0000797
paulfee0f4c2004-09-13 05:12:46 +0000798 /* Do not send announces to RS-clients from the 'normal' bgp_table. */
799 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
800 return 0;
801
paul718e3742002-12-13 20:15:29 +0000802 /* Do not send back route to sender. */
803 if (from == peer)
804 return 0;
805
paul35be31b2004-05-01 18:17:04 +0000806 /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
807 if (p->family == AF_INET
Josh Bailey0b597ef2011-07-20 20:49:11 -0700808 && IPV4_ADDR_SAME(&peer->remote_id, &riattr->nexthop))
paul35be31b2004-05-01 18:17:04 +0000809 return 0;
810#ifdef HAVE_IPV6
811 if (p->family == AF_INET6
Josh Bailey0b597ef2011-07-20 20:49:11 -0700812 && IPV6_ADDR_SAME(&peer->remote_id, &riattr->nexthop))
paul35be31b2004-05-01 18:17:04 +0000813 return 0;
814#endif
815
paul718e3742002-12-13 20:15:29 +0000816 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000817 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +0000818 if (! UNSUPPRESS_MAP_NAME (filter))
819 return 0;
820
821 /* Default route check. */
822 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
823 {
824 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
825 return 0;
826#ifdef HAVE_IPV6
827 else if (p->family == AF_INET6 && p->prefixlen == 0)
828 return 0;
829#endif /* HAVE_IPV6 */
830 }
831
paul286e1e72003-08-08 00:24:31 +0000832 /* Transparency check. */
833 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
834 && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
835 transparent = 1;
836 else
837 transparent = 0;
838
paul718e3742002-12-13 20:15:29 +0000839 /* If community is not disabled check the no-export and local. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700840 if (! transparent && bgp_community_filter (peer, riattr))
paul718e3742002-12-13 20:15:29 +0000841 return 0;
842
843 /* If the attribute has originator-id and it is same as remote
844 peer's id. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700845 if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
paul718e3742002-12-13 20:15:29 +0000846 {
Josh Bailey0b597ef2011-07-20 20:49:11 -0700847 if (IPV4_ADDR_SAME (&peer->remote_id, &riattr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +0000848 {
849 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000850 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +0000851 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
852 peer->host,
853 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
854 p->prefixlen);
855 return 0;
856 }
857 }
858
859 /* ORF prefix-list filter check */
860 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
861 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
862 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
863 if (peer->orf_plist[afi][safi])
864 {
865 if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
866 return 0;
867 }
868
869 /* Output filter check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700870 if (bgp_output_filter (peer, p, riattr, afi, safi) == FILTER_DENY)
paul718e3742002-12-13 20:15:29 +0000871 {
872 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000873 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +0000874 "%s [Update:SEND] %s/%d is filtered",
875 peer->host,
876 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
877 p->prefixlen);
878 return 0;
879 }
880
881#ifdef BGP_SEND_ASPATH_CHECK
882 /* AS path loop check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700883 if (aspath_loop_check (riattr->aspath, peer->as))
paul718e3742002-12-13 20:15:29 +0000884 {
885 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000886 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400887 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000888 peer->host, peer->as);
889 return 0;
890 }
891#endif /* BGP_SEND_ASPATH_CHECK */
892
893 /* If we're a CONFED we need to loop check the CONFED ID too */
894 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
895 {
Josh Bailey0b597ef2011-07-20 20:49:11 -0700896 if (aspath_loop_check(riattr->aspath, bgp->confed_id))
paul718e3742002-12-13 20:15:29 +0000897 {
898 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000899 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400900 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000901 peer->host,
902 bgp->confed_id);
903 return 0;
904 }
905 }
906
907 /* Route-Reflect check. */
908 if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
909 reflect = 1;
910 else
911 reflect = 0;
912
913 /* IBGP reflection check. */
914 if (reflect)
915 {
916 /* A route from a Client peer. */
917 if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
918 {
919 /* Reflect to all the Non-Client peers and also to the
920 Client peers other than the originator. Originator check
921 is already done. So there is noting to do. */
922 /* no bgp client-to-client reflection check. */
923 if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
924 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
925 return 0;
926 }
927 else
928 {
929 /* A route from a Non-client peer. Reflect to all other
930 clients. */
931 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
932 return 0;
933 }
934 }
Paul Jakma41367172007-08-06 15:24:51 +0000935
paul718e3742002-12-13 20:15:29 +0000936 /* For modify attribute, copy it to temporary structure. */
Josh Bailey0b597ef2011-07-20 20:49:11 -0700937 bgp_attr_dup (attr, riattr);
Paul Jakmafb982c22007-05-04 20:15:47 +0000938
paul718e3742002-12-13 20:15:29 +0000939 /* If local-preference is not set. */
940 if ((peer_sort (peer) == BGP_PEER_IBGP
941 || peer_sort (peer) == BGP_PEER_CONFED)
942 && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
943 {
944 attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
945 attr->local_pref = bgp->default_local_pref;
946 }
947
paul718e3742002-12-13 20:15:29 +0000948 /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
949 if (peer_sort (peer) == BGP_PEER_EBGP
950 && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
951 {
952 if (ri->peer != bgp->peer_self && ! transparent
953 && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
954 attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
955 }
956
957 /* next-hop-set */
958 if (transparent || reflect
959 || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
960 && ((p->family == AF_INET && attr->nexthop.s_addr)
paul286e1e72003-08-08 00:24:31 +0000961#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000962 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000963 ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul286e1e72003-08-08 00:24:31 +0000964#endif /* HAVE_IPV6 */
965 )))
paul718e3742002-12-13 20:15:29 +0000966 {
967 /* NEXT-HOP Unchanged. */
968 }
969 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
970 || (p->family == AF_INET && attr->nexthop.s_addr == 0)
971#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000972 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000973 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul718e3742002-12-13 20:15:29 +0000974#endif /* HAVE_IPV6 */
975 || (peer_sort (peer) == BGP_PEER_EBGP
976 && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
977 {
978 /* Set IPv4 nexthop. */
979 if (p->family == AF_INET)
980 {
981 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +0000982 memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
983 IPV4_MAX_BYTELEN);
paul718e3742002-12-13 20:15:29 +0000984 else
985 memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
986 }
987#ifdef HAVE_IPV6
988 /* Set IPv6 nexthop. */
989 if (p->family == AF_INET6)
990 {
991 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000992 memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +0000993 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +0000994 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +0000995 }
996#endif /* HAVE_IPV6 */
997 }
998
999#ifdef HAVE_IPV6
1000 if (p->family == AF_INET6)
1001 {
paulfee0f4c2004-09-13 05:12:46 +00001002 /* Left nexthop_local unchanged if so configured. */
1003 if ( CHECK_FLAG (peer->af_flags[afi][safi],
1004 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1005 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001006 if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
1007 attr->extra->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001008 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001009 attr->extra->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001010 }
1011
1012 /* Default nexthop_local treatment for non-RS-Clients */
1013 else
1014 {
paul718e3742002-12-13 20:15:29 +00001015 /* Link-local address should not be transit to different peer. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001016 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001017
1018 /* Set link-local address for shared network peer. */
1019 if (peer->shared_network
1020 && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
1021 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001022 memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00001023 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001024 attr->extra->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00001025 }
1026
1027 /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1028 address.*/
1029 if (reflect)
Paul Jakmafb982c22007-05-04 20:15:47 +00001030 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001031
1032 /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1033 if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
Paul Jakmafb982c22007-05-04 20:15:47 +00001034 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001035 }
paulfee0f4c2004-09-13 05:12:46 +00001036
1037 }
paul718e3742002-12-13 20:15:29 +00001038#endif /* HAVE_IPV6 */
1039
1040 /* If this is EBGP peer and remove-private-AS is set. */
1041 if (peer_sort (peer) == BGP_PEER_EBGP
1042 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1043 && aspath_private_as_check (attr->aspath))
1044 attr->aspath = aspath_empty_get ();
1045
1046 /* Route map & unsuppress-map apply. */
1047 if (ROUTE_MAP_OUT_NAME (filter)
Paul Jakmafb982c22007-05-04 20:15:47 +00001048 || (ri->extra && ri->extra->suppress) )
paul718e3742002-12-13 20:15:29 +00001049 {
Paul Jakma7c7fa1b2006-02-18 10:52:09 +00001050 struct bgp_info info;
Paul Jakma9eda90c2007-08-30 13:36:17 +00001051 struct attr dummy_attr = { 0 };
Paul Jakma7c7fa1b2006-02-18 10:52:09 +00001052
paul718e3742002-12-13 20:15:29 +00001053 info.peer = peer;
1054 info.attr = attr;
1055
1056 /* The route reflector is not allowed to modify the attributes
1057 of the reflected IBGP routes. */
1058 if (peer_sort (from) == BGP_PEER_IBGP
1059 && peer_sort (peer) == BGP_PEER_IBGP)
1060 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001061 bgp_attr_dup (&dummy_attr, attr);
Paul Jakma9eda90c2007-08-30 13:36:17 +00001062 info.attr = &dummy_attr;
paul718e3742002-12-13 20:15:29 +00001063 }
paulac41b2a2003-08-12 05:32:27 +00001064
1065 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1066
Paul Jakmafb982c22007-05-04 20:15:47 +00001067 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00001068 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1069 else
1070 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1071
paulac41b2a2003-08-12 05:32:27 +00001072 peer->rmap_type = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00001073
Paul Jakma9eda90c2007-08-30 13:36:17 +00001074 if (dummy_attr.extra)
1075 bgp_attr_extra_free (&dummy_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001076
paul718e3742002-12-13 20:15:29 +00001077 if (ret == RMAP_DENYMATCH)
1078 {
1079 bgp_attr_flush (attr);
1080 return 0;
1081 }
1082 }
1083 return 1;
1084}
1085
paul94f2b392005-06-28 12:44:16 +00001086static int
paulfee0f4c2004-09-13 05:12:46 +00001087bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1088 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001089{
paulfee0f4c2004-09-13 05:12:46 +00001090 int ret;
1091 char buf[SU_ADDRSTRLEN];
1092 struct bgp_filter *filter;
1093 struct bgp_info info;
1094 struct peer *from;
Josh Bailey0b597ef2011-07-20 20:49:11 -07001095 struct attr *riattr;
paulfee0f4c2004-09-13 05:12:46 +00001096
1097 from = ri->peer;
1098 filter = &rsclient->filter[afi][safi];
Josh Bailey0b597ef2011-07-20 20:49:11 -07001099 riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
paulfee0f4c2004-09-13 05:12:46 +00001100
Paul Jakma750e8142008-07-22 21:11:48 +00001101 if (DISABLE_BGP_ANNOUNCE)
1102 return 0;
paulfee0f4c2004-09-13 05:12:46 +00001103
1104 /* Do not send back route to sender. */
1105 if (from == rsclient)
1106 return 0;
1107
1108 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001109 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001110 if (! UNSUPPRESS_MAP_NAME (filter))
1111 return 0;
1112
1113 /* Default route check. */
1114 if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1115 PEER_STATUS_DEFAULT_ORIGINATE))
1116 {
1117 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1118 return 0;
1119#ifdef HAVE_IPV6
1120 else if (p->family == AF_INET6 && p->prefixlen == 0)
1121 return 0;
1122#endif /* HAVE_IPV6 */
1123 }
1124
1125 /* If the attribute has originator-id and it is same as remote
1126 peer's id. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001127 if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
paulfee0f4c2004-09-13 05:12:46 +00001128 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001129 if (IPV4_ADDR_SAME (&rsclient->remote_id,
Josh Bailey0b597ef2011-07-20 20:49:11 -07001130 &riattr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001131 {
1132 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001133 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001134 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1135 rsclient->host,
1136 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1137 p->prefixlen);
1138 return 0;
1139 }
1140 }
1141
1142 /* ORF prefix-list filter check */
1143 if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1144 && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1145 || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1146 if (rsclient->orf_plist[afi][safi])
1147 {
1148 if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1149 return 0;
1150 }
1151
1152 /* Output filter check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001153 if (bgp_output_filter (rsclient, p, riattr, afi, safi) == FILTER_DENY)
paulfee0f4c2004-09-13 05:12:46 +00001154 {
1155 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001156 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001157 "%s [Update:SEND] %s/%d is filtered",
1158 rsclient->host,
1159 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1160 p->prefixlen);
1161 return 0;
1162 }
1163
1164#ifdef BGP_SEND_ASPATH_CHECK
1165 /* AS path loop check. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001166 if (aspath_loop_check (riattr->aspath, rsclient->as))
paulfee0f4c2004-09-13 05:12:46 +00001167 {
1168 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001169 zlog (rsclient->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04001170 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paulfee0f4c2004-09-13 05:12:46 +00001171 rsclient->host, rsclient->as);
1172 return 0;
1173 }
1174#endif /* BGP_SEND_ASPATH_CHECK */
1175
1176 /* For modify attribute, copy it to temporary structure. */
Josh Bailey0b597ef2011-07-20 20:49:11 -07001177 bgp_attr_dup (attr, riattr);
paulfee0f4c2004-09-13 05:12:46 +00001178
1179 /* next-hop-set */
1180 if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1181#ifdef HAVE_IPV6
1182 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +00001183 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paulfee0f4c2004-09-13 05:12:46 +00001184#endif /* HAVE_IPV6 */
1185 )
1186 {
1187 /* Set IPv4 nexthop. */
1188 if (p->family == AF_INET)
1189 {
1190 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001191 memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
paulfee0f4c2004-09-13 05:12:46 +00001192 IPV4_MAX_BYTELEN);
1193 else
1194 memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1195 }
1196#ifdef HAVE_IPV6
1197 /* Set IPv6 nexthop. */
1198 if (p->family == AF_INET6)
1199 {
1200 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001201 memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
paulfee0f4c2004-09-13 05:12:46 +00001202 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001203 attr->extra->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001204 }
1205#endif /* HAVE_IPV6 */
1206 }
1207
1208#ifdef HAVE_IPV6
1209 if (p->family == AF_INET6)
1210 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001211 struct attr_extra *attre = attr->extra;
1212
1213 assert (attr->extra);
1214
paulfee0f4c2004-09-13 05:12:46 +00001215 /* Left nexthop_local unchanged if so configured. */
1216 if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1217 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1218 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001219 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1220 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001221 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001222 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001223 }
1224
1225 /* Default nexthop_local treatment for RS-Clients */
1226 else
1227 {
1228 /* Announcer and RS-Client are both in the same network */
1229 if (rsclient->shared_network && from->shared_network &&
1230 (rsclient->ifindex == from->ifindex))
1231 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001232 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1233 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001234 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001235 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001236 }
1237
1238 /* Set link-local address for shared network peer. */
1239 else if (rsclient->shared_network
1240 && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1241 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001242 memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
paulfee0f4c2004-09-13 05:12:46 +00001243 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001244 attre->mp_nexthop_len = 32;
paulfee0f4c2004-09-13 05:12:46 +00001245 }
1246
1247 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001248 attre->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001249 }
1250
1251 }
1252#endif /* HAVE_IPV6 */
1253
1254
1255 /* If this is EBGP peer and remove-private-AS is set. */
1256 if (peer_sort (rsclient) == BGP_PEER_EBGP
1257 && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1258 && aspath_private_as_check (attr->aspath))
1259 attr->aspath = aspath_empty_get ();
1260
1261 /* Route map & unsuppress-map apply. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001262 if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
paulfee0f4c2004-09-13 05:12:46 +00001263 {
1264 info.peer = rsclient;
1265 info.attr = attr;
1266
1267 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1268
Paul Jakmafb982c22007-05-04 20:15:47 +00001269 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001270 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1271 else
1272 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1273
1274 rsclient->rmap_type = 0;
1275
1276 if (ret == RMAP_DENYMATCH)
1277 {
1278 bgp_attr_flush (attr);
1279 return 0;
1280 }
1281 }
1282
1283 return 1;
1284}
1285
1286struct bgp_info_pair
1287{
1288 struct bgp_info *old;
1289 struct bgp_info *new;
1290};
1291
paul94f2b392005-06-28 12:44:16 +00001292static void
Josh Bailey96450fa2011-07-20 20:45:12 -07001293bgp_best_selection (struct bgp *bgp, struct bgp_node *rn,
1294 struct bgp_maxpaths_cfg *mpath_cfg,
1295 struct bgp_info_pair *result)
paulfee0f4c2004-09-13 05:12:46 +00001296{
paul718e3742002-12-13 20:15:29 +00001297 struct bgp_info *new_select;
1298 struct bgp_info *old_select;
paulfee0f4c2004-09-13 05:12:46 +00001299 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00001300 struct bgp_info *ri1;
1301 struct bgp_info *ri2;
paulb40d9392005-08-22 22:34:41 +00001302 struct bgp_info *nextri = NULL;
Josh Bailey96450fa2011-07-20 20:45:12 -07001303 int paths_eq, do_mpath;
1304 struct list mp_list;
1305
1306 bgp_mp_list_init (&mp_list);
1307 do_mpath = (mpath_cfg->maxpaths_ebgp != BGP_DEFAULT_MAXPATHS ||
1308 mpath_cfg->maxpaths_ibgp != BGP_DEFAULT_MAXPATHS);
1309
paul718e3742002-12-13 20:15:29 +00001310 /* bgp deterministic-med */
1311 new_select = NULL;
1312 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1313 for (ri1 = rn->info; ri1; ri1 = ri1->next)
1314 {
1315 if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1316 continue;
1317 if (BGP_INFO_HOLDDOWN (ri1))
1318 continue;
1319
1320 new_select = ri1;
Josh Bailey6918e742011-07-20 20:48:20 -07001321 if (do_mpath)
1322 bgp_mp_list_add (&mp_list, ri1);
1323 old_select = CHECK_FLAG (ri1->flags, BGP_INFO_SELECTED) ? ri1 : NULL;
paul718e3742002-12-13 20:15:29 +00001324 if (ri1->next)
1325 for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1326 {
1327 if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1328 continue;
1329 if (BGP_INFO_HOLDDOWN (ri2))
1330 continue;
1331
1332 if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1333 || aspath_cmp_left_confed (ri1->attr->aspath,
1334 ri2->attr->aspath))
1335 {
Josh Bailey6918e742011-07-20 20:48:20 -07001336 if (CHECK_FLAG (ri2->flags, BGP_INFO_SELECTED))
1337 old_select = ri2;
Josh Bailey96450fa2011-07-20 20:45:12 -07001338 if (bgp_info_cmp (bgp, ri2, new_select, &paths_eq))
paul718e3742002-12-13 20:15:29 +00001339 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001340 bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001341 new_select = ri2;
Josh Bailey6918e742011-07-20 20:48:20 -07001342 if (do_mpath && !paths_eq)
1343 {
1344 bgp_mp_list_clear (&mp_list);
1345 bgp_mp_list_add (&mp_list, ri2);
1346 }
paul718e3742002-12-13 20:15:29 +00001347 }
1348
Josh Bailey6918e742011-07-20 20:48:20 -07001349 if (do_mpath && paths_eq)
1350 bgp_mp_list_add (&mp_list, ri2);
1351
Paul Jakma1a392d42006-09-07 00:24:49 +00001352 bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001353 }
1354 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001355 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1356 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
Josh Bailey6918e742011-07-20 20:48:20 -07001357
1358 bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);
1359 bgp_mp_list_clear (&mp_list);
paul718e3742002-12-13 20:15:29 +00001360 }
1361
1362 /* Check old selected route and new selected route. */
1363 old_select = NULL;
1364 new_select = NULL;
paulb40d9392005-08-22 22:34:41 +00001365 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
paul718e3742002-12-13 20:15:29 +00001366 {
1367 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1368 old_select = ri;
1369
1370 if (BGP_INFO_HOLDDOWN (ri))
paulb40d9392005-08-22 22:34:41 +00001371 {
1372 /* reap REMOVED routes, if needs be
1373 * selected route must stay for a while longer though
1374 */
1375 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1376 && (ri != old_select))
1377 bgp_info_reap (rn, ri);
1378
1379 continue;
1380 }
paul718e3742002-12-13 20:15:29 +00001381
1382 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1383 && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1384 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001385 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001386 continue;
1387 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001388 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1389 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001390
Josh Bailey96450fa2011-07-20 20:45:12 -07001391 if (bgp_info_cmp (bgp, ri, new_select, &paths_eq))
1392 {
Josh Bailey6918e742011-07-20 20:48:20 -07001393 if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1394 bgp_mp_dmed_deselect (new_select);
1395
Josh Bailey96450fa2011-07-20 20:45:12 -07001396 new_select = ri;
1397
1398 if (do_mpath && !paths_eq)
1399 {
1400 bgp_mp_list_clear (&mp_list);
1401 bgp_mp_list_add (&mp_list, ri);
1402 }
1403 }
Josh Bailey6918e742011-07-20 20:48:20 -07001404 else if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1405 bgp_mp_dmed_deselect (ri);
Josh Bailey96450fa2011-07-20 20:45:12 -07001406
1407 if (do_mpath && paths_eq)
1408 bgp_mp_list_add (&mp_list, ri);
paul718e3742002-12-13 20:15:29 +00001409 }
paulb40d9392005-08-22 22:34:41 +00001410
paulfee0f4c2004-09-13 05:12:46 +00001411
Josh Bailey6918e742011-07-20 20:48:20 -07001412 if (!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1413 bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);
Josh Bailey96450fa2011-07-20 20:45:12 -07001414
Josh Bailey0b597ef2011-07-20 20:49:11 -07001415 bgp_info_mpath_aggregate_update (new_select, old_select);
Josh Bailey96450fa2011-07-20 20:45:12 -07001416 bgp_mp_list_clear (&mp_list);
1417
1418 result->old = old_select;
1419 result->new = new_select;
1420
1421 return;
paulfee0f4c2004-09-13 05:12:46 +00001422}
1423
paul94f2b392005-06-28 12:44:16 +00001424static int
paulfee0f4c2004-09-13 05:12:46 +00001425bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
Paul Jakma9eda90c2007-08-30 13:36:17 +00001426 struct bgp_node *rn, afi_t afi, safi_t safi)
1427{
paulfee0f4c2004-09-13 05:12:46 +00001428 struct prefix *p;
Paul Jakma9eda90c2007-08-30 13:36:17 +00001429 struct attr attr = { 0 };
paulfee0f4c2004-09-13 05:12:46 +00001430
1431 p = &rn->p;
1432
Paul Jakma9eda90c2007-08-30 13:36:17 +00001433 /* Announce route to Established peer. */
1434 if (peer->status != Established)
paulfee0f4c2004-09-13 05:12:46 +00001435 return 0;
1436
Paul Jakma9eda90c2007-08-30 13:36:17 +00001437 /* Address family configuration check. */
1438 if (! peer->afc_nego[afi][safi])
paulfee0f4c2004-09-13 05:12:46 +00001439 return 0;
1440
Paul Jakma9eda90c2007-08-30 13:36:17 +00001441 /* First update is deferred until ORF or ROUTE-REFRESH is received */
paulfee0f4c2004-09-13 05:12:46 +00001442 if (CHECK_FLAG (peer->af_sflags[afi][safi],
1443 PEER_STATUS_ORF_WAIT_REFRESH))
1444 return 0;
1445
1446 switch (rn->table->type)
1447 {
1448 case BGP_TABLE_MAIN:
1449 /* Announcement to peer->conf. If the route is filtered,
1450 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001451 if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1452 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
paulfee0f4c2004-09-13 05:12:46 +00001453 else
1454 bgp_adj_out_unset (rn, peer, p, afi, safi);
1455 break;
1456 case BGP_TABLE_RSCLIENT:
1457 /* Announcement to peer->conf. If the route is filtered,
1458 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001459 if (selected &&
1460 bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1461 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1462 else
1463 bgp_adj_out_unset (rn, peer, p, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001464 break;
1465 }
Paul Jakma9eda90c2007-08-30 13:36:17 +00001466
1467 bgp_attr_extra_free (&attr);
1468
paulfee0f4c2004-09-13 05:12:46 +00001469 return 0;
paul200df112005-06-01 11:17:05 +00001470}
paulfee0f4c2004-09-13 05:12:46 +00001471
paul200df112005-06-01 11:17:05 +00001472struct bgp_process_queue
paulfee0f4c2004-09-13 05:12:46 +00001473{
paul200df112005-06-01 11:17:05 +00001474 struct bgp *bgp;
1475 struct bgp_node *rn;
1476 afi_t afi;
1477 safi_t safi;
1478};
1479
1480static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001481bgp_process_rsclient (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001482{
paul0fb58d52005-11-14 14:31:49 +00001483 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001484 struct bgp *bgp = pq->bgp;
1485 struct bgp_node *rn = pq->rn;
1486 afi_t afi = pq->afi;
1487 safi_t safi = pq->safi;
paulfee0f4c2004-09-13 05:12:46 +00001488 struct bgp_info *new_select;
1489 struct bgp_info *old_select;
1490 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001491 struct listnode *node, *nnode;
paul200df112005-06-01 11:17:05 +00001492 struct peer *rsclient = rn->table->owner;
1493
paulfee0f4c2004-09-13 05:12:46 +00001494 /* Best path selection. */
Josh Bailey96450fa2011-07-20 20:45:12 -07001495 bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
paulfee0f4c2004-09-13 05:12:46 +00001496 new_select = old_and_new.new;
1497 old_select = old_and_new.old;
1498
paul200df112005-06-01 11:17:05 +00001499 if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1500 {
Chris Caputo228da422009-07-18 05:44:03 +00001501 if (rsclient->group)
1502 for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1503 {
1504 /* Nothing to do. */
1505 if (old_select && old_select == new_select)
1506 if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1507 continue;
paulfee0f4c2004-09-13 05:12:46 +00001508
Chris Caputo228da422009-07-18 05:44:03 +00001509 if (old_select)
1510 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1511 if (new_select)
1512 {
1513 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1514 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001515 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
1516 }
paulfee0f4c2004-09-13 05:12:46 +00001517
Chris Caputo228da422009-07-18 05:44:03 +00001518 bgp_process_announce_selected (rsclient, new_select, rn,
1519 afi, safi);
1520 }
paul200df112005-06-01 11:17:05 +00001521 }
1522 else
1523 {
hassob7395792005-08-26 12:58:38 +00001524 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001525 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hassob7395792005-08-26 12:58:38 +00001526 if (new_select)
1527 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001528 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1529 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001530 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
hassob7395792005-08-26 12:58:38 +00001531 }
Paul Jakma9eda90c2007-08-30 13:36:17 +00001532 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
paul200df112005-06-01 11:17:05 +00001533 }
paulfee0f4c2004-09-13 05:12:46 +00001534
paulb40d9392005-08-22 22:34:41 +00001535 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1536 bgp_info_reap (rn, old_select);
1537
paul200df112005-06-01 11:17:05 +00001538 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1539 return WQ_SUCCESS;
paulfee0f4c2004-09-13 05:12:46 +00001540}
1541
paul200df112005-06-01 11:17:05 +00001542static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001543bgp_process_main (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001544{
paul0fb58d52005-11-14 14:31:49 +00001545 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001546 struct bgp *bgp = pq->bgp;
1547 struct bgp_node *rn = pq->rn;
1548 afi_t afi = pq->afi;
1549 safi_t safi = pq->safi;
1550 struct prefix *p = &rn->p;
paulfee0f4c2004-09-13 05:12:46 +00001551 struct bgp_info *new_select;
1552 struct bgp_info *old_select;
1553 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001554 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00001555 struct peer *peer;
Paul Jakmafb982c22007-05-04 20:15:47 +00001556
paulfee0f4c2004-09-13 05:12:46 +00001557 /* Best path selection. */
Josh Bailey96450fa2011-07-20 20:45:12 -07001558 bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
paulfee0f4c2004-09-13 05:12:46 +00001559 old_select = old_and_new.old;
1560 new_select = old_and_new.new;
1561
1562 /* Nothing to do. */
1563 if (old_select && old_select == new_select)
1564 {
1565 if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
paul200df112005-06-01 11:17:05 +00001566 {
Josh Bailey8196f132011-07-20 20:47:07 -07001567 if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED) ||
1568 CHECK_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG))
G.Balaji5a616c02011-11-26 21:58:42 +04001569 bgp_zebra_announce (p, old_select, bgp, safi);
paul200df112005-06-01 11:17:05 +00001570
Josh Bailey8196f132011-07-20 20:47:07 -07001571 UNSET_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG);
paul200df112005-06-01 11:17:05 +00001572 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1573 return WQ_SUCCESS;
1574 }
paulfee0f4c2004-09-13 05:12:46 +00001575 }
paul718e3742002-12-13 20:15:29 +00001576
hasso338b3422005-02-23 14:27:24 +00001577 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001578 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hasso338b3422005-02-23 14:27:24 +00001579 if (new_select)
1580 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001581 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1582 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
Josh Bailey8196f132011-07-20 20:47:07 -07001583 UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
hasso338b3422005-02-23 14:27:24 +00001584 }
1585
1586
paul718e3742002-12-13 20:15:29 +00001587 /* Check each BGP peer. */
paul1eb8ef22005-04-07 07:30:20 +00001588 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00001589 {
Paul Jakma9eda90c2007-08-30 13:36:17 +00001590 bgp_process_announce_selected (peer, new_select, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001591 }
1592
1593 /* FIB update. */
G.Balaji5a616c02011-11-26 21:58:42 +04001594 if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp->name &&
1595 ! bgp_option_check (BGP_OPT_NO_FIB)))
paul718e3742002-12-13 20:15:29 +00001596 {
1597 if (new_select
1598 && new_select->type == ZEBRA_ROUTE_BGP
1599 && new_select->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04001600 bgp_zebra_announce (p, new_select, bgp, safi);
paul718e3742002-12-13 20:15:29 +00001601 else
1602 {
1603 /* Withdraw the route from the kernel. */
1604 if (old_select
1605 && old_select->type == ZEBRA_ROUTE_BGP
1606 && old_select->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04001607 bgp_zebra_withdraw (p, old_select, safi);
paul718e3742002-12-13 20:15:29 +00001608 }
1609 }
paulb40d9392005-08-22 22:34:41 +00001610
1611 /* Reap old select bgp_info, it it has been removed */
1612 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1613 bgp_info_reap (rn, old_select);
1614
paul200df112005-06-01 11:17:05 +00001615 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1616 return WQ_SUCCESS;
paul718e3742002-12-13 20:15:29 +00001617}
1618
paul200df112005-06-01 11:17:05 +00001619static void
paul0fb58d52005-11-14 14:31:49 +00001620bgp_processq_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001621{
paul0fb58d52005-11-14 14:31:49 +00001622 struct bgp_process_queue *pq = data;
Chris Caputo228da422009-07-18 05:44:03 +00001623 struct bgp_table *table = pq->rn->table;
paul0fb58d52005-11-14 14:31:49 +00001624
Chris Caputo228da422009-07-18 05:44:03 +00001625 bgp_unlock (pq->bgp);
paul200df112005-06-01 11:17:05 +00001626 bgp_unlock_node (pq->rn);
Chris Caputo228da422009-07-18 05:44:03 +00001627 bgp_table_unlock (table);
paul200df112005-06-01 11:17:05 +00001628 XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1629}
1630
1631static void
1632bgp_process_queue_init (void)
1633{
1634 bm->process_main_queue
1635 = work_queue_new (bm->master, "process_main_queue");
1636 bm->process_rsclient_queue
1637 = work_queue_new (bm->master, "process_rsclient_queue");
1638
1639 if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1640 {
1641 zlog_err ("%s: Failed to allocate work queue", __func__);
1642 exit (1);
1643 }
1644
1645 bm->process_main_queue->spec.workfunc = &bgp_process_main;
paul200df112005-06-01 11:17:05 +00001646 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
Paul Jakma838bbde2010-01-08 14:05:32 +00001647 bm->process_main_queue->spec.max_retries = 0;
1648 bm->process_main_queue->spec.hold = 50;
1649
1650 memcpy (bm->process_rsclient_queue, bm->process_main_queue,
1651 sizeof (struct work_queue *));
1652 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
paul200df112005-06-01 11:17:05 +00001653}
1654
1655void
paulfee0f4c2004-09-13 05:12:46 +00001656bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1657{
paul200df112005-06-01 11:17:05 +00001658 struct bgp_process_queue *pqnode;
1659
1660 /* already scheduled for processing? */
1661 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1662 return;
1663
1664 if ( (bm->process_main_queue == NULL) ||
1665 (bm->process_rsclient_queue == NULL) )
1666 bgp_process_queue_init ();
1667
1668 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1669 sizeof (struct bgp_process_queue));
1670 if (!pqnode)
1671 return;
Chris Caputo228da422009-07-18 05:44:03 +00001672
1673 /* all unlocked in bgp_processq_del */
1674 bgp_table_lock (rn->table);
1675 pqnode->rn = bgp_lock_node (rn);
paul200df112005-06-01 11:17:05 +00001676 pqnode->bgp = bgp;
Chris Caputo228da422009-07-18 05:44:03 +00001677 bgp_lock (bgp);
paul200df112005-06-01 11:17:05 +00001678 pqnode->afi = afi;
1679 pqnode->safi = safi;
1680
paulfee0f4c2004-09-13 05:12:46 +00001681 switch (rn->table->type)
1682 {
paul200df112005-06-01 11:17:05 +00001683 case BGP_TABLE_MAIN:
1684 work_queue_add (bm->process_main_queue, pqnode);
1685 break;
1686 case BGP_TABLE_RSCLIENT:
1687 work_queue_add (bm->process_rsclient_queue, pqnode);
1688 break;
paulfee0f4c2004-09-13 05:12:46 +00001689 }
paul200df112005-06-01 11:17:05 +00001690
1691 return;
paulfee0f4c2004-09-13 05:12:46 +00001692}
hasso0a486e52005-02-01 20:57:17 +00001693
paul94f2b392005-06-28 12:44:16 +00001694static int
hasso0a486e52005-02-01 20:57:17 +00001695bgp_maximum_prefix_restart_timer (struct thread *thread)
1696{
1697 struct peer *peer;
1698
1699 peer = THREAD_ARG (thread);
1700 peer->t_pmax_restart = NULL;
1701
1702 if (BGP_DEBUG (events, EVENTS))
1703 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1704 peer->host);
1705
1706 peer_clear (peer);
1707
1708 return 0;
1709}
1710
paulfee0f4c2004-09-13 05:12:46 +00001711int
paul5228ad22004-06-04 17:58:18 +00001712bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1713 safi_t safi, int always)
paul718e3742002-12-13 20:15:29 +00001714{
hassoe0701b72004-05-20 09:19:34 +00001715 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1716 return 0;
1717
1718 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
paul718e3742002-12-13 20:15:29 +00001719 {
hassoe0701b72004-05-20 09:19:34 +00001720 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1721 && ! always)
1722 return 0;
paul718e3742002-12-13 20:15:29 +00001723
hassoe0701b72004-05-20 09:19:34 +00001724 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001725 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1726 "limit %ld", afi_safi_print (afi, safi), peer->host,
1727 peer->pcount[afi][safi], peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001728 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
paul718e3742002-12-13 20:15:29 +00001729
hassoe0701b72004-05-20 09:19:34 +00001730 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1731 return 0;
paul718e3742002-12-13 20:15:29 +00001732
hassoe0701b72004-05-20 09:19:34 +00001733 {
paul5228ad22004-06-04 17:58:18 +00001734 u_int8_t ndata[7];
hassoe0701b72004-05-20 09:19:34 +00001735
1736 if (safi == SAFI_MPLS_VPN)
Denis Ovsienko42e6d742011-07-14 12:36:19 +04001737 safi = SAFI_MPLS_LABELED_VPN;
paul5228ad22004-06-04 17:58:18 +00001738
1739 ndata[0] = (afi >> 8);
1740 ndata[1] = afi;
1741 ndata[2] = safi;
1742 ndata[3] = (peer->pmax[afi][safi] >> 24);
1743 ndata[4] = (peer->pmax[afi][safi] >> 16);
1744 ndata[5] = (peer->pmax[afi][safi] >> 8);
1745 ndata[6] = (peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001746
1747 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1748 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1749 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1750 }
hasso0a486e52005-02-01 20:57:17 +00001751
1752 /* restart timer start */
1753 if (peer->pmax_restart[afi][safi])
1754 {
1755 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1756
1757 if (BGP_DEBUG (events, EVENTS))
1758 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1759 peer->host, peer->v_pmax_restart);
1760
1761 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1762 peer->v_pmax_restart);
1763 }
1764
hassoe0701b72004-05-20 09:19:34 +00001765 return 1;
paul718e3742002-12-13 20:15:29 +00001766 }
hassoe0701b72004-05-20 09:19:34 +00001767 else
1768 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1769
1770 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1771 {
1772 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1773 && ! always)
1774 return 0;
1775
1776 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001777 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1778 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1779 peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001780 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1781 }
1782 else
1783 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
paul718e3742002-12-13 20:15:29 +00001784 return 0;
1785}
1786
paulb40d9392005-08-22 22:34:41 +00001787/* Unconditionally remove the route from the RIB, without taking
1788 * damping into consideration (eg, because the session went down)
1789 */
paul94f2b392005-06-28 12:44:16 +00001790static void
paul718e3742002-12-13 20:15:29 +00001791bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1792 afi_t afi, safi_t safi)
1793{
paul902212c2006-02-05 17:51:19 +00001794 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1795
1796 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1797 bgp_info_delete (rn, ri); /* keep historical info */
1798
paulb40d9392005-08-22 22:34:41 +00001799 bgp_process (peer->bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001800}
1801
paul94f2b392005-06-28 12:44:16 +00001802static void
paul718e3742002-12-13 20:15:29 +00001803bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
paulb40d9392005-08-22 22:34:41 +00001804 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001805{
paul718e3742002-12-13 20:15:29 +00001806 int status = BGP_DAMP_NONE;
1807
paulb40d9392005-08-22 22:34:41 +00001808 /* apply dampening, if result is suppressed, we'll be retaining
1809 * the bgp_info in the RIB for historical reference.
1810 */
1811 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1812 && peer_sort (peer) == BGP_PEER_EBGP)
1813 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1814 == BGP_DAMP_SUPPRESSED)
paul902212c2006-02-05 17:51:19 +00001815 {
paul902212c2006-02-05 17:51:19 +00001816 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1817 return;
1818 }
1819
1820 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00001821}
1822
paul94f2b392005-06-28 12:44:16 +00001823static void
paulfee0f4c2004-09-13 05:12:46 +00001824bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1825 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1826 int sub_type, struct prefix_rd *prd, u_char *tag)
1827{
1828 struct bgp_node *rn;
1829 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00001830 struct attr new_attr = { 0 };
paulfee0f4c2004-09-13 05:12:46 +00001831 struct attr *attr_new;
1832 struct attr *attr_new2;
1833 struct bgp_info *ri;
1834 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001835 const char *reason;
paulfee0f4c2004-09-13 05:12:46 +00001836 char buf[SU_ADDRSTRLEN];
1837
1838 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1839 if (peer == rsclient)
1840 return;
1841
1842 bgp = peer->bgp;
1843 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1844
1845 /* Check previously received route. */
1846 for (ri = rn->info; ri; ri = ri->next)
1847 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1848 break;
1849
1850 /* AS path loop check. */
1851 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1852 {
1853 reason = "as-path contains our own AS;";
1854 goto filtered;
1855 }
1856
1857 /* Route reflector originator ID check. */
1858 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00001859 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001860 {
1861 reason = "originator is us;";
1862 goto filtered;
1863 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001864
1865 bgp_attr_dup (&new_attr, attr);
paulfee0f4c2004-09-13 05:12:46 +00001866
1867 /* Apply export policy. */
1868 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1869 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1870 {
1871 reason = "export-policy;";
1872 goto filtered;
1873 }
1874
1875 attr_new2 = bgp_attr_intern (&new_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001876
paulfee0f4c2004-09-13 05:12:46 +00001877 /* Apply import policy. */
1878 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1879 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001880 bgp_attr_unintern (&attr_new2);
paulfee0f4c2004-09-13 05:12:46 +00001881
1882 reason = "import-policy;";
1883 goto filtered;
1884 }
1885
1886 attr_new = bgp_attr_intern (&new_attr);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001887 bgp_attr_unintern (&attr_new2);
paulfee0f4c2004-09-13 05:12:46 +00001888
1889 /* IPv4 unicast next hop check. */
G.Balaji5a616c02011-11-26 21:58:42 +04001890 if ((afi == AFI_IP) && ((safi == SAFI_UNICAST) || safi == SAFI_MULTICAST))
paulfee0f4c2004-09-13 05:12:46 +00001891 {
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04001892 /* Next hop must not be 0.0.0.0 nor Class D/E address. */
paulfee0f4c2004-09-13 05:12:46 +00001893 if (new_attr.nexthop.s_addr == 0
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04001894 || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr)))
paulfee0f4c2004-09-13 05:12:46 +00001895 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001896 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001897
1898 reason = "martian next-hop;";
1899 goto filtered;
1900 }
1901 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001902
1903 /* new_attr isn't passed to any functions after here */
1904 bgp_attr_extra_free (&new_attr);
1905
paulfee0f4c2004-09-13 05:12:46 +00001906 /* If the update is implicit withdraw. */
1907 if (ri)
1908 {
Stephen Hemminger65957882010-01-15 16:22:10 +03001909 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001910
1911 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00001912 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1913 && attrhash_cmp (ri->attr, attr_new))
paulfee0f4c2004-09-13 05:12:46 +00001914 {
1915
Paul Jakma1a392d42006-09-07 00:24:49 +00001916 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001917
1918 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001919 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001920 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1921 peer->host,
1922 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1923 p->prefixlen, rsclient->host);
1924
Chris Caputo228da422009-07-18 05:44:03 +00001925 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001926 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001927
Chris Caputo228da422009-07-18 05:44:03 +00001928 return;
paulfee0f4c2004-09-13 05:12:46 +00001929 }
1930
Paul Jakma16d2e242007-04-10 19:32:10 +00001931 /* Withdraw/Announce before we fully processed the withdraw */
1932 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1933 bgp_info_restore (rn, ri);
1934
paulfee0f4c2004-09-13 05:12:46 +00001935 /* Received Logging. */
1936 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001937 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001938 peer->host,
1939 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1940 p->prefixlen, rsclient->host);
1941
1942 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00001943 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001944
1945 /* Update to new attribute. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00001946 bgp_attr_unintern (&ri->attr);
paulfee0f4c2004-09-13 05:12:46 +00001947 ri->attr = attr_new;
1948
1949 /* Update MPLS tag. */
1950 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001951 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001952
Paul Jakma1a392d42006-09-07 00:24:49 +00001953 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001954
1955 /* Process change. */
1956 bgp_process (bgp, rn, afi, safi);
1957 bgp_unlock_node (rn);
1958
1959 return;
1960 }
1961
1962 /* Received Logging. */
1963 if (BGP_DEBUG (update, UPDATE_IN))
1964 {
ajsd2c1f162004-12-08 21:10:20 +00001965 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001966 peer->host,
1967 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1968 p->prefixlen, rsclient->host);
1969 }
1970
1971 /* Make new BGP info. */
1972 new = bgp_info_new ();
1973 new->type = type;
1974 new->sub_type = sub_type;
1975 new->peer = peer;
1976 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03001977 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001978
1979 /* Update MPLS tag. */
1980 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001981 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001982
Paul Jakma1a392d42006-09-07 00:24:49 +00001983 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001984
1985 /* Register new BGP information. */
1986 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00001987
1988 /* route_node_get lock */
1989 bgp_unlock_node (rn);
1990
paulfee0f4c2004-09-13 05:12:46 +00001991 /* Process change. */
1992 bgp_process (bgp, rn, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00001993
1994 bgp_attr_extra_free (&new_attr);
1995
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);
Paul Jakmafb982c22007-05-04 20:15:47 +00002012
2013 if (new_attr.extra)
2014 bgp_attr_extra_free (&new_attr);
2015
paulfee0f4c2004-09-13 05:12:46 +00002016 return;
2017}
2018
paul94f2b392005-06-28 12:44:16 +00002019static void
paulfee0f4c2004-09-13 05:12:46 +00002020bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
2021 struct peer *peer, struct prefix *p, int type, int sub_type,
2022 struct prefix_rd *prd, u_char *tag)
Chris Caputo228da422009-07-18 05:44:03 +00002023{
paulfee0f4c2004-09-13 05:12:46 +00002024 struct bgp_node *rn;
2025 struct bgp_info *ri;
2026 char buf[SU_ADDRSTRLEN];
2027
2028 if (rsclient == peer)
Chris Caputo228da422009-07-18 05:44:03 +00002029 return;
paulfee0f4c2004-09-13 05:12:46 +00002030
2031 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
2032
2033 /* Lookup withdrawn route. */
2034 for (ri = rn->info; ri; ri = ri->next)
2035 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2036 break;
2037
2038 /* Withdraw specified route from routing table. */
2039 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002040 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00002041 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002042 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00002043 "%s Can't find the route %s/%d", peer->host,
2044 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2045 p->prefixlen);
2046
2047 /* Unlock bgp_node_get() lock. */
Chris Caputo228da422009-07-18 05:44:03 +00002048 bgp_unlock_node (rn);
2049}
paulfee0f4c2004-09-13 05:12:46 +00002050
paul94f2b392005-06-28 12:44:16 +00002051static int
paulfee0f4c2004-09-13 05:12:46 +00002052bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
paul718e3742002-12-13 20:15:29 +00002053 afi_t afi, safi_t safi, int type, int sub_type,
2054 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2055{
2056 int ret;
2057 int aspath_loop_count = 0;
2058 struct bgp_node *rn;
2059 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00002060 struct attr new_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00002061 struct attr *attr_new;
2062 struct bgp_info *ri;
2063 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00002064 const char *reason;
paul718e3742002-12-13 20:15:29 +00002065 char buf[SU_ADDRSTRLEN];
2066
2067 bgp = peer->bgp;
paulfee0f4c2004-09-13 05:12:46 +00002068 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
Paul Jakmafb982c22007-05-04 20:15:47 +00002069
paul718e3742002-12-13 20:15:29 +00002070 /* When peer's soft reconfiguration enabled. Record input packet in
2071 Adj-RIBs-In. */
2072 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2073 && peer != bgp->peer_self && ! soft_reconfig)
2074 bgp_adj_in_set (rn, peer, attr);
2075
2076 /* Check previously received route. */
2077 for (ri = rn->info; ri; ri = ri->next)
2078 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2079 break;
2080
2081 /* AS path local-as loop check. */
2082 if (peer->change_local_as)
2083 {
2084 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2085 aspath_loop_count = 1;
2086
2087 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2088 {
2089 reason = "as-path contains our own AS;";
2090 goto filtered;
2091 }
2092 }
2093
2094 /* AS path loop check. */
2095 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2096 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2097 && aspath_loop_check(attr->aspath, bgp->confed_id)
2098 > peer->allowas_in[afi][safi]))
2099 {
2100 reason = "as-path contains our own AS;";
2101 goto filtered;
2102 }
2103
2104 /* Route reflector originator ID check. */
2105 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00002106 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +00002107 {
2108 reason = "originator is us;";
2109 goto filtered;
2110 }
2111
2112 /* Route reflector cluster ID check. */
2113 if (bgp_cluster_filter (peer, attr))
2114 {
2115 reason = "reflected from the same cluster;";
2116 goto filtered;
2117 }
2118
2119 /* Apply incoming filter. */
2120 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2121 {
2122 reason = "filter;";
2123 goto filtered;
2124 }
2125
2126 /* Apply incoming route-map. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002127 bgp_attr_dup (&new_attr, attr);
paul718e3742002-12-13 20:15:29 +00002128
2129 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2130 {
2131 reason = "route-map;";
2132 goto filtered;
2133 }
2134
2135 /* IPv4 unicast next hop check. */
2136 if (afi == AFI_IP && safi == SAFI_UNICAST)
2137 {
2138 /* If the peer is EBGP and nexthop is not on connected route,
2139 discard it. */
2140 if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
Denis Ovsienko8e80bdf2011-08-05 18:52:52 +04002141 && ! bgp_nexthop_onlink (afi, &new_attr)
hasso6ffd2072005-02-02 14:50:11 +00002142 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
paul718e3742002-12-13 20:15:29 +00002143 {
2144 reason = "non-connected next-hop;";
2145 goto filtered;
2146 }
2147
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04002148 /* Next hop must not be 0.0.0.0 nor Class D/E address. Next hop
paul718e3742002-12-13 20:15:29 +00002149 must not be my own address. */
2150 if (bgp_nexthop_self (afi, &new_attr)
2151 || new_attr.nexthop.s_addr == 0
Denis Ovsienko733cd9e2011-12-17 19:39:30 +04002152 || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr)))
paul718e3742002-12-13 20:15:29 +00002153 {
2154 reason = "martian next-hop;";
2155 goto filtered;
2156 }
2157 }
2158
2159 attr_new = bgp_attr_intern (&new_attr);
2160
2161 /* If the update is implicit withdraw. */
2162 if (ri)
2163 {
Stephen Hemminger65957882010-01-15 16:22:10 +03002164 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002165
2166 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00002167 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2168 && attrhash_cmp (ri->attr, attr_new))
paul718e3742002-12-13 20:15:29 +00002169 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002170 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00002171
2172 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2173 && peer_sort (peer) == BGP_PEER_EBGP
2174 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2175 {
2176 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002177 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002178 peer->host,
2179 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2180 p->prefixlen);
2181
paul902212c2006-02-05 17:51:19 +00002182 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2183 {
2184 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2185 bgp_process (bgp, rn, afi, safi);
2186 }
paul718e3742002-12-13 20:15:29 +00002187 }
Paul Jakma16d2e242007-04-10 19:32:10 +00002188 else /* Duplicate - odd */
paul718e3742002-12-13 20:15:29 +00002189 {
2190 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002191 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002192 "%s rcvd %s/%d...duplicate ignored",
2193 peer->host,
2194 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2195 p->prefixlen);
hasso93406d82005-02-02 14:40:33 +00002196
2197 /* graceful restart STALE flag unset. */
2198 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2199 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002200 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
paul902212c2006-02-05 17:51:19 +00002201 bgp_process (bgp, rn, afi, safi);
hasso93406d82005-02-02 14:40:33 +00002202 }
paul718e3742002-12-13 20:15:29 +00002203 }
2204
2205 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002206 bgp_attr_unintern (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00002207 bgp_attr_extra_free (&new_attr);
2208
paul718e3742002-12-13 20:15:29 +00002209 return 0;
2210 }
2211
Paul Jakma16d2e242007-04-10 19:32:10 +00002212 /* Withdraw/Announce before we fully processed the withdraw */
2213 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2214 {
2215 if (BGP_DEBUG (update, UPDATE_IN))
2216 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2217 peer->host,
2218 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2219 p->prefixlen);
2220 bgp_info_restore (rn, ri);
2221 }
2222
paul718e3742002-12-13 20:15:29 +00002223 /* Received Logging. */
2224 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002225 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002226 peer->host,
2227 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2228 p->prefixlen);
2229
hasso93406d82005-02-02 14:40:33 +00002230 /* graceful restart STALE flag unset. */
2231 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma1a392d42006-09-07 00:24:49 +00002232 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
hasso93406d82005-02-02 14:40:33 +00002233
paul718e3742002-12-13 20:15:29 +00002234 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00002235 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul902212c2006-02-05 17:51:19 +00002236
2237 /* implicit withdraw, decrement aggregate and pcount here.
2238 * only if update is accepted, they'll increment below.
2239 */
paul902212c2006-02-05 17:51:19 +00002240 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2241
paul718e3742002-12-13 20:15:29 +00002242 /* Update bgp route dampening information. */
2243 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2244 && peer_sort (peer) == BGP_PEER_EBGP)
2245 {
2246 /* This is implicit withdraw so we should update dampening
2247 information. */
2248 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2249 bgp_damp_withdraw (ri, rn, afi, safi, 1);
paul718e3742002-12-13 20:15:29 +00002250 }
2251
paul718e3742002-12-13 20:15:29 +00002252 /* Update to new attribute. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002253 bgp_attr_unintern (&ri->attr);
paul718e3742002-12-13 20:15:29 +00002254 ri->attr = attr_new;
2255
2256 /* Update MPLS tag. */
2257 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002258 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002259
2260 /* Update bgp route dampening information. */
2261 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2262 && peer_sort (peer) == BGP_PEER_EBGP)
2263 {
2264 /* Now we do normal update dampening. */
2265 ret = bgp_damp_update (ri, rn, afi, safi);
2266 if (ret == BGP_DAMP_SUPPRESSED)
2267 {
2268 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002269 bgp_attr_extra_free (&new_attr);
paul718e3742002-12-13 20:15:29 +00002270 return 0;
2271 }
2272 }
2273
2274 /* Nexthop reachability check. */
2275 if ((afi == AFI_IP || afi == AFI_IP6)
2276 && safi == SAFI_UNICAST
2277 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002278 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002279 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002280 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002281 {
2282 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002283 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002284 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002285 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002286 }
2287 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002288 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002289
2290 /* Process change. */
2291 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2292
2293 bgp_process (bgp, rn, afi, safi);
2294 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002295 bgp_attr_extra_free (&new_attr);
2296
paul718e3742002-12-13 20:15:29 +00002297 return 0;
2298 }
2299
2300 /* Received Logging. */
2301 if (BGP_DEBUG (update, UPDATE_IN))
2302 {
ajsd2c1f162004-12-08 21:10:20 +00002303 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002304 peer->host,
2305 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2306 p->prefixlen);
2307 }
2308
paul718e3742002-12-13 20:15:29 +00002309 /* Make new BGP info. */
2310 new = bgp_info_new ();
2311 new->type = type;
2312 new->sub_type = sub_type;
2313 new->peer = peer;
2314 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03002315 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002316
2317 /* Update MPLS tag. */
2318 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002319 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002320
2321 /* Nexthop reachability check. */
2322 if ((afi == AFI_IP || afi == AFI_IP6)
2323 && safi == SAFI_UNICAST
2324 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002325 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002326 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002327 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002328 {
2329 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002330 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002331 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002332 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002333 }
2334 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002335 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002336
paul902212c2006-02-05 17:51:19 +00002337 /* Increment prefix */
paul718e3742002-12-13 20:15:29 +00002338 bgp_aggregate_increment (bgp, p, new, afi, safi);
2339
2340 /* Register new BGP information. */
2341 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00002342
2343 /* route_node_get lock */
2344 bgp_unlock_node (rn);
2345
Paul Jakmafb982c22007-05-04 20:15:47 +00002346 bgp_attr_extra_free (&new_attr);
2347
paul718e3742002-12-13 20:15:29 +00002348 /* If maximum prefix count is configured and current prefix
2349 count exeed it. */
hassoe0701b72004-05-20 09:19:34 +00002350 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2351 return -1;
paul718e3742002-12-13 20:15:29 +00002352
2353 /* Process change. */
2354 bgp_process (bgp, rn, afi, safi);
2355
2356 return 0;
2357
2358 /* This BGP update is filtered. Log the reason then update BGP
2359 entry. */
2360 filtered:
2361 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002362 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002363 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2364 peer->host,
2365 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2366 p->prefixlen, reason);
2367
2368 if (ri)
paulb40d9392005-08-22 22:34:41 +00002369 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002370
2371 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002372
2373 bgp_attr_extra_free (&new_attr);
2374
paul718e3742002-12-13 20:15:29 +00002375 return 0;
2376}
2377
2378int
paulfee0f4c2004-09-13 05:12:46 +00002379bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2380 afi_t afi, safi_t safi, int type, int sub_type,
2381 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2382{
2383 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002384 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00002385 struct bgp *bgp;
2386 int ret;
2387
2388 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2389 soft_reconfig);
2390
2391 bgp = peer->bgp;
2392
2393 /* Process the update for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002394 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002395 {
2396 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2397 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2398 sub_type, prd, tag);
2399 }
2400
2401 return ret;
2402}
2403
2404int
paul718e3742002-12-13 20:15:29 +00002405bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
paul94f2b392005-06-28 12:44:16 +00002406 afi_t afi, safi_t safi, int type, int sub_type,
2407 struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00002408{
2409 struct bgp *bgp;
2410 char buf[SU_ADDRSTRLEN];
2411 struct bgp_node *rn;
2412 struct bgp_info *ri;
paulfee0f4c2004-09-13 05:12:46 +00002413 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002414 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002415
2416 bgp = peer->bgp;
2417
paulfee0f4c2004-09-13 05:12:46 +00002418 /* Process the withdraw for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002419 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002420 {
2421 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2422 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2423 }
2424
paul718e3742002-12-13 20:15:29 +00002425 /* Logging. */
2426 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002427 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
paul718e3742002-12-13 20:15:29 +00002428 peer->host,
2429 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2430 p->prefixlen);
2431
2432 /* Lookup node. */
paulfee0f4c2004-09-13 05:12:46 +00002433 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00002434
2435 /* If peer is soft reconfiguration enabled. Record input packet for
2436 further calculation. */
2437 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2438 && peer != bgp->peer_self)
2439 bgp_adj_in_unset (rn, peer);
2440
2441 /* Lookup withdrawn route. */
2442 for (ri = rn->info; ri; ri = ri->next)
2443 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2444 break;
2445
2446 /* Withdraw specified route from routing table. */
2447 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002448 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002449 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002450 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002451 "%s Can't find the route %s/%d", peer->host,
2452 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2453 p->prefixlen);
2454
2455 /* Unlock bgp_node_get() lock. */
2456 bgp_unlock_node (rn);
2457
2458 return 0;
2459}
2460
2461void
2462bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2463{
2464 struct bgp *bgp;
Chris Caputo228da422009-07-18 05:44:03 +00002465 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002466 struct aspath *aspath = { 0 };
paul718e3742002-12-13 20:15:29 +00002467 struct prefix p;
2468 struct bgp_info binfo;
2469 struct peer *from;
2470 int ret = RMAP_DENYMATCH;
Paul Jakmafb982c22007-05-04 20:15:47 +00002471
Paul Jakmab2497022007-06-14 11:17:58 +00002472 if (!(afi == AFI_IP || afi == AFI_IP6))
Paul Jakmafb982c22007-05-04 20:15:47 +00002473 return;
2474
paul718e3742002-12-13 20:15:29 +00002475 bgp = peer->bgp;
2476 from = bgp->peer_self;
Paul Jakmafb982c22007-05-04 20:15:47 +00002477
paul718e3742002-12-13 20:15:29 +00002478 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2479 aspath = attr.aspath;
2480 attr.local_pref = bgp->default_local_pref;
2481 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2482
2483 if (afi == AFI_IP)
2484 str2prefix ("0.0.0.0/0", &p);
2485#ifdef HAVE_IPV6
2486 else if (afi == AFI_IP6)
2487 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002488 struct attr_extra *ae;
2489 attr.extra = NULL;
2490
2491 ae = bgp_attr_extra_get (&attr);
2492 attr.extra = ae;
2493
paul718e3742002-12-13 20:15:29 +00002494 str2prefix ("::/0", &p);
2495
2496 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002497 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +00002498 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002499 ae->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00002500
2501 /* If the peer is on shared nextwork and we have link-local
2502 nexthop set it. */
2503 if (peer->shared_network
2504 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2505 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002506 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00002507 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002508 ae->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00002509 }
2510 }
2511#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00002512
2513 if (peer->default_rmap[afi][safi].name)
2514 {
2515 binfo.peer = bgp->peer_self;
2516 binfo.attr = &attr;
2517
paulfee0f4c2004-09-13 05:12:46 +00002518 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2519
paul718e3742002-12-13 20:15:29 +00002520 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2521 RMAP_BGP, &binfo);
2522
paulfee0f4c2004-09-13 05:12:46 +00002523 bgp->peer_self->rmap_type = 0;
2524
paul718e3742002-12-13 20:15:29 +00002525 if (ret == RMAP_DENYMATCH)
2526 {
2527 bgp_attr_flush (&attr);
2528 withdraw = 1;
2529 }
2530 }
2531
2532 if (withdraw)
2533 {
2534 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2535 bgp_default_withdraw_send (peer, afi, safi);
2536 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2537 }
2538 else
2539 {
2540 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2541 bgp_default_update_send (peer, &attr, afi, safi, from);
2542 }
Paul Jakmafb982c22007-05-04 20:15:47 +00002543
2544 bgp_attr_extra_free (&attr);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00002545 aspath_unintern (&aspath);
paul718e3742002-12-13 20:15:29 +00002546}
2547
2548static void
2549bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
paulfee0f4c2004-09-13 05:12:46 +00002550 struct bgp_table *table, int rsclient)
paul718e3742002-12-13 20:15:29 +00002551{
2552 struct bgp_node *rn;
2553 struct bgp_info *ri;
Chris Caputo228da422009-07-18 05:44:03 +00002554 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002555
paul718e3742002-12-13 20:15:29 +00002556 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002557 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
paul718e3742002-12-13 20:15:29 +00002558
2559 if (safi != SAFI_MPLS_VPN
2560 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2561 bgp_default_originate (peer, afi, safi, 0);
2562
2563 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2564 for (ri = rn->info; ri; ri = ri->next)
2565 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2566 {
paulfee0f4c2004-09-13 05:12:46 +00002567 if ( (rsclient) ?
2568 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2569 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
paul718e3742002-12-13 20:15:29 +00002570 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2571 else
2572 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00002573
2574 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00002575 }
2576}
2577
2578void
2579bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2580{
2581 struct bgp_node *rn;
2582 struct bgp_table *table;
2583
2584 if (peer->status != Established)
2585 return;
2586
2587 if (! peer->afc_nego[afi][safi])
2588 return;
2589
2590 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2591 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2592 return;
2593
2594 if (safi != SAFI_MPLS_VPN)
paulfee0f4c2004-09-13 05:12:46 +00002595 bgp_announce_table (peer, afi, safi, NULL, 0);
paul718e3742002-12-13 20:15:29 +00002596 else
2597 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2598 rn = bgp_route_next(rn))
2599 if ((table = (rn->info)) != NULL)
paulfee0f4c2004-09-13 05:12:46 +00002600 bgp_announce_table (peer, afi, safi, table, 0);
2601
2602 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2603 bgp_announce_table (peer, afi, safi, NULL, 1);
paul718e3742002-12-13 20:15:29 +00002604}
2605
2606void
2607bgp_announce_route_all (struct peer *peer)
2608{
2609 afi_t afi;
2610 safi_t safi;
2611
2612 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2613 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2614 bgp_announce_route (peer, afi, safi);
2615}
2616
2617static void
paulfee0f4c2004-09-13 05:12:46 +00002618bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2619 safi_t safi, struct bgp_table *table)
2620{
2621 struct bgp_node *rn;
2622 struct bgp_adj_in *ain;
2623
2624 if (! table)
2625 table = rsclient->bgp->rib[afi][safi];
2626
2627 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2628 for (ain = rn->adj_in; ain; ain = ain->next)
2629 {
2630 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2631 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2632 }
2633}
2634
2635void
2636bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2637{
2638 struct bgp_table *table;
2639 struct bgp_node *rn;
2640
2641 if (safi != SAFI_MPLS_VPN)
2642 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2643
2644 else
2645 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2646 rn = bgp_route_next (rn))
2647 if ((table = rn->info) != NULL)
2648 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2649}
2650
2651static void
paul718e3742002-12-13 20:15:29 +00002652bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2653 struct bgp_table *table)
2654{
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 {
2667 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2668 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2669 NULL, NULL, 1);
2670 if (ret < 0)
2671 {
2672 bgp_unlock_node (rn);
2673 return;
2674 }
2675 continue;
2676 }
2677 }
2678}
2679
2680void
2681bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2682{
2683 struct bgp_node *rn;
2684 struct bgp_table *table;
2685
2686 if (peer->status != Established)
2687 return;
2688
2689 if (safi != SAFI_MPLS_VPN)
2690 bgp_soft_reconfig_table (peer, afi, safi, NULL);
2691 else
2692 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2693 rn = bgp_route_next (rn))
2694 if ((table = rn->info) != NULL)
2695 bgp_soft_reconfig_table (peer, afi, safi, table);
2696}
2697
Chris Caputo228da422009-07-18 05:44:03 +00002698
2699struct bgp_clear_node_queue
2700{
2701 struct bgp_node *rn;
2702 enum bgp_clear_route_type purpose;
2703};
2704
paul200df112005-06-01 11:17:05 +00002705static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00002706bgp_clear_route_node (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002707{
Chris Caputo228da422009-07-18 05:44:03 +00002708 struct bgp_clear_node_queue *cnq = data;
2709 struct bgp_node *rn = cnq->rn;
Paul Jakma64e580a2006-02-21 01:09:01 +00002710 struct peer *peer = wq->spec.data;
paul200df112005-06-01 11:17:05 +00002711 struct bgp_info *ri;
Paul Jakma64e580a2006-02-21 01:09:01 +00002712 afi_t afi = rn->table->afi;
2713 safi_t safi = rn->table->safi;
paul200df112005-06-01 11:17:05 +00002714
Paul Jakma64e580a2006-02-21 01:09:01 +00002715 assert (rn && peer);
paul200df112005-06-01 11:17:05 +00002716
Paul Jakma64e580a2006-02-21 01:09:01 +00002717 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002718 if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
paul200df112005-06-01 11:17:05 +00002719 {
2720 /* graceful restart STALE flag set. */
Paul Jakma64e580a2006-02-21 01:09:01 +00002721 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2722 && peer->nsf[afi][safi]
paul200df112005-06-01 11:17:05 +00002723 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
Paul Jakma1a392d42006-09-07 00:24:49 +00002724 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2725 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
paul200df112005-06-01 11:17:05 +00002726 else
Paul Jakma64e580a2006-02-21 01:09:01 +00002727 bgp_rib_remove (rn, ri, peer, afi, safi);
paul200df112005-06-01 11:17:05 +00002728 break;
2729 }
paul200df112005-06-01 11:17:05 +00002730 return WQ_SUCCESS;
2731}
2732
2733static void
paul0fb58d52005-11-14 14:31:49 +00002734bgp_clear_node_queue_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002735{
Chris Caputo228da422009-07-18 05:44:03 +00002736 struct bgp_clear_node_queue *cnq = data;
2737 struct bgp_node *rn = cnq->rn;
2738 struct bgp_table *table = rn->table;
Paul Jakma64e580a2006-02-21 01:09:01 +00002739
2740 bgp_unlock_node (rn);
Chris Caputo228da422009-07-18 05:44:03 +00002741 bgp_table_unlock (table);
2742 XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
paul200df112005-06-01 11:17:05 +00002743}
2744
2745static void
paul94f2b392005-06-28 12:44:16 +00002746bgp_clear_node_complete (struct work_queue *wq)
paul200df112005-06-01 11:17:05 +00002747{
Paul Jakma64e580a2006-02-21 01:09:01 +00002748 struct peer *peer = wq->spec.data;
2749
Paul Jakma3e0c78e2006-03-06 18:06:53 +00002750 /* Tickle FSM to start moving again */
Paul Jakmaca058a32006-09-14 02:58:49 +00002751 BGP_EVENT_ADD (peer, Clearing_Completed);
Chris Caputo228da422009-07-18 05:44:03 +00002752
2753 peer_unlock (peer); /* bgp_clear_route */
paul200df112005-06-01 11:17:05 +00002754}
2755
2756static void
Paul Jakma64e580a2006-02-21 01:09:01 +00002757bgp_clear_node_queue_init (struct peer *peer)
paul200df112005-06-01 11:17:05 +00002758{
Paul Jakmaa2943652009-07-21 14:02:04 +01002759 char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
Paul Jakma64e580a2006-02-21 01:09:01 +00002760
Paul Jakmaa2943652009-07-21 14:02:04 +01002761 snprintf (wname, sizeof(wname), "clear %s", peer->host);
Paul Jakma64e580a2006-02-21 01:09:01 +00002762#undef CLEAR_QUEUE_NAME_LEN
2763
2764 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
paul200df112005-06-01 11:17:05 +00002765 {
2766 zlog_err ("%s: Failed to allocate work queue", __func__);
2767 exit (1);
2768 }
Paul Jakma64e580a2006-02-21 01:09:01 +00002769 peer->clear_node_queue->spec.hold = 10;
2770 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2771 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2772 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2773 peer->clear_node_queue->spec.max_retries = 0;
2774
2775 /* we only 'lock' this peer reference when the queue is actually active */
2776 peer->clear_node_queue->spec.data = peer;
paul200df112005-06-01 11:17:05 +00002777}
2778
paul718e3742002-12-13 20:15:29 +00002779static void
2780bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
Chris Caputo228da422009-07-18 05:44:03 +00002781 struct bgp_table *table, struct peer *rsclient,
2782 enum bgp_clear_route_type purpose)
paul718e3742002-12-13 20:15:29 +00002783{
2784 struct bgp_node *rn;
paul200df112005-06-01 11:17:05 +00002785
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002786
paul718e3742002-12-13 20:15:29 +00002787 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002788 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
Paul Jakma64e580a2006-02-21 01:09:01 +00002789
hasso6cf159b2005-03-21 10:28:14 +00002790 /* If still no table => afi/safi isn't configured at all or smth. */
2791 if (! table)
2792 return;
Paul Jakma65ca75e2006-05-04 08:08:15 +00002793
2794 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2795 {
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002796 struct bgp_info *ri;
2797 struct bgp_adj_in *ain;
2798 struct bgp_adj_out *aout;
2799
Paul Jakma65ca75e2006-05-04 08:08:15 +00002800 if (rn->info == NULL)
2801 continue;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002802
2803 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2804 * queued for every clearing peer, regardless of whether it is
2805 * relevant to the peer at hand.
2806 *
2807 * Overview: There are 3 different indices which need to be
2808 * scrubbed, potentially, when a peer is removed:
2809 *
2810 * 1 peer's routes visible via the RIB (ie accepted routes)
2811 * 2 peer's routes visible by the (optional) peer's adj-in index
2812 * 3 other routes visible by the peer's adj-out index
2813 *
2814 * 3 there is no hurry in scrubbing, once the struct peer is
2815 * removed from bgp->peer, we could just GC such deleted peer's
2816 * adj-outs at our leisure.
2817 *
2818 * 1 and 2 must be 'scrubbed' in some way, at least made
2819 * invisible via RIB index before peer session is allowed to be
2820 * brought back up. So one needs to know when such a 'search' is
2821 * complete.
2822 *
2823 * Ideally:
2824 *
2825 * - there'd be a single global queue or a single RIB walker
2826 * - rather than tracking which route_nodes still need to be
2827 * examined on a peer basis, we'd track which peers still
2828 * aren't cleared
2829 *
2830 * Given that our per-peer prefix-counts now should be reliable,
2831 * this may actually be achievable. It doesn't seem to be a huge
2832 * problem at this time,
2833 */
2834 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002835 if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002836 {
Chris Caputo228da422009-07-18 05:44:03 +00002837 struct bgp_clear_node_queue *cnq;
2838
2839 /* both unlocked in bgp_clear_node_queue_del */
2840 bgp_table_lock (rn->table);
2841 bgp_lock_node (rn);
2842 cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2843 sizeof (struct bgp_clear_node_queue));
2844 cnq->rn = rn;
2845 cnq->purpose = purpose;
2846 work_queue_add (peer->clear_node_queue, cnq);
2847 break;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002848 }
2849
2850 for (ain = rn->adj_in; ain; ain = ain->next)
Chris Caputo228da422009-07-18 05:44:03 +00002851 if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002852 {
2853 bgp_adj_in_remove (rn, ain);
2854 bgp_unlock_node (rn);
2855 break;
2856 }
2857 for (aout = rn->adj_out; aout; aout = aout->next)
Chris Caputo228da422009-07-18 05:44:03 +00002858 if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002859 {
2860 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2861 bgp_unlock_node (rn);
2862 break;
2863 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002864 }
2865 return;
2866}
2867
2868void
Chris Caputo228da422009-07-18 05:44:03 +00002869bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2870 enum bgp_clear_route_type purpose)
Paul Jakma65ca75e2006-05-04 08:08:15 +00002871{
2872 struct bgp_node *rn;
2873 struct bgp_table *table;
2874 struct peer *rsclient;
2875 struct listnode *node, *nnode;
hasso6cf159b2005-03-21 10:28:14 +00002876
Paul Jakma64e580a2006-02-21 01:09:01 +00002877 if (peer->clear_node_queue == NULL)
2878 bgp_clear_node_queue_init (peer);
paul200df112005-06-01 11:17:05 +00002879
Paul Jakmaca058a32006-09-14 02:58:49 +00002880 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2881 * Idle until it receives a Clearing_Completed event. This protects
2882 * against peers which flap faster than we can we clear, which could
2883 * lead to:
Paul Jakma64e580a2006-02-21 01:09:01 +00002884 *
2885 * a) race with routes from the new session being installed before
2886 * clear_route_node visits the node (to delete the route of that
2887 * peer)
2888 * b) resource exhaustion, clear_route_node likely leads to an entry
2889 * on the process_main queue. Fast-flapping could cause that queue
2890 * to grow and grow.
paul200df112005-06-01 11:17:05 +00002891 */
Paul Jakmaca058a32006-09-14 02:58:49 +00002892 if (!peer->clear_node_queue->thread)
2893 peer_lock (peer); /* bgp_clear_node_complete */
paulfee0f4c2004-09-13 05:12:46 +00002894
Chris Caputo228da422009-07-18 05:44:03 +00002895 switch (purpose)
paulfee0f4c2004-09-13 05:12:46 +00002896 {
Chris Caputo228da422009-07-18 05:44:03 +00002897 case BGP_CLEAR_ROUTE_NORMAL:
2898 if (safi != SAFI_MPLS_VPN)
2899 bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2900 else
2901 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2902 rn = bgp_route_next (rn))
2903 if ((table = rn->info) != NULL)
2904 bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2905
2906 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2907 if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2908 PEER_FLAG_RSERVER_CLIENT))
2909 bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2910 break;
2911
2912 case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2913 bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2914 break;
2915
2916 default:
2917 assert (0);
2918 break;
paulfee0f4c2004-09-13 05:12:46 +00002919 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002920
Paul Jakmaca058a32006-09-14 02:58:49 +00002921 /* If no routes were cleared, nothing was added to workqueue, the
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002922 * completion function won't be run by workqueue code - call it here.
2923 * XXX: Actually, this assumption doesn't hold, see
2924 * bgp_clear_route_table(), we queue all non-empty nodes.
Paul Jakmaca058a32006-09-14 02:58:49 +00002925 *
2926 * Additionally, there is a presumption in FSM that clearing is only
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002927 * really needed if peer state is Established - peers in
2928 * pre-Established states shouldn't have any route-update state
2929 * associated with them (in or out).
Paul Jakmaca058a32006-09-14 02:58:49 +00002930 *
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002931 * We still can get here in pre-Established though, through
2932 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2933 * check to ensure the assumption above holds.
Paul Jakmaca058a32006-09-14 02:58:49 +00002934 *
2935 * At some future point, this check could be move to the top of the
2936 * function, and do a quick early-return when state is
2937 * pre-Established, avoiding above list and table scans. Once we're
2938 * sure it is safe..
Paul Jakma65ca75e2006-05-04 08:08:15 +00002939 */
2940 if (!peer->clear_node_queue->thread)
2941 bgp_clear_node_complete (peer->clear_node_queue);
paul718e3742002-12-13 20:15:29 +00002942}
2943
2944void
2945bgp_clear_route_all (struct peer *peer)
2946{
2947 afi_t afi;
2948 safi_t safi;
2949
2950 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2951 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
Chris Caputo228da422009-07-18 05:44:03 +00002952 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
paul718e3742002-12-13 20:15:29 +00002953}
2954
2955void
2956bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2957{
2958 struct bgp_table *table;
2959 struct bgp_node *rn;
2960 struct bgp_adj_in *ain;
2961
2962 table = peer->bgp->rib[afi][safi];
2963
2964 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2965 for (ain = rn->adj_in; ain ; ain = ain->next)
2966 if (ain->peer == peer)
2967 {
2968 bgp_adj_in_remove (rn, ain);
2969 bgp_unlock_node (rn);
2970 break;
2971 }
2972}
hasso93406d82005-02-02 14:40:33 +00002973
2974void
2975bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2976{
2977 struct bgp_node *rn;
2978 struct bgp_info *ri;
2979 struct bgp_table *table;
2980
2981 table = peer->bgp->rib[afi][safi];
2982
2983 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2984 {
2985 for (ri = rn->info; ri; ri = ri->next)
2986 if (ri->peer == peer)
2987 {
2988 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2989 bgp_rib_remove (rn, ri, peer, afi, safi);
2990 break;
2991 }
2992 }
2993}
paul718e3742002-12-13 20:15:29 +00002994
2995/* Delete all kernel routes. */
2996void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08002997bgp_cleanup_routes (void)
paul718e3742002-12-13 20:15:29 +00002998{
2999 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00003000 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00003001 struct bgp_node *rn;
3002 struct bgp_table *table;
3003 struct bgp_info *ri;
3004
paul1eb8ef22005-04-07 07:30:20 +00003005 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00003006 {
3007 table = bgp->rib[AFI_IP][SAFI_UNICAST];
3008
3009 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3010 for (ri = rn->info; ri; ri = ri->next)
3011 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
3012 && ri->type == ZEBRA_ROUTE_BGP
3013 && ri->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04003014 bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00003015
3016 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
3017
3018 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3019 for (ri = rn->info; ri; ri = ri->next)
3020 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
3021 && ri->type == ZEBRA_ROUTE_BGP
3022 && ri->sub_type == BGP_ROUTE_NORMAL)
G.Balaji5a616c02011-11-26 21:58:42 +04003023 bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00003024 }
3025}
3026
3027void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003028bgp_reset (void)
paul718e3742002-12-13 20:15:29 +00003029{
3030 vty_reset ();
3031 bgp_zclient_reset ();
3032 access_list_reset ();
3033 prefix_list_reset ();
3034}
3035
3036/* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
3037 value. */
3038int
3039bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
3040{
3041 u_char *pnt;
3042 u_char *lim;
3043 struct prefix p;
3044 int psize;
3045 int ret;
3046
3047 /* Check peer status. */
3048 if (peer->status != Established)
3049 return 0;
3050
3051 pnt = packet->nlri;
3052 lim = pnt + packet->length;
3053
3054 for (; pnt < lim; pnt += psize)
3055 {
3056 /* Clear prefix structure. */
3057 memset (&p, 0, sizeof (struct prefix));
3058
3059 /* Fetch prefix length. */
3060 p.prefixlen = *pnt++;
3061 p.family = afi2family (packet->afi);
3062
3063 /* Already checked in nlri_sanity_check(). We do double check
3064 here. */
3065 if ((packet->afi == AFI_IP && p.prefixlen > 32)
3066 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
3067 return -1;
3068
3069 /* Packet size overflow check. */
3070 psize = PSIZE (p.prefixlen);
3071
3072 /* When packet overflow occur return immediately. */
3073 if (pnt + psize > lim)
3074 return -1;
3075
3076 /* Fetch prefix from NLRI packet. */
3077 memcpy (&p.u.prefix, pnt, psize);
3078
3079 /* Check address. */
3080 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3081 {
3082 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3083 {
paulf5ba3872004-07-09 12:11:31 +00003084 /*
3085 * From draft-ietf-idr-bgp4-22, Section 6.3:
3086 * If a BGP router receives an UPDATE message with a
3087 * semantically incorrect NLRI field, in which a prefix is
3088 * semantically incorrect (eg. an unexpected multicast IP
3089 * address), it should ignore the prefix.
3090 */
paul718e3742002-12-13 20:15:29 +00003091 zlog (peer->log, LOG_ERR,
3092 "IPv4 unicast NLRI is multicast address %s",
3093 inet_ntoa (p.u.prefix4));
paulf5ba3872004-07-09 12:11:31 +00003094
paul718e3742002-12-13 20:15:29 +00003095 return -1;
3096 }
3097 }
3098
3099#ifdef HAVE_IPV6
3100 /* Check address. */
3101 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3102 {
3103 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3104 {
3105 char buf[BUFSIZ];
3106
3107 zlog (peer->log, LOG_WARNING,
3108 "IPv6 link-local NLRI received %s ignore this NLRI",
3109 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3110
3111 continue;
3112 }
3113 }
3114#endif /* HAVE_IPV6 */
3115
3116 /* Normal process. */
3117 if (attr)
3118 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3119 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3120 else
3121 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3122 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3123
3124 /* Address family configuration mismatch or maximum-prefix count
3125 overflow. */
3126 if (ret < 0)
3127 return -1;
3128 }
3129
3130 /* Packet length consistency check. */
3131 if (pnt != lim)
3132 return -1;
3133
3134 return 0;
3135}
3136
3137/* NLRI encode syntax check routine. */
3138int
3139bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3140 bgp_size_t length)
3141{
3142 u_char *end;
3143 u_char prefixlen;
3144 int psize;
3145
3146 end = pnt + length;
3147
3148 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3149 syntactic validity. If the field is syntactically incorrect,
3150 then the Error Subcode is set to Invalid Network Field. */
3151
3152 while (pnt < end)
3153 {
3154 prefixlen = *pnt++;
3155
3156 /* Prefix length check. */
3157 if ((afi == AFI_IP && prefixlen > 32)
3158 || (afi == AFI_IP6 && prefixlen > 128))
3159 {
3160 plog_err (peer->log,
3161 "%s [Error] Update packet error (wrong prefix length %d)",
3162 peer->host, prefixlen);
3163 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3164 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3165 return -1;
3166 }
3167
3168 /* Packet size overflow check. */
3169 psize = PSIZE (prefixlen);
3170
3171 if (pnt + psize > end)
3172 {
3173 plog_err (peer->log,
3174 "%s [Error] Update packet error"
3175 " (prefix data overflow prefix size is %d)",
3176 peer->host, psize);
3177 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3178 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3179 return -1;
3180 }
3181
3182 pnt += psize;
3183 }
3184
3185 /* Packet length consistency check. */
3186 if (pnt != end)
3187 {
3188 plog_err (peer->log,
3189 "%s [Error] Update packet error"
3190 " (prefix length mismatch with total length)",
3191 peer->host);
3192 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3193 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3194 return -1;
3195 }
3196 return 0;
3197}
3198
paul94f2b392005-06-28 12:44:16 +00003199static struct bgp_static *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003200bgp_static_new (void)
paul718e3742002-12-13 20:15:29 +00003201{
Stephen Hemminger393deb92008-08-18 14:13:29 -07003202 return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
paul718e3742002-12-13 20:15:29 +00003203}
3204
paul94f2b392005-06-28 12:44:16 +00003205static void
paul718e3742002-12-13 20:15:29 +00003206bgp_static_free (struct bgp_static *bgp_static)
3207{
3208 if (bgp_static->rmap.name)
3209 free (bgp_static->rmap.name);
3210 XFREE (MTYPE_BGP_STATIC, bgp_static);
3211}
3212
paul94f2b392005-06-28 12:44:16 +00003213static void
paulfee0f4c2004-09-13 05:12:46 +00003214bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3215 struct prefix *p, afi_t afi, safi_t safi)
3216{
3217 struct bgp_node *rn;
3218 struct bgp_info *ri;
3219
3220 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3221
3222 /* Check selected route and self inserted route. */
3223 for (ri = rn->info; ri; ri = ri->next)
3224 if (ri->peer == bgp->peer_self
3225 && ri->type == ZEBRA_ROUTE_BGP
3226 && ri->sub_type == BGP_ROUTE_STATIC)
3227 break;
3228
3229 /* Withdraw static BGP route from routing table. */
3230 if (ri)
3231 {
paulfee0f4c2004-09-13 05:12:46 +00003232 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003233 bgp_process (bgp, rn, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003234 }
3235
3236 /* Unlock bgp_node_lookup. */
3237 bgp_unlock_node (rn);
3238}
3239
paul94f2b392005-06-28 12:44:16 +00003240static void
paulfee0f4c2004-09-13 05:12:46 +00003241bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
Paul Jakmafb982c22007-05-04 20:15:47 +00003242 struct bgp_static *bgp_static,
3243 afi_t afi, safi_t safi)
paulfee0f4c2004-09-13 05:12:46 +00003244{
3245 struct bgp_node *rn;
3246 struct bgp_info *ri;
3247 struct bgp_info *new;
3248 struct bgp_info info;
paulfee0f4c2004-09-13 05:12:46 +00003249 struct attr *attr_new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003250 struct attr attr = {0 };
3251 struct attr new_attr = { .extra = 0 };
paulfee0f4c2004-09-13 05:12:46 +00003252 struct bgp *bgp;
3253 int ret;
3254 char buf[SU_ADDRSTRLEN];
3255
3256 bgp = rsclient->bgp;
3257
Paul Jakma06e110f2006-05-12 23:29:22 +00003258 assert (bgp_static);
3259 if (!bgp_static)
3260 return;
3261
paulfee0f4c2004-09-13 05:12:46 +00003262 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3263
3264 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakma06e110f2006-05-12 23:29:22 +00003265
3266 attr.nexthop = bgp_static->igpnexthop;
3267 attr.med = bgp_static->igpmetric;
3268 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
Paul Jakma41367172007-08-06 15:24:51 +00003269
Paul Jakma41367172007-08-06 15:24:51 +00003270 if (bgp_static->atomic)
3271 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3272
paulfee0f4c2004-09-13 05:12:46 +00003273 /* Apply network route-map for export to this rsclient. */
3274 if (bgp_static->rmap.name)
3275 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003276 struct attr attr_tmp = attr;
paulfee0f4c2004-09-13 05:12:46 +00003277 info.peer = rsclient;
Paul Jakmafb982c22007-05-04 20:15:47 +00003278 info.attr = &attr_tmp;
3279
paulfee0f4c2004-09-13 05:12:46 +00003280 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3281 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3282
3283 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3284
3285 rsclient->rmap_type = 0;
3286
3287 if (ret == RMAP_DENYMATCH)
3288 {
3289 /* Free uninterned attribute. */
Paul Jakmafb982c22007-05-04 20:15:47 +00003290 bgp_attr_flush (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003291
3292 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003293 aspath_unintern (&attr.aspath);
paulfee0f4c2004-09-13 05:12:46 +00003294 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00003295 bgp_attr_extra_free (&attr);
3296
paulfee0f4c2004-09-13 05:12:46 +00003297 return;
3298 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003299 attr_new = bgp_attr_intern (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003300 }
3301 else
3302 attr_new = bgp_attr_intern (&attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00003303
Stephen Hemminger7badc262010-08-05 10:26:31 -07003304 bgp_attr_dup(&new_attr, attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00003305
paulfee0f4c2004-09-13 05:12:46 +00003306 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3307
Paul Jakmafb982c22007-05-04 20:15:47 +00003308 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3309 == RMAP_DENY)
3310 {
paulfee0f4c2004-09-13 05:12:46 +00003311 /* This BGP update is filtered. Log the reason then update BGP entry. */
3312 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00003313 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00003314 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3315 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3316 p->prefixlen, rsclient->host);
3317
3318 bgp->peer_self->rmap_type = 0;
3319
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003320 bgp_attr_unintern (&attr_new);
3321 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003322 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003323
3324 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3325
3326 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003327 }
paulfee0f4c2004-09-13 05:12:46 +00003328
3329 bgp->peer_self->rmap_type = 0;
3330
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003331 bgp_attr_unintern (&attr_new);
paulfee0f4c2004-09-13 05:12:46 +00003332 attr_new = bgp_attr_intern (&new_attr);
Stephen Hemminger7badc262010-08-05 10:26:31 -07003333 bgp_attr_extra_free (&new_attr);
paulfee0f4c2004-09-13 05:12:46 +00003334
3335 for (ri = rn->info; ri; ri = ri->next)
3336 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3337 && ri->sub_type == BGP_ROUTE_STATIC)
3338 break;
3339
3340 if (ri)
3341 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003342 if (attrhash_cmp (ri->attr, attr_new) &&
3343 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paulfee0f4c2004-09-13 05:12:46 +00003344 {
3345 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003346 bgp_attr_unintern (&attr_new);
3347 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003348 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003349 return;
3350 }
3351 else
3352 {
3353 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003354 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00003355
3356 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003357 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3358 bgp_info_restore(rn, ri);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003359 bgp_attr_unintern (&ri->attr);
paulfee0f4c2004-09-13 05:12:46 +00003360 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003361 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003362
3363 /* Process change. */
3364 bgp_process (bgp, rn, afi, safi);
3365 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003366 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003367 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003368 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003369 }
paulfee0f4c2004-09-13 05:12:46 +00003370 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003371
paulfee0f4c2004-09-13 05:12:46 +00003372 /* Make new BGP info. */
3373 new = bgp_info_new ();
3374 new->type = ZEBRA_ROUTE_BGP;
3375 new->sub_type = BGP_ROUTE_STATIC;
3376 new->peer = bgp->peer_self;
3377 SET_FLAG (new->flags, BGP_INFO_VALID);
3378 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003379 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003380
3381 /* Register new BGP information. */
3382 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003383
3384 /* route_node_get lock */
3385 bgp_unlock_node (rn);
3386
paulfee0f4c2004-09-13 05:12:46 +00003387 /* Process change. */
3388 bgp_process (bgp, rn, afi, safi);
3389
3390 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003391 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003392 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003393}
3394
paul94f2b392005-06-28 12:44:16 +00003395static void
paulfee0f4c2004-09-13 05:12:46 +00003396bgp_static_update_main (struct bgp *bgp, struct prefix *p,
paul718e3742002-12-13 20:15:29 +00003397 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3398{
3399 struct bgp_node *rn;
3400 struct bgp_info *ri;
3401 struct bgp_info *new;
3402 struct bgp_info info;
Paul Jakmafb982c22007-05-04 20:15:47 +00003403 struct attr attr = { 0 };
paul718e3742002-12-13 20:15:29 +00003404 struct attr *attr_new;
3405 int ret;
3406
Paul Jakmadd8103a2006-05-12 23:27:30 +00003407 assert (bgp_static);
3408 if (!bgp_static)
3409 return;
3410
paulfee0f4c2004-09-13 05:12:46 +00003411 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003412
3413 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakmadd8103a2006-05-12 23:27:30 +00003414
3415 attr.nexthop = bgp_static->igpnexthop;
3416 attr.med = bgp_static->igpmetric;
3417 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
paul718e3742002-12-13 20:15:29 +00003418
Paul Jakma41367172007-08-06 15:24:51 +00003419 if (bgp_static->atomic)
3420 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3421
paul718e3742002-12-13 20:15:29 +00003422 /* Apply route-map. */
3423 if (bgp_static->rmap.name)
3424 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003425 struct attr attr_tmp = attr;
paul718e3742002-12-13 20:15:29 +00003426 info.peer = bgp->peer_self;
paul286e1e72003-08-08 00:24:31 +00003427 info.attr = &attr_tmp;
paul718e3742002-12-13 20:15:29 +00003428
paulfee0f4c2004-09-13 05:12:46 +00003429 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3430
paul718e3742002-12-13 20:15:29 +00003431 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
paul286e1e72003-08-08 00:24:31 +00003432
paulfee0f4c2004-09-13 05:12:46 +00003433 bgp->peer_self->rmap_type = 0;
3434
paul718e3742002-12-13 20:15:29 +00003435 if (ret == RMAP_DENYMATCH)
3436 {
3437 /* Free uninterned attribute. */
paul286e1e72003-08-08 00:24:31 +00003438 bgp_attr_flush (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003439
3440 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003441 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003442 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003443 bgp_static_withdraw (bgp, p, afi, safi);
3444 return;
3445 }
paul286e1e72003-08-08 00:24:31 +00003446 attr_new = bgp_attr_intern (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003447 }
paul286e1e72003-08-08 00:24:31 +00003448 else
3449 attr_new = bgp_attr_intern (&attr);
paul718e3742002-12-13 20:15:29 +00003450
3451 for (ri = rn->info; ri; ri = ri->next)
3452 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3453 && ri->sub_type == BGP_ROUTE_STATIC)
3454 break;
3455
3456 if (ri)
3457 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003458 if (attrhash_cmp (ri->attr, attr_new) &&
3459 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00003460 {
3461 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003462 bgp_attr_unintern (&attr_new);
3463 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003464 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003465 return;
3466 }
3467 else
3468 {
3469 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003470 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00003471
3472 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003473 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3474 bgp_info_restore(rn, ri);
3475 else
3476 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003477 bgp_attr_unintern (&ri->attr);
paul718e3742002-12-13 20:15:29 +00003478 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003479 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003480
3481 /* Process change. */
3482 bgp_aggregate_increment (bgp, p, ri, afi, safi);
3483 bgp_process (bgp, rn, afi, safi);
3484 bgp_unlock_node (rn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003485 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003486 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003487 return;
3488 }
3489 }
3490
3491 /* Make new BGP info. */
3492 new = bgp_info_new ();
3493 new->type = ZEBRA_ROUTE_BGP;
3494 new->sub_type = BGP_ROUTE_STATIC;
3495 new->peer = bgp->peer_self;
3496 SET_FLAG (new->flags, BGP_INFO_VALID);
3497 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003498 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003499
3500 /* Aggregate address increment. */
3501 bgp_aggregate_increment (bgp, p, new, afi, safi);
3502
3503 /* Register new BGP information. */
3504 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003505
3506 /* route_node_get lock */
3507 bgp_unlock_node (rn);
3508
paul718e3742002-12-13 20:15:29 +00003509 /* Process change. */
3510 bgp_process (bgp, rn, afi, safi);
3511
3512 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00003513 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003514 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003515}
3516
3517void
paulfee0f4c2004-09-13 05:12:46 +00003518bgp_static_update (struct bgp *bgp, struct prefix *p,
3519 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3520{
3521 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00003522 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00003523
3524 bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3525
paul1eb8ef22005-04-07 07:30:20 +00003526 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00003527 {
Paul Jakmada5b30f2006-05-08 14:37:17 +00003528 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3529 bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003530 }
3531}
3532
paul94f2b392005-06-28 12:44:16 +00003533static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003534bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3535 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003536{
3537 struct bgp_node *rn;
3538 struct bgp_info *new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003539
paulfee0f4c2004-09-13 05:12:46 +00003540 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003541
3542 /* Make new BGP info. */
3543 new = bgp_info_new ();
3544 new->type = ZEBRA_ROUTE_BGP;
3545 new->sub_type = BGP_ROUTE_STATIC;
3546 new->peer = bgp->peer_self;
3547 new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3548 SET_FLAG (new->flags, BGP_INFO_VALID);
Stephen Hemminger65957882010-01-15 16:22:10 +03003549 new->uptime = bgp_clock ();
Paul Jakmafb982c22007-05-04 20:15:47 +00003550 new->extra = bgp_info_extra_new();
3551 memcpy (new->extra->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00003552
3553 /* Aggregate address increment. */
paul200df112005-06-01 11:17:05 +00003554 bgp_aggregate_increment (bgp, p, new, afi, safi);
paul718e3742002-12-13 20:15:29 +00003555
3556 /* Register new BGP information. */
paul200df112005-06-01 11:17:05 +00003557 bgp_info_add (rn, new);
paul718e3742002-12-13 20:15:29 +00003558
paul200df112005-06-01 11:17:05 +00003559 /* route_node_get lock */
3560 bgp_unlock_node (rn);
3561
paul718e3742002-12-13 20:15:29 +00003562 /* Process change. */
3563 bgp_process (bgp, rn, afi, safi);
3564}
3565
3566void
3567bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3568 safi_t safi)
3569{
3570 struct bgp_node *rn;
3571 struct bgp_info *ri;
3572
paulfee0f4c2004-09-13 05:12:46 +00003573 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003574
3575 /* Check selected route and self inserted route. */
3576 for (ri = rn->info; ri; ri = ri->next)
3577 if (ri->peer == bgp->peer_self
3578 && ri->type == ZEBRA_ROUTE_BGP
3579 && ri->sub_type == BGP_ROUTE_STATIC)
3580 break;
3581
3582 /* Withdraw static BGP route from routing table. */
3583 if (ri)
3584 {
3585 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003586 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003587 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003588 }
3589
3590 /* Unlock bgp_node_lookup. */
3591 bgp_unlock_node (rn);
3592}
3593
3594void
paulfee0f4c2004-09-13 05:12:46 +00003595bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3596{
3597 struct bgp_static *bgp_static;
3598 struct bgp *bgp;
3599 struct bgp_node *rn;
3600 struct prefix *p;
3601
3602 bgp = rsclient->bgp;
3603
3604 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3605 if ((bgp_static = rn->info) != NULL)
3606 {
3607 p = &rn->p;
3608
3609 bgp_static_update_rsclient (rsclient, p, bgp_static,
3610 afi, safi);
3611 }
3612}
3613
paul94f2b392005-06-28 12:44:16 +00003614static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003615bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3616 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003617{
3618 struct bgp_node *rn;
3619 struct bgp_info *ri;
3620
paulfee0f4c2004-09-13 05:12:46 +00003621 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003622
3623 /* Check selected route and self inserted route. */
3624 for (ri = rn->info; ri; ri = ri->next)
3625 if (ri->peer == bgp->peer_self
3626 && ri->type == ZEBRA_ROUTE_BGP
3627 && ri->sub_type == BGP_ROUTE_STATIC)
3628 break;
3629
3630 /* Withdraw static BGP route from routing table. */
3631 if (ri)
3632 {
3633 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003634 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003635 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003636 }
3637
3638 /* Unlock bgp_node_lookup. */
3639 bgp_unlock_node (rn);
3640}
3641
3642/* Configure static BGP network. When user don't run zebra, static
3643 route should be installed as valid. */
paul94f2b392005-06-28 12:44:16 +00003644static int
paulfd79ac92004-10-13 05:06:08 +00003645bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003646 afi_t afi, safi_t safi, const char *rmap, int backdoor)
paul718e3742002-12-13 20:15:29 +00003647{
3648 int ret;
3649 struct prefix p;
3650 struct bgp_static *bgp_static;
3651 struct bgp_node *rn;
Paul Jakma41367172007-08-06 15:24:51 +00003652 u_char need_update = 0;
paul718e3742002-12-13 20:15:29 +00003653
3654 /* Convert IP prefix string to struct prefix. */
3655 ret = str2prefix (ip_str, &p);
3656 if (! ret)
3657 {
3658 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3659 return CMD_WARNING;
3660 }
3661#ifdef HAVE_IPV6
3662 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3663 {
3664 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3665 VTY_NEWLINE);
3666 return CMD_WARNING;
3667 }
3668#endif /* HAVE_IPV6 */
3669
3670 apply_mask (&p);
3671
3672 /* Set BGP static route configuration. */
3673 rn = bgp_node_get (bgp->route[afi][safi], &p);
3674
3675 if (rn->info)
3676 {
3677 /* Configuration change. */
3678 bgp_static = rn->info;
3679
3680 /* Check previous routes are installed into BGP. */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003681 if (bgp_static->valid && bgp_static->backdoor != backdoor)
3682 need_update = 1;
Paul Jakma41367172007-08-06 15:24:51 +00003683
paul718e3742002-12-13 20:15:29 +00003684 bgp_static->backdoor = backdoor;
Paul Jakma41367172007-08-06 15:24:51 +00003685
paul718e3742002-12-13 20:15:29 +00003686 if (rmap)
3687 {
3688 if (bgp_static->rmap.name)
3689 free (bgp_static->rmap.name);
3690 bgp_static->rmap.name = strdup (rmap);
3691 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3692 }
3693 else
3694 {
3695 if (bgp_static->rmap.name)
3696 free (bgp_static->rmap.name);
3697 bgp_static->rmap.name = NULL;
3698 bgp_static->rmap.map = NULL;
3699 bgp_static->valid = 0;
3700 }
3701 bgp_unlock_node (rn);
3702 }
3703 else
3704 {
3705 /* New configuration. */
3706 bgp_static = bgp_static_new ();
3707 bgp_static->backdoor = backdoor;
3708 bgp_static->valid = 0;
3709 bgp_static->igpmetric = 0;
3710 bgp_static->igpnexthop.s_addr = 0;
Paul Jakma41367172007-08-06 15:24:51 +00003711
paul718e3742002-12-13 20:15:29 +00003712 if (rmap)
3713 {
3714 if (bgp_static->rmap.name)
3715 free (bgp_static->rmap.name);
3716 bgp_static->rmap.name = strdup (rmap);
3717 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3718 }
3719 rn->info = bgp_static;
3720 }
3721
3722 /* If BGP scan is not enabled, we should install this route here. */
3723 if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3724 {
3725 bgp_static->valid = 1;
3726
3727 if (need_update)
3728 bgp_static_withdraw (bgp, &p, afi, safi);
3729
3730 if (! bgp_static->backdoor)
3731 bgp_static_update (bgp, &p, bgp_static, afi, safi);
3732 }
3733
3734 return CMD_SUCCESS;
3735}
3736
3737/* Configure static BGP network. */
paul94f2b392005-06-28 12:44:16 +00003738static int
paulfd79ac92004-10-13 05:06:08 +00003739bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
Michael Lambert4c9641b2010-07-22 13:20:55 -04003740 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00003741{
3742 int ret;
3743 struct prefix p;
3744 struct bgp_static *bgp_static;
3745 struct bgp_node *rn;
3746
3747 /* Convert IP prefix string to struct prefix. */
3748 ret = str2prefix (ip_str, &p);
3749 if (! ret)
3750 {
3751 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3752 return CMD_WARNING;
3753 }
3754#ifdef HAVE_IPV6
3755 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3756 {
3757 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3758 VTY_NEWLINE);
3759 return CMD_WARNING;
3760 }
3761#endif /* HAVE_IPV6 */
3762
3763 apply_mask (&p);
3764
3765 rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3766 if (! rn)
3767 {
3768 vty_out (vty, "%% Can't find specified static route configuration.%s",
3769 VTY_NEWLINE);
3770 return CMD_WARNING;
3771 }
3772
3773 bgp_static = rn->info;
Paul Jakma41367172007-08-06 15:24:51 +00003774
paul718e3742002-12-13 20:15:29 +00003775 /* Update BGP RIB. */
3776 if (! bgp_static->backdoor)
3777 bgp_static_withdraw (bgp, &p, afi, safi);
3778
3779 /* Clear configuration. */
3780 bgp_static_free (bgp_static);
3781 rn->info = NULL;
3782 bgp_unlock_node (rn);
3783 bgp_unlock_node (rn);
3784
3785 return CMD_SUCCESS;
3786}
3787
3788/* Called from bgp_delete(). Delete all static routes from the BGP
3789 instance. */
3790void
3791bgp_static_delete (struct bgp *bgp)
3792{
3793 afi_t afi;
3794 safi_t safi;
3795 struct bgp_node *rn;
3796 struct bgp_node *rm;
3797 struct bgp_table *table;
3798 struct bgp_static *bgp_static;
3799
3800 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3801 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3802 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3803 if (rn->info != NULL)
3804 {
3805 if (safi == SAFI_MPLS_VPN)
3806 {
3807 table = rn->info;
3808
3809 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3810 {
3811 bgp_static = rn->info;
3812 bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3813 AFI_IP, SAFI_MPLS_VPN,
3814 (struct prefix_rd *)&rn->p,
3815 bgp_static->tag);
3816 bgp_static_free (bgp_static);
3817 rn->info = NULL;
3818 bgp_unlock_node (rn);
3819 }
3820 }
3821 else
3822 {
3823 bgp_static = rn->info;
3824 bgp_static_withdraw (bgp, &rn->p, afi, safi);
3825 bgp_static_free (bgp_static);
3826 rn->info = NULL;
3827 bgp_unlock_node (rn);
3828 }
3829 }
3830}
3831
3832int
paulfd79ac92004-10-13 05:06:08 +00003833bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3834 const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003835{
3836 int ret;
3837 struct prefix p;
3838 struct prefix_rd prd;
3839 struct bgp *bgp;
3840 struct bgp_node *prn;
3841 struct bgp_node *rn;
3842 struct bgp_table *table;
3843 struct bgp_static *bgp_static;
3844 u_char tag[3];
3845
3846 bgp = vty->index;
3847
3848 ret = str2prefix (ip_str, &p);
3849 if (! ret)
3850 {
3851 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3852 return CMD_WARNING;
3853 }
3854 apply_mask (&p);
3855
3856 ret = str2prefix_rd (rd_str, &prd);
3857 if (! ret)
3858 {
3859 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3860 return CMD_WARNING;
3861 }
3862
3863 ret = str2tag (tag_str, tag);
3864 if (! ret)
3865 {
3866 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3867 return CMD_WARNING;
3868 }
3869
3870 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3871 (struct prefix *)&prd);
3872 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003873 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003874 else
3875 bgp_unlock_node (prn);
3876 table = prn->info;
3877
3878 rn = bgp_node_get (table, &p);
3879
3880 if (rn->info)
3881 {
3882 vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3883 bgp_unlock_node (rn);
3884 }
3885 else
3886 {
3887 /* New configuration. */
3888 bgp_static = bgp_static_new ();
3889 bgp_static->valid = 1;
3890 memcpy (bgp_static->tag, tag, 3);
3891 rn->info = bgp_static;
3892
3893 bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3894 }
3895
3896 return CMD_SUCCESS;
3897}
3898
3899/* Configure static BGP network. */
3900int
paulfd79ac92004-10-13 05:06:08 +00003901bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3902 const char *rd_str, const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003903{
3904 int ret;
3905 struct bgp *bgp;
3906 struct prefix p;
3907 struct prefix_rd prd;
3908 struct bgp_node *prn;
3909 struct bgp_node *rn;
3910 struct bgp_table *table;
3911 struct bgp_static *bgp_static;
3912 u_char tag[3];
3913
3914 bgp = vty->index;
3915
3916 /* Convert IP prefix string to struct prefix. */
3917 ret = str2prefix (ip_str, &p);
3918 if (! ret)
3919 {
3920 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3921 return CMD_WARNING;
3922 }
3923 apply_mask (&p);
3924
3925 ret = str2prefix_rd (rd_str, &prd);
3926 if (! ret)
3927 {
3928 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3929 return CMD_WARNING;
3930 }
3931
3932 ret = str2tag (tag_str, tag);
3933 if (! ret)
3934 {
3935 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3936 return CMD_WARNING;
3937 }
3938
3939 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3940 (struct prefix *)&prd);
3941 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003942 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003943 else
3944 bgp_unlock_node (prn);
3945 table = prn->info;
3946
3947 rn = bgp_node_lookup (table, &p);
3948
3949 if (rn)
3950 {
3951 bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3952
3953 bgp_static = rn->info;
3954 bgp_static_free (bgp_static);
3955 rn->info = NULL;
3956 bgp_unlock_node (rn);
3957 bgp_unlock_node (rn);
3958 }
3959 else
3960 vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
3961
3962 return CMD_SUCCESS;
3963}
3964
3965DEFUN (bgp_network,
3966 bgp_network_cmd,
3967 "network A.B.C.D/M",
3968 "Specify a network to announce via BGP\n"
3969 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
3970{
3971 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003972 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00003973}
3974
3975DEFUN (bgp_network_route_map,
3976 bgp_network_route_map_cmd,
3977 "network A.B.C.D/M route-map WORD",
3978 "Specify a network to announce via BGP\n"
3979 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3980 "Route-map to modify the attributes\n"
3981 "Name of the route map\n")
3982{
3983 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003984 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00003985}
3986
3987DEFUN (bgp_network_backdoor,
3988 bgp_network_backdoor_cmd,
3989 "network A.B.C.D/M backdoor",
3990 "Specify a network to announce via BGP\n"
3991 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3992 "Specify a BGP backdoor route\n")
3993{
Paul Jakma41367172007-08-06 15:24:51 +00003994 return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003995 NULL, 1);
paul718e3742002-12-13 20:15:29 +00003996}
3997
3998DEFUN (bgp_network_mask,
3999 bgp_network_mask_cmd,
4000 "network A.B.C.D mask A.B.C.D",
4001 "Specify a network to announce via BGP\n"
4002 "Network number\n"
4003 "Network mask\n"
4004 "Network mask\n")
4005{
4006 int ret;
4007 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004008
paul718e3742002-12-13 20:15:29 +00004009 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4010 if (! ret)
4011 {
4012 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4013 return CMD_WARNING;
4014 }
4015
4016 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004017 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00004018}
4019
4020DEFUN (bgp_network_mask_route_map,
4021 bgp_network_mask_route_map_cmd,
4022 "network A.B.C.D mask A.B.C.D route-map WORD",
4023 "Specify a network to announce via BGP\n"
4024 "Network number\n"
4025 "Network mask\n"
4026 "Network mask\n"
4027 "Route-map to modify the attributes\n"
4028 "Name of the route map\n")
4029{
4030 int ret;
4031 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004032
paul718e3742002-12-13 20:15:29 +00004033 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4034 if (! ret)
4035 {
4036 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4037 return CMD_WARNING;
4038 }
4039
4040 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004041 AFI_IP, bgp_node_safi (vty), argv[2], 0);
paul718e3742002-12-13 20:15:29 +00004042}
4043
4044DEFUN (bgp_network_mask_backdoor,
4045 bgp_network_mask_backdoor_cmd,
4046 "network A.B.C.D mask A.B.C.D backdoor",
4047 "Specify a network to announce via BGP\n"
4048 "Network number\n"
4049 "Network mask\n"
4050 "Network mask\n"
4051 "Specify a BGP backdoor route\n")
4052{
4053 int ret;
4054 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00004055
paul718e3742002-12-13 20:15:29 +00004056 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4057 if (! ret)
4058 {
4059 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4060 return CMD_WARNING;
4061 }
4062
Paul Jakma41367172007-08-06 15:24:51 +00004063 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004064 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004065}
4066
4067DEFUN (bgp_network_mask_natural,
4068 bgp_network_mask_natural_cmd,
4069 "network A.B.C.D",
4070 "Specify a network to announce via BGP\n"
4071 "Network number\n")
4072{
4073 int ret;
4074 char prefix_str[BUFSIZ];
4075
4076 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4077 if (! ret)
4078 {
4079 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4080 return CMD_WARNING;
4081 }
4082
4083 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004084 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00004085}
4086
4087DEFUN (bgp_network_mask_natural_route_map,
4088 bgp_network_mask_natural_route_map_cmd,
4089 "network A.B.C.D route-map WORD",
4090 "Specify a network to announce via BGP\n"
4091 "Network number\n"
4092 "Route-map to modify the attributes\n"
4093 "Name of the route map\n")
4094{
4095 int ret;
4096 char prefix_str[BUFSIZ];
4097
4098 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4099 if (! ret)
4100 {
4101 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4102 return CMD_WARNING;
4103 }
4104
4105 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004106 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004107}
4108
4109DEFUN (bgp_network_mask_natural_backdoor,
4110 bgp_network_mask_natural_backdoor_cmd,
4111 "network A.B.C.D backdoor",
4112 "Specify a network to announce via BGP\n"
4113 "Network number\n"
4114 "Specify a BGP backdoor route\n")
4115{
4116 int ret;
4117 char prefix_str[BUFSIZ];
4118
4119 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4120 if (! ret)
4121 {
4122 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4123 return CMD_WARNING;
4124 }
4125
Paul Jakma41367172007-08-06 15:24:51 +00004126 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004127 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004128}
4129
4130DEFUN (no_bgp_network,
4131 no_bgp_network_cmd,
4132 "no network A.B.C.D/M",
4133 NO_STR
4134 "Specify a network to announce via BGP\n"
4135 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4136{
4137 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4138 bgp_node_safi (vty));
4139}
4140
4141ALIAS (no_bgp_network,
4142 no_bgp_network_route_map_cmd,
4143 "no network A.B.C.D/M route-map WORD",
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 "Route-map to modify the attributes\n"
4148 "Name of the route map\n")
4149
4150ALIAS (no_bgp_network,
4151 no_bgp_network_backdoor_cmd,
4152 "no network A.B.C.D/M backdoor",
4153 NO_STR
4154 "Specify a network to announce via BGP\n"
4155 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4156 "Specify a BGP backdoor route\n")
4157
4158DEFUN (no_bgp_network_mask,
4159 no_bgp_network_mask_cmd,
4160 "no network A.B.C.D mask A.B.C.D",
4161 NO_STR
4162 "Specify a network to announce via BGP\n"
4163 "Network number\n"
4164 "Network mask\n"
4165 "Network mask\n")
4166{
4167 int ret;
4168 char prefix_str[BUFSIZ];
4169
4170 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4171 if (! ret)
4172 {
4173 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4174 return CMD_WARNING;
4175 }
4176
4177 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4178 bgp_node_safi (vty));
4179}
4180
4181ALIAS (no_bgp_network_mask,
4182 no_bgp_network_mask_route_map_cmd,
4183 "no network A.B.C.D mask A.B.C.D route-map WORD",
4184 NO_STR
4185 "Specify a network to announce via BGP\n"
4186 "Network number\n"
4187 "Network mask\n"
4188 "Network mask\n"
4189 "Route-map to modify the attributes\n"
4190 "Name of the route map\n")
4191
4192ALIAS (no_bgp_network_mask,
4193 no_bgp_network_mask_backdoor_cmd,
4194 "no network A.B.C.D mask A.B.C.D backdoor",
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 "Specify a BGP backdoor route\n")
4201
4202DEFUN (no_bgp_network_mask_natural,
4203 no_bgp_network_mask_natural_cmd,
4204 "no network A.B.C.D",
4205 NO_STR
4206 "Specify a network to announce via BGP\n"
4207 "Network number\n")
4208{
4209 int ret;
4210 char prefix_str[BUFSIZ];
4211
4212 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4213 if (! ret)
4214 {
4215 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4216 return CMD_WARNING;
4217 }
4218
4219 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4220 bgp_node_safi (vty));
4221}
4222
4223ALIAS (no_bgp_network_mask_natural,
4224 no_bgp_network_mask_natural_route_map_cmd,
4225 "no network A.B.C.D route-map WORD",
4226 NO_STR
4227 "Specify a network to announce via BGP\n"
4228 "Network number\n"
4229 "Route-map to modify the attributes\n"
4230 "Name of the route map\n")
4231
4232ALIAS (no_bgp_network_mask_natural,
4233 no_bgp_network_mask_natural_backdoor_cmd,
4234 "no network A.B.C.D backdoor",
4235 NO_STR
4236 "Specify a network to announce via BGP\n"
4237 "Network number\n"
4238 "Specify a BGP backdoor route\n")
4239
4240#ifdef HAVE_IPV6
4241DEFUN (ipv6_bgp_network,
4242 ipv6_bgp_network_cmd,
4243 "network X:X::X:X/M",
4244 "Specify a network to announce via BGP\n"
4245 "IPv6 prefix <network>/<length>\n")
4246{
G.Balaji73bfe0b2011-09-23 22:36:20 +05304247 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty),
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004248 NULL, 0);
paul718e3742002-12-13 20:15:29 +00004249}
4250
4251DEFUN (ipv6_bgp_network_route_map,
4252 ipv6_bgp_network_route_map_cmd,
4253 "network X:X::X:X/M route-map WORD",
4254 "Specify a network to announce via BGP\n"
4255 "IPv6 prefix <network>/<length>\n"
4256 "Route-map to modify the attributes\n"
4257 "Name of the route map\n")
4258{
4259 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004260 bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004261}
4262
4263DEFUN (no_ipv6_bgp_network,
4264 no_ipv6_bgp_network_cmd,
4265 "no network X:X::X:X/M",
4266 NO_STR
4267 "Specify a network to announce via BGP\n"
4268 "IPv6 prefix <network>/<length>\n")
4269{
G.Balaji73bfe0b2011-09-23 22:36:20 +05304270 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty));
paul718e3742002-12-13 20:15:29 +00004271}
4272
4273ALIAS (no_ipv6_bgp_network,
4274 no_ipv6_bgp_network_route_map_cmd,
4275 "no network X:X::X:X/M route-map WORD",
4276 NO_STR
4277 "Specify a network to announce via BGP\n"
4278 "IPv6 prefix <network>/<length>\n"
4279 "Route-map to modify the attributes\n"
4280 "Name of the route map\n")
4281
4282ALIAS (ipv6_bgp_network,
4283 old_ipv6_bgp_network_cmd,
4284 "ipv6 bgp network X:X::X:X/M",
4285 IPV6_STR
4286 BGP_STR
4287 "Specify a network to announce via BGP\n"
4288 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4289
4290ALIAS (no_ipv6_bgp_network,
4291 old_no_ipv6_bgp_network_cmd,
4292 "no ipv6 bgp network X:X::X:X/M",
4293 NO_STR
4294 IPV6_STR
4295 BGP_STR
4296 "Specify a network to announce via BGP\n"
4297 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4298#endif /* HAVE_IPV6 */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004299
4300/* stubs for removed AS-Pathlimit commands, kept for config compatibility */
4301ALIAS_DEPRECATED (bgp_network,
4302 bgp_network_ttl_cmd,
4303 "network A.B.C.D/M pathlimit <0-255>",
4304 "Specify a network to announce via BGP\n"
4305 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4306 "AS-Path hopcount limit attribute\n"
4307 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4308ALIAS_DEPRECATED (bgp_network_backdoor,
4309 bgp_network_backdoor_ttl_cmd,
4310 "network A.B.C.D/M backdoor pathlimit <0-255>",
4311 "Specify a network to announce via BGP\n"
4312 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4313 "Specify a BGP backdoor route\n"
4314 "AS-Path hopcount limit attribute\n"
4315 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4316ALIAS_DEPRECATED (bgp_network_mask,
4317 bgp_network_mask_ttl_cmd,
4318 "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4319 "Specify a network to announce via BGP\n"
4320 "Network number\n"
4321 "Network mask\n"
4322 "Network mask\n"
4323 "AS-Path hopcount limit attribute\n"
4324 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4325ALIAS_DEPRECATED (bgp_network_mask_backdoor,
4326 bgp_network_mask_backdoor_ttl_cmd,
4327 "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4328 "Specify a network to announce via BGP\n"
4329 "Network number\n"
4330 "Network mask\n"
4331 "Network mask\n"
4332 "Specify a BGP backdoor route\n"
4333 "AS-Path hopcount limit attribute\n"
4334 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4335ALIAS_DEPRECATED (bgp_network_mask_natural,
4336 bgp_network_mask_natural_ttl_cmd,
4337 "network A.B.C.D pathlimit <0-255>",
4338 "Specify a network to announce via BGP\n"
4339 "Network number\n"
4340 "AS-Path hopcount limit attribute\n"
4341 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4342ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
4343 bgp_network_mask_natural_backdoor_ttl_cmd,
4344 "network A.B.C.D backdoor pathlimit (1-255>",
4345 "Specify a network to announce via BGP\n"
4346 "Network number\n"
4347 "Specify a BGP backdoor route\n"
4348 "AS-Path hopcount limit attribute\n"
4349 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4350ALIAS_DEPRECATED (no_bgp_network,
4351 no_bgp_network_ttl_cmd,
4352 "no network A.B.C.D/M pathlimit <0-255>",
4353 NO_STR
4354 "Specify a network to announce via BGP\n"
4355 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4356 "AS-Path hopcount limit attribute\n"
4357 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4358ALIAS_DEPRECATED (no_bgp_network,
4359 no_bgp_network_backdoor_ttl_cmd,
4360 "no network A.B.C.D/M backdoor pathlimit <0-255>",
4361 NO_STR
4362 "Specify a network to announce via BGP\n"
4363 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4364 "Specify a BGP backdoor route\n"
4365 "AS-Path hopcount limit attribute\n"
4366 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4367ALIAS_DEPRECATED (no_bgp_network,
4368 no_bgp_network_mask_ttl_cmd,
4369 "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4370 NO_STR
4371 "Specify a network to announce via BGP\n"
4372 "Network number\n"
4373 "Network mask\n"
4374 "Network mask\n"
4375 "AS-Path hopcount limit attribute\n"
4376 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4377ALIAS_DEPRECATED (no_bgp_network_mask,
4378 no_bgp_network_mask_backdoor_ttl_cmd,
4379 "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4380 NO_STR
4381 "Specify a network to announce via BGP\n"
4382 "Network number\n"
4383 "Network mask\n"
4384 "Network mask\n"
4385 "Specify a BGP backdoor route\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_natural,
4389 no_bgp_network_mask_natural_ttl_cmd,
4390 "no network A.B.C.D pathlimit <0-255>",
4391 NO_STR
4392 "Specify a network to announce via BGP\n"
4393 "Network number\n"
4394 "AS-Path hopcount limit attribute\n"
4395 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4396ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4397 no_bgp_network_mask_natural_backdoor_ttl_cmd,
4398 "no network A.B.C.D backdoor pathlimit <0-255>",
4399 NO_STR
4400 "Specify a network to announce via BGP\n"
4401 "Network number\n"
4402 "Specify a BGP backdoor route\n"
4403 "AS-Path hopcount limit attribute\n"
4404 "AS-Pathlimit TTL, in number of AS-Path hops\n")
Paul Jakma3bde17f2011-03-23 10:30:30 +00004405#ifdef HAVE_IPV6
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004406ALIAS_DEPRECATED (ipv6_bgp_network,
4407 ipv6_bgp_network_ttl_cmd,
4408 "network X:X::X:X/M pathlimit <0-255>",
4409 "Specify a network to announce via BGP\n"
4410 "IPv6 prefix <network>/<length>\n"
4411 "AS-Path hopcount limit attribute\n"
4412 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4413ALIAS_DEPRECATED (no_ipv6_bgp_network,
4414 no_ipv6_bgp_network_ttl_cmd,
4415 "no network X:X::X:X/M pathlimit <0-255>",
4416 NO_STR
4417 "Specify a network to announce via BGP\n"
4418 "IPv6 prefix <network>/<length>\n"
4419 "AS-Path hopcount limit attribute\n"
4420 "AS-Pathlimit TTL, in number of AS-Path hops\n")
Paul Jakma3bde17f2011-03-23 10:30:30 +00004421#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00004422
4423/* Aggreagete address:
4424
4425 advertise-map Set condition to advertise attribute
4426 as-set Generate AS set path information
4427 attribute-map Set attributes of aggregate
4428 route-map Set parameters of aggregate
4429 summary-only Filter more specific routes from updates
4430 suppress-map Conditionally filter more specific routes from updates
4431 <cr>
4432 */
4433struct bgp_aggregate
4434{
4435 /* Summary-only flag. */
4436 u_char summary_only;
4437
4438 /* AS set generation. */
4439 u_char as_set;
4440
4441 /* Route-map for aggregated route. */
4442 struct route_map *map;
4443
4444 /* Suppress-count. */
4445 unsigned long count;
4446
4447 /* SAFI configuration. */
4448 safi_t safi;
4449};
4450
paul94f2b392005-06-28 12:44:16 +00004451static struct bgp_aggregate *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08004452bgp_aggregate_new (void)
paul718e3742002-12-13 20:15:29 +00004453{
Stephen Hemminger393deb92008-08-18 14:13:29 -07004454 return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
paul718e3742002-12-13 20:15:29 +00004455}
4456
paul94f2b392005-06-28 12:44:16 +00004457static void
paul718e3742002-12-13 20:15:29 +00004458bgp_aggregate_free (struct bgp_aggregate *aggregate)
4459{
4460 XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4461}
4462
paul94f2b392005-06-28 12:44:16 +00004463static void
paul718e3742002-12-13 20:15:29 +00004464bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4465 afi_t afi, safi_t safi, struct bgp_info *del,
4466 struct bgp_aggregate *aggregate)
4467{
4468 struct bgp_table *table;
4469 struct bgp_node *top;
4470 struct bgp_node *rn;
4471 u_char origin;
4472 struct aspath *aspath = NULL;
4473 struct aspath *asmerge = NULL;
4474 struct community *community = NULL;
4475 struct community *commerge = NULL;
4476 struct in_addr nexthop;
4477 u_int32_t med = 0;
4478 struct bgp_info *ri;
4479 struct bgp_info *new;
4480 int first = 1;
4481 unsigned long match = 0;
4482
4483 /* Record adding route's nexthop and med. */
4484 if (rinew)
4485 {
4486 nexthop = rinew->attr->nexthop;
4487 med = rinew->attr->med;
4488 }
4489
4490 /* ORIGIN attribute: If at least one route among routes that are
4491 aggregated has ORIGIN with the value INCOMPLETE, then the
4492 aggregated route must have the ORIGIN attribute with the value
4493 INCOMPLETE. Otherwise, if at least one route among routes that
4494 are aggregated has ORIGIN with the value EGP, then the aggregated
4495 route must have the origin attribute with the value EGP. In all
4496 other case the value of the ORIGIN attribute of the aggregated
4497 route is INTERNAL. */
4498 origin = BGP_ORIGIN_IGP;
4499
4500 table = bgp->rib[afi][safi];
4501
4502 top = bgp_node_get (table, p);
4503 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4504 if (rn->p.prefixlen > p->prefixlen)
4505 {
4506 match = 0;
4507
4508 for (ri = rn->info; ri; ri = ri->next)
4509 {
4510 if (BGP_INFO_HOLDDOWN (ri))
4511 continue;
4512
4513 if (del && ri == del)
4514 continue;
4515
4516 if (! rinew && first)
4517 {
4518 nexthop = ri->attr->nexthop;
4519 med = ri->attr->med;
4520 first = 0;
4521 }
4522
4523#ifdef AGGREGATE_NEXTHOP_CHECK
4524 if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4525 || ri->attr->med != med)
4526 {
4527 if (aspath)
4528 aspath_free (aspath);
4529 if (community)
4530 community_free (community);
4531 bgp_unlock_node (rn);
4532 bgp_unlock_node (top);
4533 return;
4534 }
4535#endif /* AGGREGATE_NEXTHOP_CHECK */
4536
4537 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4538 {
4539 if (aggregate->summary_only)
4540 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004541 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004542 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004543 match++;
4544 }
4545
4546 aggregate->count++;
4547
4548 if (aggregate->as_set)
4549 {
4550 if (origin < ri->attr->origin)
4551 origin = ri->attr->origin;
4552
4553 if (aspath)
4554 {
4555 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4556 aspath_free (aspath);
4557 aspath = asmerge;
4558 }
4559 else
4560 aspath = aspath_dup (ri->attr->aspath);
4561
4562 if (ri->attr->community)
4563 {
4564 if (community)
4565 {
4566 commerge = community_merge (community,
4567 ri->attr->community);
4568 community = community_uniq_sort (commerge);
4569 community_free (commerge);
4570 }
4571 else
4572 community = community_dup (ri->attr->community);
4573 }
4574 }
4575 }
4576 }
4577 if (match)
4578 bgp_process (bgp, rn, afi, safi);
4579 }
4580 bgp_unlock_node (top);
4581
4582 if (rinew)
4583 {
4584 aggregate->count++;
4585
4586 if (aggregate->summary_only)
Paul Jakmafb982c22007-05-04 20:15:47 +00004587 (bgp_info_extra_get (rinew))->suppress++;
paul718e3742002-12-13 20:15:29 +00004588
4589 if (aggregate->as_set)
4590 {
4591 if (origin < rinew->attr->origin)
4592 origin = rinew->attr->origin;
4593
4594 if (aspath)
4595 {
4596 asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4597 aspath_free (aspath);
4598 aspath = asmerge;
4599 }
4600 else
4601 aspath = aspath_dup (rinew->attr->aspath);
4602
4603 if (rinew->attr->community)
4604 {
4605 if (community)
4606 {
4607 commerge = community_merge (community,
4608 rinew->attr->community);
4609 community = community_uniq_sort (commerge);
4610 community_free (commerge);
4611 }
4612 else
4613 community = community_dup (rinew->attr->community);
4614 }
4615 }
4616 }
4617
4618 if (aggregate->count > 0)
4619 {
4620 rn = bgp_node_get (table, p);
4621 new = bgp_info_new ();
4622 new->type = ZEBRA_ROUTE_BGP;
4623 new->sub_type = BGP_ROUTE_AGGREGATE;
4624 new->peer = bgp->peer_self;
4625 SET_FLAG (new->flags, BGP_INFO_VALID);
4626 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004627 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004628
4629 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004630 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00004631 bgp_process (bgp, rn, afi, safi);
4632 }
4633 else
4634 {
4635 if (aspath)
4636 aspath_free (aspath);
4637 if (community)
4638 community_free (community);
4639 }
4640}
4641
4642void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4643 struct bgp_aggregate *);
4644
4645void
4646bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4647 struct bgp_info *ri, afi_t afi, safi_t safi)
4648{
4649 struct bgp_node *child;
4650 struct bgp_node *rn;
4651 struct bgp_aggregate *aggregate;
4652
4653 /* MPLS-VPN aggregation is not yet supported. */
4654 if (safi == SAFI_MPLS_VPN)
4655 return;
4656
4657 if (p->prefixlen == 0)
4658 return;
4659
4660 if (BGP_INFO_HOLDDOWN (ri))
4661 return;
4662
4663 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4664
4665 /* Aggregate address configuration check. */
4666 for (rn = child; rn; rn = rn->parent)
4667 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4668 {
4669 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004670 bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
paul718e3742002-12-13 20:15:29 +00004671 }
4672 bgp_unlock_node (child);
4673}
4674
4675void
4676bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4677 struct bgp_info *del, afi_t afi, safi_t safi)
4678{
4679 struct bgp_node *child;
4680 struct bgp_node *rn;
4681 struct bgp_aggregate *aggregate;
4682
4683 /* MPLS-VPN aggregation is not yet supported. */
4684 if (safi == SAFI_MPLS_VPN)
4685 return;
4686
4687 if (p->prefixlen == 0)
4688 return;
4689
4690 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4691
4692 /* Aggregate address configuration check. */
4693 for (rn = child; rn; rn = rn->parent)
4694 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4695 {
4696 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004697 bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
paul718e3742002-12-13 20:15:29 +00004698 }
4699 bgp_unlock_node (child);
4700}
4701
paul94f2b392005-06-28 12:44:16 +00004702static void
paul718e3742002-12-13 20:15:29 +00004703bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4704 struct bgp_aggregate *aggregate)
4705{
4706 struct bgp_table *table;
4707 struct bgp_node *top;
4708 struct bgp_node *rn;
4709 struct bgp_info *new;
4710 struct bgp_info *ri;
4711 unsigned long match;
4712 u_char origin = BGP_ORIGIN_IGP;
4713 struct aspath *aspath = NULL;
4714 struct aspath *asmerge = NULL;
4715 struct community *community = NULL;
4716 struct community *commerge = NULL;
4717
4718 table = bgp->rib[afi][safi];
4719
4720 /* Sanity check. */
4721 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4722 return;
4723 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4724 return;
4725
4726 /* If routes exists below this node, generate aggregate routes. */
4727 top = bgp_node_get (table, p);
4728 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4729 if (rn->p.prefixlen > p->prefixlen)
4730 {
4731 match = 0;
4732
4733 for (ri = rn->info; ri; ri = ri->next)
4734 {
4735 if (BGP_INFO_HOLDDOWN (ri))
4736 continue;
4737
4738 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4739 {
4740 /* summary-only aggregate route suppress aggregated
4741 route announcement. */
4742 if (aggregate->summary_only)
4743 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004744 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004745 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004746 match++;
4747 }
4748 /* as-set aggregate route generate origin, as path,
4749 community aggregation. */
4750 if (aggregate->as_set)
4751 {
4752 if (origin < ri->attr->origin)
4753 origin = ri->attr->origin;
4754
4755 if (aspath)
4756 {
4757 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4758 aspath_free (aspath);
4759 aspath = asmerge;
4760 }
4761 else
4762 aspath = aspath_dup (ri->attr->aspath);
4763
4764 if (ri->attr->community)
4765 {
4766 if (community)
4767 {
4768 commerge = community_merge (community,
4769 ri->attr->community);
4770 community = community_uniq_sort (commerge);
4771 community_free (commerge);
4772 }
4773 else
4774 community = community_dup (ri->attr->community);
4775 }
4776 }
4777 aggregate->count++;
4778 }
4779 }
4780
4781 /* If this node is suppressed, process the change. */
4782 if (match)
4783 bgp_process (bgp, rn, afi, safi);
4784 }
4785 bgp_unlock_node (top);
4786
4787 /* Add aggregate route to BGP table. */
4788 if (aggregate->count)
4789 {
4790 rn = bgp_node_get (table, p);
4791
4792 new = bgp_info_new ();
4793 new->type = ZEBRA_ROUTE_BGP;
4794 new->sub_type = BGP_ROUTE_AGGREGATE;
4795 new->peer = bgp->peer_self;
4796 SET_FLAG (new->flags, BGP_INFO_VALID);
4797 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004798 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004799
4800 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004801 bgp_unlock_node (rn);
4802
paul718e3742002-12-13 20:15:29 +00004803 /* Process change. */
4804 bgp_process (bgp, rn, afi, safi);
4805 }
4806}
4807
4808void
4809bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4810 safi_t safi, struct bgp_aggregate *aggregate)
4811{
4812 struct bgp_table *table;
4813 struct bgp_node *top;
4814 struct bgp_node *rn;
4815 struct bgp_info *ri;
4816 unsigned long match;
4817
4818 table = bgp->rib[afi][safi];
4819
4820 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4821 return;
4822 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4823 return;
4824
4825 /* If routes exists below this node, generate aggregate routes. */
4826 top = bgp_node_get (table, p);
4827 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4828 if (rn->p.prefixlen > p->prefixlen)
4829 {
4830 match = 0;
4831
4832 for (ri = rn->info; ri; ri = ri->next)
4833 {
4834 if (BGP_INFO_HOLDDOWN (ri))
4835 continue;
4836
4837 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4838 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004839 if (aggregate->summary_only && ri->extra)
paul718e3742002-12-13 20:15:29 +00004840 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004841 ri->extra->suppress--;
paul718e3742002-12-13 20:15:29 +00004842
Paul Jakmafb982c22007-05-04 20:15:47 +00004843 if (ri->extra->suppress == 0)
paul718e3742002-12-13 20:15:29 +00004844 {
Paul Jakma1a392d42006-09-07 00:24:49 +00004845 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004846 match++;
4847 }
4848 }
4849 aggregate->count--;
4850 }
4851 }
4852
Paul Jakmafb982c22007-05-04 20:15:47 +00004853 /* If this node was suppressed, process the change. */
paul718e3742002-12-13 20:15:29 +00004854 if (match)
4855 bgp_process (bgp, rn, afi, safi);
4856 }
4857 bgp_unlock_node (top);
4858
4859 /* Delete aggregate route from BGP table. */
4860 rn = bgp_node_get (table, p);
4861
4862 for (ri = rn->info; ri; ri = ri->next)
4863 if (ri->peer == bgp->peer_self
4864 && ri->type == ZEBRA_ROUTE_BGP
4865 && ri->sub_type == BGP_ROUTE_AGGREGATE)
4866 break;
4867
4868 /* Withdraw static BGP route from routing table. */
4869 if (ri)
4870 {
paul718e3742002-12-13 20:15:29 +00004871 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00004872 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00004873 }
4874
4875 /* Unlock bgp_node_lookup. */
4876 bgp_unlock_node (rn);
4877}
4878
4879/* Aggregate route attribute. */
4880#define AGGREGATE_SUMMARY_ONLY 1
4881#define AGGREGATE_AS_SET 1
4882
paul94f2b392005-06-28 12:44:16 +00004883static int
Robert Baysf6269b42010-08-05 10:26:28 -07004884bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4885 afi_t afi, safi_t safi)
4886{
4887 int ret;
4888 struct prefix p;
4889 struct bgp_node *rn;
4890 struct bgp *bgp;
4891 struct bgp_aggregate *aggregate;
4892
4893 /* Convert string to prefix structure. */
4894 ret = str2prefix (prefix_str, &p);
4895 if (!ret)
4896 {
4897 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4898 return CMD_WARNING;
4899 }
4900 apply_mask (&p);
4901
4902 /* Get BGP structure. */
4903 bgp = vty->index;
4904
4905 /* Old configuration check. */
4906 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
4907 if (! rn)
4908 {
4909 vty_out (vty, "%% There is no aggregate-address configuration.%s",
4910 VTY_NEWLINE);
4911 return CMD_WARNING;
4912 }
4913
4914 aggregate = rn->info;
4915 if (aggregate->safi & SAFI_UNICAST)
4916 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
4917 if (aggregate->safi & SAFI_MULTICAST)
4918 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4919
4920 /* Unlock aggregate address configuration. */
4921 rn->info = NULL;
4922 bgp_aggregate_free (aggregate);
4923 bgp_unlock_node (rn);
4924 bgp_unlock_node (rn);
4925
4926 return CMD_SUCCESS;
4927}
4928
4929static int
4930bgp_aggregate_set (struct vty *vty, const char *prefix_str,
paulfd79ac92004-10-13 05:06:08 +00004931 afi_t afi, safi_t safi,
paul718e3742002-12-13 20:15:29 +00004932 u_char summary_only, u_char as_set)
4933{
4934 int ret;
4935 struct prefix p;
4936 struct bgp_node *rn;
4937 struct bgp *bgp;
4938 struct bgp_aggregate *aggregate;
4939
4940 /* Convert string to prefix structure. */
4941 ret = str2prefix (prefix_str, &p);
4942 if (!ret)
4943 {
4944 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4945 return CMD_WARNING;
4946 }
4947 apply_mask (&p);
4948
4949 /* Get BGP structure. */
4950 bgp = vty->index;
4951
4952 /* Old configuration check. */
4953 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4954
4955 if (rn->info)
4956 {
4957 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
Robert Bays368473f2010-08-05 10:26:29 -07004958 /* try to remove the old entry */
Robert Baysf6269b42010-08-05 10:26:28 -07004959 ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
4960 if (ret)
4961 {
Robert Bays368473f2010-08-05 10:26:29 -07004962 vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
4963 bgp_unlock_node (rn);
Robert Baysf6269b42010-08-05 10:26:28 -07004964 return CMD_WARNING;
4965 }
paul718e3742002-12-13 20:15:29 +00004966 }
4967
4968 /* Make aggregate address structure. */
4969 aggregate = bgp_aggregate_new ();
4970 aggregate->summary_only = summary_only;
4971 aggregate->as_set = as_set;
4972 aggregate->safi = safi;
4973 rn->info = aggregate;
4974
4975 /* Aggregate address insert into BGP routing table. */
4976 if (safi & SAFI_UNICAST)
4977 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
4978 if (safi & SAFI_MULTICAST)
4979 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4980
4981 return CMD_SUCCESS;
4982}
4983
paul718e3742002-12-13 20:15:29 +00004984DEFUN (aggregate_address,
4985 aggregate_address_cmd,
4986 "aggregate-address A.B.C.D/M",
4987 "Configure BGP aggregate entries\n"
4988 "Aggregate prefix\n")
4989{
4990 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
4991}
4992
4993DEFUN (aggregate_address_mask,
4994 aggregate_address_mask_cmd,
4995 "aggregate-address A.B.C.D A.B.C.D",
4996 "Configure BGP aggregate entries\n"
4997 "Aggregate address\n"
4998 "Aggregate mask\n")
4999{
5000 int ret;
5001 char prefix_str[BUFSIZ];
5002
5003 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5004
5005 if (! ret)
5006 {
5007 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5008 return CMD_WARNING;
5009 }
5010
5011 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5012 0, 0);
5013}
5014
5015DEFUN (aggregate_address_summary_only,
5016 aggregate_address_summary_only_cmd,
5017 "aggregate-address A.B.C.D/M summary-only",
5018 "Configure BGP aggregate entries\n"
5019 "Aggregate prefix\n"
5020 "Filter more specific routes from updates\n")
5021{
5022 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5023 AGGREGATE_SUMMARY_ONLY, 0);
5024}
5025
5026DEFUN (aggregate_address_mask_summary_only,
5027 aggregate_address_mask_summary_only_cmd,
5028 "aggregate-address A.B.C.D A.B.C.D summary-only",
5029 "Configure BGP aggregate entries\n"
5030 "Aggregate address\n"
5031 "Aggregate mask\n"
5032 "Filter more specific routes from updates\n")
5033{
5034 int ret;
5035 char prefix_str[BUFSIZ];
5036
5037 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5038
5039 if (! ret)
5040 {
5041 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5042 return CMD_WARNING;
5043 }
5044
5045 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5046 AGGREGATE_SUMMARY_ONLY, 0);
5047}
5048
5049DEFUN (aggregate_address_as_set,
5050 aggregate_address_as_set_cmd,
5051 "aggregate-address A.B.C.D/M as-set",
5052 "Configure BGP aggregate entries\n"
5053 "Aggregate prefix\n"
5054 "Generate AS set path information\n")
5055{
5056 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5057 0, AGGREGATE_AS_SET);
5058}
5059
5060DEFUN (aggregate_address_mask_as_set,
5061 aggregate_address_mask_as_set_cmd,
5062 "aggregate-address A.B.C.D A.B.C.D as-set",
5063 "Configure BGP aggregate entries\n"
5064 "Aggregate address\n"
5065 "Aggregate mask\n"
5066 "Generate AS set path information\n")
5067{
5068 int ret;
5069 char prefix_str[BUFSIZ];
5070
5071 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5072
5073 if (! ret)
5074 {
5075 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5076 return CMD_WARNING;
5077 }
5078
5079 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5080 0, AGGREGATE_AS_SET);
5081}
5082
5083
5084DEFUN (aggregate_address_as_set_summary,
5085 aggregate_address_as_set_summary_cmd,
5086 "aggregate-address A.B.C.D/M as-set summary-only",
5087 "Configure BGP aggregate entries\n"
5088 "Aggregate prefix\n"
5089 "Generate AS set path information\n"
5090 "Filter more specific routes from updates\n")
5091{
5092 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5093 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5094}
5095
5096ALIAS (aggregate_address_as_set_summary,
5097 aggregate_address_summary_as_set_cmd,
5098 "aggregate-address A.B.C.D/M summary-only as-set",
5099 "Configure BGP aggregate entries\n"
5100 "Aggregate prefix\n"
5101 "Filter more specific routes from updates\n"
5102 "Generate AS set path information\n")
5103
5104DEFUN (aggregate_address_mask_as_set_summary,
5105 aggregate_address_mask_as_set_summary_cmd,
5106 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5107 "Configure BGP aggregate entries\n"
5108 "Aggregate address\n"
5109 "Aggregate mask\n"
5110 "Generate AS set path information\n"
5111 "Filter more specific routes from updates\n")
5112{
5113 int ret;
5114 char prefix_str[BUFSIZ];
5115
5116 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5117
5118 if (! ret)
5119 {
5120 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5121 return CMD_WARNING;
5122 }
5123
5124 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5125 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5126}
5127
5128ALIAS (aggregate_address_mask_as_set_summary,
5129 aggregate_address_mask_summary_as_set_cmd,
5130 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5131 "Configure BGP aggregate entries\n"
5132 "Aggregate address\n"
5133 "Aggregate mask\n"
5134 "Filter more specific routes from updates\n"
5135 "Generate AS set path information\n")
5136
5137DEFUN (no_aggregate_address,
5138 no_aggregate_address_cmd,
5139 "no aggregate-address A.B.C.D/M",
5140 NO_STR
5141 "Configure BGP aggregate entries\n"
5142 "Aggregate prefix\n")
5143{
5144 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5145}
5146
5147ALIAS (no_aggregate_address,
5148 no_aggregate_address_summary_only_cmd,
5149 "no aggregate-address A.B.C.D/M summary-only",
5150 NO_STR
5151 "Configure BGP aggregate entries\n"
5152 "Aggregate prefix\n"
5153 "Filter more specific routes from updates\n")
5154
5155ALIAS (no_aggregate_address,
5156 no_aggregate_address_as_set_cmd,
5157 "no aggregate-address A.B.C.D/M as-set",
5158 NO_STR
5159 "Configure BGP aggregate entries\n"
5160 "Aggregate prefix\n"
5161 "Generate AS set path information\n")
5162
5163ALIAS (no_aggregate_address,
5164 no_aggregate_address_as_set_summary_cmd,
5165 "no aggregate-address A.B.C.D/M as-set summary-only",
5166 NO_STR
5167 "Configure BGP aggregate entries\n"
5168 "Aggregate prefix\n"
5169 "Generate AS set path information\n"
5170 "Filter more specific routes from updates\n")
5171
5172ALIAS (no_aggregate_address,
5173 no_aggregate_address_summary_as_set_cmd,
5174 "no aggregate-address A.B.C.D/M summary-only as-set",
5175 NO_STR
5176 "Configure BGP aggregate entries\n"
5177 "Aggregate prefix\n"
5178 "Filter more specific routes from updates\n"
5179 "Generate AS set path information\n")
5180
5181DEFUN (no_aggregate_address_mask,
5182 no_aggregate_address_mask_cmd,
5183 "no aggregate-address A.B.C.D A.B.C.D",
5184 NO_STR
5185 "Configure BGP aggregate entries\n"
5186 "Aggregate address\n"
5187 "Aggregate mask\n")
5188{
5189 int ret;
5190 char prefix_str[BUFSIZ];
5191
5192 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5193
5194 if (! ret)
5195 {
5196 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5197 return CMD_WARNING;
5198 }
5199
5200 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5201}
5202
5203ALIAS (no_aggregate_address_mask,
5204 no_aggregate_address_mask_summary_only_cmd,
5205 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5206 NO_STR
5207 "Configure BGP aggregate entries\n"
5208 "Aggregate address\n"
5209 "Aggregate mask\n"
5210 "Filter more specific routes from updates\n")
5211
5212ALIAS (no_aggregate_address_mask,
5213 no_aggregate_address_mask_as_set_cmd,
5214 "no aggregate-address A.B.C.D A.B.C.D as-set",
5215 NO_STR
5216 "Configure BGP aggregate entries\n"
5217 "Aggregate address\n"
5218 "Aggregate mask\n"
5219 "Generate AS set path information\n")
5220
5221ALIAS (no_aggregate_address_mask,
5222 no_aggregate_address_mask_as_set_summary_cmd,
5223 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5224 NO_STR
5225 "Configure BGP aggregate entries\n"
5226 "Aggregate address\n"
5227 "Aggregate mask\n"
5228 "Generate AS set path information\n"
5229 "Filter more specific routes from updates\n")
5230
5231ALIAS (no_aggregate_address_mask,
5232 no_aggregate_address_mask_summary_as_set_cmd,
5233 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5234 NO_STR
5235 "Configure BGP aggregate entries\n"
5236 "Aggregate address\n"
5237 "Aggregate mask\n"
5238 "Filter more specific routes from updates\n"
5239 "Generate AS set path information\n")
5240
5241#ifdef HAVE_IPV6
5242DEFUN (ipv6_aggregate_address,
5243 ipv6_aggregate_address_cmd,
5244 "aggregate-address X:X::X:X/M",
5245 "Configure BGP aggregate entries\n"
5246 "Aggregate prefix\n")
5247{
5248 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5249}
5250
5251DEFUN (ipv6_aggregate_address_summary_only,
5252 ipv6_aggregate_address_summary_only_cmd,
5253 "aggregate-address X:X::X:X/M summary-only",
5254 "Configure BGP aggregate entries\n"
5255 "Aggregate prefix\n"
5256 "Filter more specific routes from updates\n")
5257{
5258 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5259 AGGREGATE_SUMMARY_ONLY, 0);
5260}
5261
5262DEFUN (no_ipv6_aggregate_address,
5263 no_ipv6_aggregate_address_cmd,
5264 "no aggregate-address X:X::X:X/M",
5265 NO_STR
5266 "Configure BGP aggregate entries\n"
5267 "Aggregate prefix\n")
5268{
5269 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5270}
5271
5272DEFUN (no_ipv6_aggregate_address_summary_only,
5273 no_ipv6_aggregate_address_summary_only_cmd,
5274 "no aggregate-address X:X::X:X/M summary-only",
5275 NO_STR
5276 "Configure BGP aggregate entries\n"
5277 "Aggregate prefix\n"
5278 "Filter more specific routes from updates\n")
5279{
5280 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5281}
5282
5283ALIAS (ipv6_aggregate_address,
5284 old_ipv6_aggregate_address_cmd,
5285 "ipv6 bgp aggregate-address X:X::X:X/M",
5286 IPV6_STR
5287 BGP_STR
5288 "Configure BGP aggregate entries\n"
5289 "Aggregate prefix\n")
5290
5291ALIAS (ipv6_aggregate_address_summary_only,
5292 old_ipv6_aggregate_address_summary_only_cmd,
5293 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5294 IPV6_STR
5295 BGP_STR
5296 "Configure BGP aggregate entries\n"
5297 "Aggregate prefix\n"
5298 "Filter more specific routes from updates\n")
5299
5300ALIAS (no_ipv6_aggregate_address,
5301 old_no_ipv6_aggregate_address_cmd,
5302 "no ipv6 bgp aggregate-address X:X::X:X/M",
5303 NO_STR
5304 IPV6_STR
5305 BGP_STR
5306 "Configure BGP aggregate entries\n"
5307 "Aggregate prefix\n")
5308
5309ALIAS (no_ipv6_aggregate_address_summary_only,
5310 old_no_ipv6_aggregate_address_summary_only_cmd,
5311 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5312 NO_STR
5313 IPV6_STR
5314 BGP_STR
5315 "Configure BGP aggregate entries\n"
5316 "Aggregate prefix\n"
5317 "Filter more specific routes from updates\n")
5318#endif /* HAVE_IPV6 */
5319
5320/* Redistribute route treatment. */
5321void
Stephen Hemmingerf04a80a2011-12-06 14:51:10 +04005322bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
5323 const struct in6_addr *nexthop6,
paul718e3742002-12-13 20:15:29 +00005324 u_int32_t metric, u_char type)
5325{
5326 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005327 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005328 struct bgp_info *new;
5329 struct bgp_info *bi;
5330 struct bgp_info info;
5331 struct bgp_node *bn;
Paul Jakmafb982c22007-05-04 20:15:47 +00005332 struct attr attr = { 0 };
5333 struct attr attr_new = { 0 };
paul718e3742002-12-13 20:15:29 +00005334 struct attr *new_attr;
5335 afi_t afi;
5336 int ret;
5337
5338 /* Make default attribute. */
5339 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5340 if (nexthop)
5341 attr.nexthop = *nexthop;
5342
Stephen Hemmingerf04a80a2011-12-06 14:51:10 +04005343#ifdef HAVE_IPV6
5344 if (nexthop6)
5345 {
5346 struct attr_extra *extra = bgp_attr_extra_get(&attr);
5347 extra->mp_nexthop_global = *nexthop6;
5348 extra->mp_nexthop_len = 16;
5349 }
5350#endif
5351
paul718e3742002-12-13 20:15:29 +00005352 attr.med = metric;
5353 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5354
paul1eb8ef22005-04-07 07:30:20 +00005355 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005356 {
5357 afi = family2afi (p->family);
5358
5359 if (bgp->redist[afi][type])
5360 {
5361 /* Copy attribute for modification. */
Paul Jakmafb982c22007-05-04 20:15:47 +00005362 bgp_attr_dup (&attr_new, &attr);
paul718e3742002-12-13 20:15:29 +00005363
5364 if (bgp->redist_metric_flag[afi][type])
5365 attr_new.med = bgp->redist_metric[afi][type];
5366
5367 /* Apply route-map. */
5368 if (bgp->rmap[afi][type].map)
5369 {
5370 info.peer = bgp->peer_self;
5371 info.attr = &attr_new;
5372
paulfee0f4c2004-09-13 05:12:46 +00005373 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5374
paul718e3742002-12-13 20:15:29 +00005375 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5376 &info);
paulfee0f4c2004-09-13 05:12:46 +00005377
5378 bgp->peer_self->rmap_type = 0;
5379
paul718e3742002-12-13 20:15:29 +00005380 if (ret == RMAP_DENYMATCH)
5381 {
5382 /* Free uninterned attribute. */
5383 bgp_attr_flush (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005384 bgp_attr_extra_free (&attr_new);
5385
paul718e3742002-12-13 20:15:29 +00005386 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005387 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005388 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005389 bgp_redistribute_delete (p, type);
5390 return;
5391 }
5392 }
5393
Paul Jakmafb982c22007-05-04 20:15:47 +00005394 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5395 afi, SAFI_UNICAST, p, NULL);
5396
paul718e3742002-12-13 20:15:29 +00005397 new_attr = bgp_attr_intern (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005398 bgp_attr_extra_free (&attr_new);
5399
paul718e3742002-12-13 20:15:29 +00005400 for (bi = bn->info; bi; bi = bi->next)
5401 if (bi->peer == bgp->peer_self
5402 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5403 break;
5404
5405 if (bi)
5406 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005407 if (attrhash_cmp (bi->attr, new_attr) &&
5408 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00005409 {
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005410 bgp_attr_unintern (&new_attr);
5411 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005412 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005413 bgp_unlock_node (bn);
5414 return;
5415 }
5416 else
5417 {
5418 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00005419 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00005420
5421 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005422 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5423 bgp_info_restore(bn, bi);
5424 else
5425 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005426 bgp_attr_unintern (&bi->attr);
paul718e3742002-12-13 20:15:29 +00005427 bi->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005428 bi->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005429
5430 /* Process change. */
5431 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5432 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5433 bgp_unlock_node (bn);
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005434 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005435 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005436 return;
5437 }
5438 }
5439
5440 new = bgp_info_new ();
5441 new->type = type;
5442 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5443 new->peer = bgp->peer_self;
5444 SET_FLAG (new->flags, BGP_INFO_VALID);
5445 new->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005446 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005447
5448 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5449 bgp_info_add (bn, new);
paul200df112005-06-01 11:17:05 +00005450 bgp_unlock_node (bn);
paul718e3742002-12-13 20:15:29 +00005451 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5452 }
5453 }
5454
5455 /* Unintern original. */
Paul Jakmaf6f434b2010-11-23 21:28:03 +00005456 aspath_unintern (&attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005457 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005458}
5459
5460void
5461bgp_redistribute_delete (struct prefix *p, u_char type)
5462{
5463 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005464 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005465 afi_t afi;
5466 struct bgp_node *rn;
5467 struct bgp_info *ri;
5468
paul1eb8ef22005-04-07 07:30:20 +00005469 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005470 {
5471 afi = family2afi (p->family);
5472
5473 if (bgp->redist[afi][type])
5474 {
paulfee0f4c2004-09-13 05:12:46 +00005475 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
paul718e3742002-12-13 20:15:29 +00005476
5477 for (ri = rn->info; ri; ri = ri->next)
5478 if (ri->peer == bgp->peer_self
5479 && ri->type == type)
5480 break;
5481
5482 if (ri)
5483 {
5484 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005485 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005486 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005487 }
5488 bgp_unlock_node (rn);
5489 }
5490 }
5491}
5492
5493/* Withdraw specified route type's route. */
5494void
5495bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5496{
5497 struct bgp_node *rn;
5498 struct bgp_info *ri;
5499 struct bgp_table *table;
5500
5501 table = bgp->rib[afi][SAFI_UNICAST];
5502
5503 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5504 {
5505 for (ri = rn->info; ri; ri = ri->next)
5506 if (ri->peer == bgp->peer_self
5507 && ri->type == type)
5508 break;
5509
5510 if (ri)
5511 {
5512 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005513 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005514 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005515 }
5516 }
5517}
5518
5519/* Static function to display route. */
paul94f2b392005-06-28 12:44:16 +00005520static void
paul718e3742002-12-13 20:15:29 +00005521route_vty_out_route (struct prefix *p, struct vty *vty)
5522{
5523 int len;
5524 u_int32_t destination;
5525 char buf[BUFSIZ];
5526
5527 if (p->family == AF_INET)
5528 {
5529 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5530 destination = ntohl (p->u.prefix4.s_addr);
5531
5532 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5533 || (IN_CLASSB (destination) && p->prefixlen == 16)
5534 || (IN_CLASSA (destination) && p->prefixlen == 8)
5535 || p->u.prefix4.s_addr == 0)
5536 {
5537 /* When mask is natural, mask is not displayed. */
5538 }
5539 else
5540 len += vty_out (vty, "/%d", p->prefixlen);
5541 }
5542 else
5543 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5544 p->prefixlen);
5545
5546 len = 17 - len;
5547 if (len < 1)
5548 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5549 else
5550 vty_out (vty, "%*s", len, " ");
5551}
5552
paul718e3742002-12-13 20:15:29 +00005553enum bgp_display_type
5554{
5555 normal_list,
5556};
5557
paulb40d9392005-08-22 22:34:41 +00005558/* Print the short form route status for a bgp_info */
5559static void
5560route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
paul718e3742002-12-13 20:15:29 +00005561{
paulb40d9392005-08-22 22:34:41 +00005562 /* Route status display. */
5563 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5564 vty_out (vty, "R");
5565 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
hasso93406d82005-02-02 14:40:33 +00005566 vty_out (vty, "S");
Paul Jakmafb982c22007-05-04 20:15:47 +00005567 else if (binfo->extra && binfo->extra->suppress)
paul718e3742002-12-13 20:15:29 +00005568 vty_out (vty, "s");
5569 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5570 vty_out (vty, "*");
5571 else
5572 vty_out (vty, " ");
5573
5574 /* Selected */
5575 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5576 vty_out (vty, "h");
5577 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5578 vty_out (vty, "d");
5579 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5580 vty_out (vty, ">");
5581 else
5582 vty_out (vty, " ");
5583
5584 /* Internal route. */
5585 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5586 vty_out (vty, "i");
5587 else
paulb40d9392005-08-22 22:34:41 +00005588 vty_out (vty, " ");
5589}
5590
5591/* called from terminal list command */
5592void
5593route_vty_out (struct vty *vty, struct prefix *p,
5594 struct bgp_info *binfo, int display, safi_t safi)
5595{
5596 struct attr *attr;
5597
5598 /* short status lead text */
5599 route_vty_short_status_out (vty, binfo);
paul718e3742002-12-13 20:15:29 +00005600
5601 /* print prefix and mask */
5602 if (! display)
5603 route_vty_out_route (p, vty);
5604 else
5605 vty_out (vty, "%*s", 17, " ");
5606
5607 /* Print attribute */
5608 attr = binfo->attr;
5609 if (attr)
5610 {
5611 if (p->family == AF_INET)
5612 {
5613 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005614 vty_out (vty, "%-16s",
5615 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005616 else
5617 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5618 }
5619#ifdef HAVE_IPV6
5620 else if (p->family == AF_INET6)
5621 {
5622 int len;
5623 char buf[BUFSIZ];
5624
5625 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005626 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5627 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005628 len = 16 - len;
5629 if (len < 1)
5630 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5631 else
5632 vty_out (vty, "%*s", len, " ");
5633 }
5634#endif /* HAVE_IPV6 */
5635
5636 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005637 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005638 else
5639 vty_out (vty, " ");
5640
5641 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005642 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005643 else
5644 vty_out (vty, " ");
5645
Paul Jakmafb982c22007-05-04 20:15:47 +00005646 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
paul718e3742002-12-13 20:15:29 +00005647
Paul Jakmab2518c12006-05-12 23:48:40 +00005648 /* Print aspath */
5649 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005650 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005651
Paul Jakmab2518c12006-05-12 23:48:40 +00005652 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005653 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005654 }
paul718e3742002-12-13 20:15:29 +00005655 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005656}
5657
5658/* called from terminal list command */
5659void
5660route_vty_out_tmp (struct vty *vty, struct prefix *p,
5661 struct attr *attr, safi_t safi)
5662{
5663 /* Route status display. */
5664 vty_out (vty, "*");
5665 vty_out (vty, ">");
5666 vty_out (vty, " ");
5667
5668 /* print prefix and mask */
5669 route_vty_out_route (p, vty);
5670
5671 /* Print attribute */
5672 if (attr)
5673 {
5674 if (p->family == AF_INET)
5675 {
5676 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005677 vty_out (vty, "%-16s",
5678 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005679 else
5680 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5681 }
5682#ifdef HAVE_IPV6
5683 else if (p->family == AF_INET6)
5684 {
5685 int len;
5686 char buf[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005687
5688 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005689
5690 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005691 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5692 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005693 len = 16 - len;
5694 if (len < 1)
5695 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5696 else
5697 vty_out (vty, "%*s", len, " ");
5698 }
5699#endif /* HAVE_IPV6 */
5700
5701 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005702 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005703 else
5704 vty_out (vty, " ");
5705
5706 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005707 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005708 else
5709 vty_out (vty, " ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005710
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005711 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
Paul Jakmafb982c22007-05-04 20:15:47 +00005712
Paul Jakmab2518c12006-05-12 23:48:40 +00005713 /* Print aspath */
5714 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005715 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005716
Paul Jakmab2518c12006-05-12 23:48:40 +00005717 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005718 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005719 }
paul718e3742002-12-13 20:15:29 +00005720
5721 vty_out (vty, "%s", VTY_NEWLINE);
5722}
5723
ajs5a646652004-11-05 01:25:55 +00005724void
paul718e3742002-12-13 20:15:29 +00005725route_vty_out_tag (struct vty *vty, struct prefix *p,
5726 struct bgp_info *binfo, int display, safi_t safi)
5727{
5728 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005729 u_int32_t label = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00005730
5731 if (!binfo->extra)
5732 return;
5733
paulb40d9392005-08-22 22:34:41 +00005734 /* short status lead text */
5735 route_vty_short_status_out (vty, binfo);
5736
paul718e3742002-12-13 20:15:29 +00005737 /* print prefix and mask */
5738 if (! display)
5739 route_vty_out_route (p, vty);
5740 else
5741 vty_out (vty, "%*s", 17, " ");
5742
5743 /* Print attribute */
5744 attr = binfo->attr;
5745 if (attr)
5746 {
5747 if (p->family == AF_INET)
5748 {
5749 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005750 vty_out (vty, "%-16s",
5751 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005752 else
5753 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5754 }
5755#ifdef HAVE_IPV6
5756 else if (p->family == AF_INET6)
5757 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005758 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005759 char buf[BUFSIZ];
5760 char buf1[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005761 if (attr->extra->mp_nexthop_len == 16)
paul718e3742002-12-13 20:15:29 +00005762 vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005763 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5764 buf, BUFSIZ));
5765 else if (attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005766 vty_out (vty, "%s(%s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005767 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5768 buf, BUFSIZ),
5769 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5770 buf1, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005771
5772 }
5773#endif /* HAVE_IPV6 */
5774 }
5775
Paul Jakmafb982c22007-05-04 20:15:47 +00005776 label = decode_label (binfo->extra->tag);
paul718e3742002-12-13 20:15:29 +00005777
5778 vty_out (vty, "notag/%d", label);
5779
5780 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005781}
5782
5783/* dampening route */
ajs5a646652004-11-05 01:25:55 +00005784static void
paul718e3742002-12-13 20:15:29 +00005785damp_route_vty_out (struct vty *vty, struct prefix *p,
5786 struct bgp_info *binfo, int display, safi_t safi)
5787{
5788 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005789 int len;
Chris Caputo50aef6f2009-06-23 06:06:49 +00005790 char timebuf[BGP_UPTIME_LEN];
paul718e3742002-12-13 20:15:29 +00005791
paulb40d9392005-08-22 22:34:41 +00005792 /* short status lead text */
5793 route_vty_short_status_out (vty, binfo);
5794
paul718e3742002-12-13 20:15:29 +00005795 /* print prefix and mask */
5796 if (! display)
5797 route_vty_out_route (p, vty);
5798 else
5799 vty_out (vty, "%*s", 17, " ");
5800
5801 len = vty_out (vty, "%s", binfo->peer->host);
5802 len = 17 - len;
5803 if (len < 1)
5804 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5805 else
5806 vty_out (vty, "%*s", len, " ");
5807
Chris Caputo50aef6f2009-06-23 06:06:49 +00005808 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005809
5810 /* Print attribute */
5811 attr = binfo->attr;
5812 if (attr)
5813 {
5814 /* Print aspath */
5815 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005816 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005817
5818 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005819 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005820 }
5821 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005822}
5823
paul718e3742002-12-13 20:15:29 +00005824/* flap route */
ajs5a646652004-11-05 01:25:55 +00005825static void
paul718e3742002-12-13 20:15:29 +00005826flap_route_vty_out (struct vty *vty, struct prefix *p,
5827 struct bgp_info *binfo, int display, safi_t safi)
5828{
5829 struct attr *attr;
5830 struct bgp_damp_info *bdi;
paul718e3742002-12-13 20:15:29 +00005831 char timebuf[BGP_UPTIME_LEN];
5832 int len;
Paul Jakmafb982c22007-05-04 20:15:47 +00005833
5834 if (!binfo->extra)
5835 return;
5836
5837 bdi = binfo->extra->damp_info;
paul718e3742002-12-13 20:15:29 +00005838
paulb40d9392005-08-22 22:34:41 +00005839 /* short status lead text */
5840 route_vty_short_status_out (vty, binfo);
5841
paul718e3742002-12-13 20:15:29 +00005842 /* print prefix and mask */
5843 if (! display)
5844 route_vty_out_route (p, vty);
5845 else
5846 vty_out (vty, "%*s", 17, " ");
5847
5848 len = vty_out (vty, "%s", binfo->peer->host);
5849 len = 16 - len;
5850 if (len < 1)
5851 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5852 else
5853 vty_out (vty, "%*s", len, " ");
5854
5855 len = vty_out (vty, "%d", bdi->flap);
5856 len = 5 - len;
5857 if (len < 1)
5858 vty_out (vty, " ");
5859 else
5860 vty_out (vty, "%*s ", len, " ");
5861
5862 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5863 timebuf, BGP_UPTIME_LEN));
5864
5865 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5866 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
Chris Caputo50aef6f2009-06-23 06:06:49 +00005867 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005868 else
5869 vty_out (vty, "%*s ", 8, " ");
5870
5871 /* Print attribute */
5872 attr = binfo->attr;
5873 if (attr)
5874 {
5875 /* Print aspath */
5876 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005877 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005878
5879 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005880 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005881 }
5882 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005883}
5884
paul94f2b392005-06-28 12:44:16 +00005885static void
paul718e3742002-12-13 20:15:29 +00005886route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5887 struct bgp_info *binfo, afi_t afi, safi_t safi)
5888{
5889 char buf[INET6_ADDRSTRLEN];
5890 char buf1[BUFSIZ];
5891 struct attr *attr;
5892 int sockunion_vty_out (struct vty *, union sockunion *);
John Kemp30b00172011-03-18 17:52:18 +03005893#ifdef HAVE_CLOCK_MONOTONIC
5894 time_t tbuf;
5895#endif
paul718e3742002-12-13 20:15:29 +00005896
5897 attr = binfo->attr;
5898
5899 if (attr)
5900 {
5901 /* Line1 display AS-path, Aggregator */
5902 if (attr->aspath)
5903 {
5904 vty_out (vty, " ");
paulfe69a502005-09-10 16:55:02 +00005905 if (aspath_count_hops (attr->aspath) == 0)
paul718e3742002-12-13 20:15:29 +00005906 vty_out (vty, "Local");
5907 else
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005908 aspath_print_vty (vty, "%s", attr->aspath, "");
paul718e3742002-12-13 20:15:29 +00005909 }
5910
paulb40d9392005-08-22 22:34:41 +00005911 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5912 vty_out (vty, ", (removed)");
hasso93406d82005-02-02 14:40:33 +00005913 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5914 vty_out (vty, ", (stale)");
5915 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04005916 vty_out (vty, ", (aggregated by %u %s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005917 attr->extra->aggregator_as,
5918 inet_ntoa (attr->extra->aggregator_addr));
hasso93406d82005-02-02 14:40:33 +00005919 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5920 vty_out (vty, ", (Received from a RR-client)");
5921 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5922 vty_out (vty, ", (Received from a RS-client)");
5923 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5924 vty_out (vty, ", (history entry)");
5925 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5926 vty_out (vty, ", (suppressed due to dampening)");
paul718e3742002-12-13 20:15:29 +00005927 vty_out (vty, "%s", VTY_NEWLINE);
5928
5929 /* Line2 display Next-hop, Neighbor, Router-id */
5930 if (p->family == AF_INET)
5931 {
5932 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
Paul Jakmafb982c22007-05-04 20:15:47 +00005933 inet_ntoa (attr->extra->mp_nexthop_global_in) :
paul718e3742002-12-13 20:15:29 +00005934 inet_ntoa (attr->nexthop));
5935 }
5936#ifdef HAVE_IPV6
5937 else
5938 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005939 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005940 vty_out (vty, " %s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005941 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
paul718e3742002-12-13 20:15:29 +00005942 buf, INET6_ADDRSTRLEN));
5943 }
5944#endif /* HAVE_IPV6 */
5945
5946 if (binfo->peer == bgp->peer_self)
5947 {
5948 vty_out (vty, " from %s ",
5949 p->family == AF_INET ? "0.0.0.0" : "::");
5950 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5951 }
5952 else
5953 {
5954 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5955 vty_out (vty, " (inaccessible)");
Paul Jakmafb982c22007-05-04 20:15:47 +00005956 else if (binfo->extra && binfo->extra->igpmetric)
5957 vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
pauleb821182004-05-01 08:44:08 +00005958 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
paul718e3742002-12-13 20:15:29 +00005959 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005960 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005961 else
5962 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
5963 }
5964 vty_out (vty, "%s", VTY_NEWLINE);
5965
5966#ifdef HAVE_IPV6
5967 /* display nexthop local */
Paul Jakmafb982c22007-05-04 20:15:47 +00005968 if (attr->extra && attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005969 {
5970 vty_out (vty, " (%s)%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005971 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
paul718e3742002-12-13 20:15:29 +00005972 buf, INET6_ADDRSTRLEN),
5973 VTY_NEWLINE);
5974 }
5975#endif /* HAVE_IPV6 */
5976
5977 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
5978 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
5979
5980 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005981 vty_out (vty, ", metric %u", attr->med);
paul718e3742002-12-13 20:15:29 +00005982
5983 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005984 vty_out (vty, ", localpref %u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005985 else
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005986 vty_out (vty, ", localpref %u", bgp->default_local_pref);
paul718e3742002-12-13 20:15:29 +00005987
Paul Jakmafb982c22007-05-04 20:15:47 +00005988 if (attr->extra && attr->extra->weight != 0)
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005989 vty_out (vty, ", weight %u", attr->extra->weight);
paul718e3742002-12-13 20:15:29 +00005990
5991 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5992 vty_out (vty, ", valid");
5993
5994 if (binfo->peer != bgp->peer_self)
5995 {
5996 if (binfo->peer->as == binfo->peer->local_as)
5997 vty_out (vty, ", internal");
5998 else
5999 vty_out (vty, ", %s",
6000 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
6001 }
6002 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
6003 vty_out (vty, ", aggregated, local");
6004 else if (binfo->type != ZEBRA_ROUTE_BGP)
6005 vty_out (vty, ", sourced");
6006 else
6007 vty_out (vty, ", sourced, local");
6008
6009 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
6010 vty_out (vty, ", atomic-aggregate");
6011
Josh Baileyde8d5df2011-07-20 20:46:01 -07006012 if (CHECK_FLAG (binfo->flags, BGP_INFO_MULTIPATH) ||
6013 (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED) &&
6014 bgp_info_mpath_count (binfo)))
6015 vty_out (vty, ", multipath");
6016
paul718e3742002-12-13 20:15:29 +00006017 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
6018 vty_out (vty, ", best");
6019
6020 vty_out (vty, "%s", VTY_NEWLINE);
6021
6022 /* Line 4 display Community */
6023 if (attr->community)
6024 vty_out (vty, " Community: %s%s", attr->community->str,
6025 VTY_NEWLINE);
6026
6027 /* Line 5 display Extended-community */
6028 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
Paul Jakmafb982c22007-05-04 20:15:47 +00006029 vty_out (vty, " Extended Community: %s%s",
6030 attr->extra->ecommunity->str, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006031
6032 /* Line 6 display Originator, Cluster-id */
6033 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
6034 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
6035 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006036 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00006037 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00006038 vty_out (vty, " Originator: %s",
6039 inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00006040
6041 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
6042 {
6043 int i;
6044 vty_out (vty, ", Cluster list: ");
Paul Jakmafb982c22007-05-04 20:15:47 +00006045 for (i = 0; i < attr->extra->cluster->length / 4; i++)
6046 vty_out (vty, "%s ",
6047 inet_ntoa (attr->extra->cluster->list[i]));
paul718e3742002-12-13 20:15:29 +00006048 }
6049 vty_out (vty, "%s", VTY_NEWLINE);
6050 }
Paul Jakma41367172007-08-06 15:24:51 +00006051
Paul Jakmafb982c22007-05-04 20:15:47 +00006052 if (binfo->extra && binfo->extra->damp_info)
paul718e3742002-12-13 20:15:29 +00006053 bgp_damp_info_vty (vty, binfo);
6054
6055 /* Line 7 display Uptime */
John Kemp30b00172011-03-18 17:52:18 +03006056#ifdef HAVE_CLOCK_MONOTONIC
6057 tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
Vladimir L Ivanov213b6cd2010-10-21 14:59:54 +04006058 vty_out (vty, " Last update: %s", ctime(&tbuf));
John Kemp30b00172011-03-18 17:52:18 +03006059#else
6060 vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
6061#endif /* HAVE_CLOCK_MONOTONIC */
paul718e3742002-12-13 20:15:29 +00006062 }
6063 vty_out (vty, "%s", VTY_NEWLINE);
6064}
6065
paulb40d9392005-08-22 22:34:41 +00006066#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 +00006067#define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
paul718e3742002-12-13 20:15:29 +00006068#define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
6069#define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
6070#define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
6071
6072enum bgp_show_type
6073{
6074 bgp_show_type_normal,
6075 bgp_show_type_regexp,
6076 bgp_show_type_prefix_list,
6077 bgp_show_type_filter_list,
6078 bgp_show_type_route_map,
6079 bgp_show_type_neighbor,
6080 bgp_show_type_cidr_only,
6081 bgp_show_type_prefix_longer,
6082 bgp_show_type_community_all,
6083 bgp_show_type_community,
6084 bgp_show_type_community_exact,
6085 bgp_show_type_community_list,
6086 bgp_show_type_community_list_exact,
6087 bgp_show_type_flap_statistics,
6088 bgp_show_type_flap_address,
6089 bgp_show_type_flap_prefix,
6090 bgp_show_type_flap_cidr_only,
6091 bgp_show_type_flap_regexp,
6092 bgp_show_type_flap_filter_list,
6093 bgp_show_type_flap_prefix_list,
6094 bgp_show_type_flap_prefix_longer,
6095 bgp_show_type_flap_route_map,
6096 bgp_show_type_flap_neighbor,
6097 bgp_show_type_dampend_paths,
6098 bgp_show_type_damp_neighbor
6099};
6100
ajs5a646652004-11-05 01:25:55 +00006101static int
paulfee0f4c2004-09-13 05:12:46 +00006102bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
ajs5a646652004-11-05 01:25:55 +00006103 enum bgp_show_type type, void *output_arg)
paul718e3742002-12-13 20:15:29 +00006104{
paul718e3742002-12-13 20:15:29 +00006105 struct bgp_info *ri;
6106 struct bgp_node *rn;
paul718e3742002-12-13 20:15:29 +00006107 int header = 1;
paul718e3742002-12-13 20:15:29 +00006108 int display;
ajs5a646652004-11-05 01:25:55 +00006109 unsigned long output_count;
paul718e3742002-12-13 20:15:29 +00006110
6111 /* This is first entry point, so reset total line. */
ajs5a646652004-11-05 01:25:55 +00006112 output_count = 0;
paul718e3742002-12-13 20:15:29 +00006113
paul718e3742002-12-13 20:15:29 +00006114 /* Start processing of routes. */
6115 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6116 if (rn->info != NULL)
6117 {
6118 display = 0;
6119
6120 for (ri = rn->info; ri; ri = ri->next)
6121 {
ajs5a646652004-11-05 01:25:55 +00006122 if (type == bgp_show_type_flap_statistics
paul718e3742002-12-13 20:15:29 +00006123 || type == bgp_show_type_flap_address
6124 || type == bgp_show_type_flap_prefix
6125 || type == bgp_show_type_flap_cidr_only
6126 || type == bgp_show_type_flap_regexp
6127 || type == bgp_show_type_flap_filter_list
6128 || type == bgp_show_type_flap_prefix_list
6129 || type == bgp_show_type_flap_prefix_longer
6130 || type == bgp_show_type_flap_route_map
6131 || type == bgp_show_type_flap_neighbor
6132 || type == bgp_show_type_dampend_paths
6133 || type == bgp_show_type_damp_neighbor)
6134 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006135 if (!(ri->extra && ri->extra->damp_info))
paul718e3742002-12-13 20:15:29 +00006136 continue;
6137 }
6138 if (type == bgp_show_type_regexp
6139 || type == bgp_show_type_flap_regexp)
6140 {
ajs5a646652004-11-05 01:25:55 +00006141 regex_t *regex = output_arg;
paul718e3742002-12-13 20:15:29 +00006142
6143 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6144 continue;
6145 }
6146 if (type == bgp_show_type_prefix_list
6147 || type == bgp_show_type_flap_prefix_list)
6148 {
ajs5a646652004-11-05 01:25:55 +00006149 struct prefix_list *plist = output_arg;
paul718e3742002-12-13 20:15:29 +00006150
6151 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6152 continue;
6153 }
6154 if (type == bgp_show_type_filter_list
6155 || type == bgp_show_type_flap_filter_list)
6156 {
ajs5a646652004-11-05 01:25:55 +00006157 struct as_list *as_list = output_arg;
paul718e3742002-12-13 20:15:29 +00006158
6159 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6160 continue;
6161 }
6162 if (type == bgp_show_type_route_map
6163 || type == bgp_show_type_flap_route_map)
6164 {
ajs5a646652004-11-05 01:25:55 +00006165 struct route_map *rmap = output_arg;
paul718e3742002-12-13 20:15:29 +00006166 struct bgp_info binfo;
Paul Jakma9eda90c2007-08-30 13:36:17 +00006167 struct attr dummy_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00006168 int ret;
6169
Paul Jakmafb982c22007-05-04 20:15:47 +00006170 bgp_attr_dup (&dummy_attr, ri->attr);
paul718e3742002-12-13 20:15:29 +00006171 binfo.peer = ri->peer;
6172 binfo.attr = &dummy_attr;
6173
6174 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
Paul Jakmafb982c22007-05-04 20:15:47 +00006175
6176 bgp_attr_extra_free (&dummy_attr);
6177
paul718e3742002-12-13 20:15:29 +00006178 if (ret == RMAP_DENYMATCH)
6179 continue;
6180 }
6181 if (type == bgp_show_type_neighbor
6182 || type == bgp_show_type_flap_neighbor
6183 || type == bgp_show_type_damp_neighbor)
6184 {
ajs5a646652004-11-05 01:25:55 +00006185 union sockunion *su = output_arg;
paul718e3742002-12-13 20:15:29 +00006186
6187 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6188 continue;
6189 }
6190 if (type == bgp_show_type_cidr_only
6191 || type == bgp_show_type_flap_cidr_only)
6192 {
6193 u_int32_t destination;
6194
6195 destination = ntohl (rn->p.u.prefix4.s_addr);
6196 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6197 continue;
6198 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6199 continue;
6200 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6201 continue;
6202 }
6203 if (type == bgp_show_type_prefix_longer
6204 || type == bgp_show_type_flap_prefix_longer)
6205 {
ajs5a646652004-11-05 01:25:55 +00006206 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006207
6208 if (! prefix_match (p, &rn->p))
6209 continue;
6210 }
6211 if (type == bgp_show_type_community_all)
6212 {
6213 if (! ri->attr->community)
6214 continue;
6215 }
6216 if (type == bgp_show_type_community)
6217 {
ajs5a646652004-11-05 01:25:55 +00006218 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006219
6220 if (! ri->attr->community ||
6221 ! community_match (ri->attr->community, com))
6222 continue;
6223 }
6224 if (type == bgp_show_type_community_exact)
6225 {
ajs5a646652004-11-05 01:25:55 +00006226 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006227
6228 if (! ri->attr->community ||
6229 ! community_cmp (ri->attr->community, com))
6230 continue;
6231 }
6232 if (type == bgp_show_type_community_list)
6233 {
ajs5a646652004-11-05 01:25:55 +00006234 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006235
6236 if (! community_list_match (ri->attr->community, list))
6237 continue;
6238 }
6239 if (type == bgp_show_type_community_list_exact)
6240 {
ajs5a646652004-11-05 01:25:55 +00006241 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006242
6243 if (! community_list_exact_match (ri->attr->community, list))
6244 continue;
6245 }
6246 if (type == bgp_show_type_flap_address
6247 || type == bgp_show_type_flap_prefix)
6248 {
ajs5a646652004-11-05 01:25:55 +00006249 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006250
6251 if (! prefix_match (&rn->p, p))
6252 continue;
6253
6254 if (type == bgp_show_type_flap_prefix)
6255 if (p->prefixlen != rn->p.prefixlen)
6256 continue;
6257 }
6258 if (type == bgp_show_type_dampend_paths
6259 || type == bgp_show_type_damp_neighbor)
6260 {
6261 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6262 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6263 continue;
6264 }
6265
6266 if (header)
6267 {
hasso93406d82005-02-02 14:40:33 +00006268 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6269 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6270 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006271 if (type == bgp_show_type_dampend_paths
6272 || type == bgp_show_type_damp_neighbor)
6273 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6274 else if (type == bgp_show_type_flap_statistics
6275 || type == bgp_show_type_flap_address
6276 || type == bgp_show_type_flap_prefix
6277 || type == bgp_show_type_flap_cidr_only
6278 || type == bgp_show_type_flap_regexp
6279 || type == bgp_show_type_flap_filter_list
6280 || type == bgp_show_type_flap_prefix_list
6281 || type == bgp_show_type_flap_prefix_longer
6282 || type == bgp_show_type_flap_route_map
6283 || type == bgp_show_type_flap_neighbor)
6284 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6285 else
6286 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006287 header = 0;
6288 }
6289
6290 if (type == bgp_show_type_dampend_paths
6291 || type == bgp_show_type_damp_neighbor)
ajs5a646652004-11-05 01:25:55 +00006292 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006293 else if (type == bgp_show_type_flap_statistics
6294 || type == bgp_show_type_flap_address
6295 || type == bgp_show_type_flap_prefix
6296 || type == bgp_show_type_flap_cidr_only
6297 || type == bgp_show_type_flap_regexp
6298 || type == bgp_show_type_flap_filter_list
6299 || type == bgp_show_type_flap_prefix_list
6300 || type == bgp_show_type_flap_prefix_longer
6301 || type == bgp_show_type_flap_route_map
6302 || type == bgp_show_type_flap_neighbor)
ajs5a646652004-11-05 01:25:55 +00006303 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006304 else
ajs5a646652004-11-05 01:25:55 +00006305 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006306 display++;
6307 }
6308 if (display)
ajs5a646652004-11-05 01:25:55 +00006309 output_count++;
paul718e3742002-12-13 20:15:29 +00006310 }
6311
6312 /* No route is displayed */
ajs5a646652004-11-05 01:25:55 +00006313 if (output_count == 0)
paul718e3742002-12-13 20:15:29 +00006314 {
6315 if (type == bgp_show_type_normal)
6316 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6317 }
6318 else
6319 vty_out (vty, "%sTotal number of prefixes %ld%s",
ajs5a646652004-11-05 01:25:55 +00006320 VTY_NEWLINE, output_count, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006321
6322 return CMD_SUCCESS;
6323}
6324
ajs5a646652004-11-05 01:25:55 +00006325static int
paulfee0f4c2004-09-13 05:12:46 +00006326bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
ajs5a646652004-11-05 01:25:55 +00006327 enum bgp_show_type type, void *output_arg)
paulfee0f4c2004-09-13 05:12:46 +00006328{
6329 struct bgp_table *table;
6330
6331 if (bgp == NULL) {
6332 bgp = bgp_get_default ();
6333 }
6334
6335 if (bgp == NULL)
6336 {
6337 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6338 return CMD_WARNING;
6339 }
6340
6341
6342 table = bgp->rib[afi][safi];
6343
ajs5a646652004-11-05 01:25:55 +00006344 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
paulfee0f4c2004-09-13 05:12:46 +00006345}
6346
paul718e3742002-12-13 20:15:29 +00006347/* Header of detailed BGP route information */
paul94f2b392005-06-28 12:44:16 +00006348static void
paul718e3742002-12-13 20:15:29 +00006349route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6350 struct bgp_node *rn,
6351 struct prefix_rd *prd, afi_t afi, safi_t safi)
6352{
6353 struct bgp_info *ri;
6354 struct prefix *p;
6355 struct peer *peer;
paul1eb8ef22005-04-07 07:30:20 +00006356 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00006357 char buf1[INET6_ADDRSTRLEN];
6358 char buf2[INET6_ADDRSTRLEN];
6359 int count = 0;
6360 int best = 0;
6361 int suppress = 0;
6362 int no_export = 0;
6363 int no_advertise = 0;
6364 int local_as = 0;
6365 int first = 0;
6366
6367 p = &rn->p;
6368 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6369 (safi == SAFI_MPLS_VPN ?
6370 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6371 safi == SAFI_MPLS_VPN ? ":" : "",
6372 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6373 p->prefixlen, VTY_NEWLINE);
6374
6375 for (ri = rn->info; ri; ri = ri->next)
6376 {
6377 count++;
6378 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6379 {
6380 best = count;
Paul Jakmafb982c22007-05-04 20:15:47 +00006381 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00006382 suppress = 1;
6383 if (ri->attr->community != NULL)
6384 {
6385 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6386 no_advertise = 1;
6387 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6388 no_export = 1;
6389 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6390 local_as = 1;
6391 }
6392 }
6393 }
6394
6395 vty_out (vty, "Paths: (%d available", count);
6396 if (best)
6397 {
6398 vty_out (vty, ", best #%d", best);
6399 if (safi == SAFI_UNICAST)
6400 vty_out (vty, ", table Default-IP-Routing-Table");
6401 }
6402 else
6403 vty_out (vty, ", no best path");
6404 if (no_advertise)
6405 vty_out (vty, ", not advertised to any peer");
6406 else if (no_export)
6407 vty_out (vty, ", not advertised to EBGP peer");
6408 else if (local_as)
6409 vty_out (vty, ", not advertised outside local AS");
6410 if (suppress)
6411 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6412 vty_out (vty, ")%s", VTY_NEWLINE);
6413
6414 /* advertised peer */
paul1eb8ef22005-04-07 07:30:20 +00006415 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00006416 {
6417 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6418 {
6419 if (! first)
6420 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6421 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6422 first = 1;
6423 }
6424 }
6425 if (! first)
6426 vty_out (vty, " Not advertised to any peer");
6427 vty_out (vty, "%s", VTY_NEWLINE);
6428}
6429
6430/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +00006431static int
paulfee0f4c2004-09-13 05:12:46 +00006432bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
paulfd79ac92004-10-13 05:06:08 +00006433 struct bgp_table *rib, const char *ip_str,
6434 afi_t afi, safi_t safi, struct prefix_rd *prd,
6435 int prefix_check)
paul718e3742002-12-13 20:15:29 +00006436{
6437 int ret;
6438 int header;
6439 int display = 0;
6440 struct prefix match;
6441 struct bgp_node *rn;
6442 struct bgp_node *rm;
6443 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00006444 struct bgp_table *table;
6445
paul718e3742002-12-13 20:15:29 +00006446 /* Check IP address argument. */
6447 ret = str2prefix (ip_str, &match);
6448 if (! ret)
6449 {
6450 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6451 return CMD_WARNING;
6452 }
6453
6454 match.family = afi2family (afi);
6455
6456 if (safi == SAFI_MPLS_VPN)
6457 {
paulfee0f4c2004-09-13 05:12:46 +00006458 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
paul718e3742002-12-13 20:15:29 +00006459 {
6460 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6461 continue;
6462
6463 if ((table = rn->info) != NULL)
6464 {
6465 header = 1;
6466
6467 if ((rm = bgp_node_match (table, &match)) != NULL)
6468 {
6469 if (prefix_check && rm->p.prefixlen != match.prefixlen)
Chris Caputo6c88b442010-07-27 16:28:55 +00006470 {
6471 bgp_unlock_node (rm);
6472 continue;
6473 }
paul718e3742002-12-13 20:15:29 +00006474
6475 for (ri = rm->info; ri; ri = ri->next)
6476 {
6477 if (header)
6478 {
6479 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6480 AFI_IP, SAFI_MPLS_VPN);
6481
6482 header = 0;
6483 }
6484 display++;
6485 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6486 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006487
6488 bgp_unlock_node (rm);
paul718e3742002-12-13 20:15:29 +00006489 }
6490 }
6491 }
6492 }
6493 else
6494 {
6495 header = 1;
6496
paulfee0f4c2004-09-13 05:12:46 +00006497 if ((rn = bgp_node_match (rib, &match)) != NULL)
paul718e3742002-12-13 20:15:29 +00006498 {
6499 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6500 {
6501 for (ri = rn->info; ri; ri = ri->next)
6502 {
6503 if (header)
6504 {
6505 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6506 header = 0;
6507 }
6508 display++;
6509 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6510 }
6511 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006512
6513 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00006514 }
6515 }
6516
6517 if (! display)
6518 {
6519 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6520 return CMD_WARNING;
6521 }
6522
6523 return CMD_SUCCESS;
6524}
6525
paulfee0f4c2004-09-13 05:12:46 +00006526/* Display specified route of Main RIB */
paul94f2b392005-06-28 12:44:16 +00006527static int
paulfd79ac92004-10-13 05:06:08 +00006528bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
paulfee0f4c2004-09-13 05:12:46 +00006529 afi_t afi, safi_t safi, struct prefix_rd *prd,
6530 int prefix_check)
6531{
6532 struct bgp *bgp;
6533
6534 /* BGP structure lookup. */
6535 if (view_name)
6536 {
6537 bgp = bgp_lookup_by_name (view_name);
6538 if (bgp == NULL)
6539 {
6540 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6541 return CMD_WARNING;
6542 }
6543 }
6544 else
6545 {
6546 bgp = bgp_get_default ();
6547 if (bgp == NULL)
6548 {
6549 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6550 return CMD_WARNING;
6551 }
6552 }
6553
6554 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6555 afi, safi, prd, prefix_check);
6556}
6557
paul718e3742002-12-13 20:15:29 +00006558/* BGP route print out function. */
6559DEFUN (show_ip_bgp,
6560 show_ip_bgp_cmd,
6561 "show ip bgp",
6562 SHOW_STR
6563 IP_STR
6564 BGP_STR)
6565{
ajs5a646652004-11-05 01:25:55 +00006566 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006567}
6568
6569DEFUN (show_ip_bgp_ipv4,
6570 show_ip_bgp_ipv4_cmd,
6571 "show ip bgp ipv4 (unicast|multicast)",
6572 SHOW_STR
6573 IP_STR
6574 BGP_STR
6575 "Address family\n"
6576 "Address Family modifier\n"
6577 "Address Family modifier\n")
6578{
6579 if (strncmp (argv[0], "m", 1) == 0)
ajs5a646652004-11-05 01:25:55 +00006580 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6581 NULL);
paul718e3742002-12-13 20:15:29 +00006582
ajs5a646652004-11-05 01:25:55 +00006583 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006584}
6585
Michael Lambert95cbbd22010-07-23 14:43:04 -04006586ALIAS (show_ip_bgp_ipv4,
6587 show_bgp_ipv4_safi_cmd,
6588 "show bgp ipv4 (unicast|multicast)",
6589 SHOW_STR
6590 BGP_STR
6591 "Address family\n"
6592 "Address Family modifier\n"
6593 "Address Family modifier\n")
6594
paul718e3742002-12-13 20:15:29 +00006595DEFUN (show_ip_bgp_route,
6596 show_ip_bgp_route_cmd,
6597 "show ip bgp A.B.C.D",
6598 SHOW_STR
6599 IP_STR
6600 BGP_STR
6601 "Network in the BGP routing table to display\n")
6602{
6603 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6604}
6605
6606DEFUN (show_ip_bgp_ipv4_route,
6607 show_ip_bgp_ipv4_route_cmd,
6608 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6609 SHOW_STR
6610 IP_STR
6611 BGP_STR
6612 "Address family\n"
6613 "Address Family modifier\n"
6614 "Address Family modifier\n"
6615 "Network in the BGP routing table to display\n")
6616{
6617 if (strncmp (argv[0], "m", 1) == 0)
6618 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6619
6620 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6621}
6622
Michael Lambert95cbbd22010-07-23 14:43:04 -04006623ALIAS (show_ip_bgp_ipv4_route,
6624 show_bgp_ipv4_safi_route_cmd,
6625 "show bgp ipv4 (unicast|multicast) A.B.C.D",
6626 SHOW_STR
6627 BGP_STR
6628 "Address family\n"
6629 "Address Family modifier\n"
6630 "Address Family modifier\n"
6631 "Network in the BGP routing table to display\n")
6632
paul718e3742002-12-13 20:15:29 +00006633DEFUN (show_ip_bgp_vpnv4_all_route,
6634 show_ip_bgp_vpnv4_all_route_cmd,
6635 "show ip bgp vpnv4 all A.B.C.D",
6636 SHOW_STR
6637 IP_STR
6638 BGP_STR
6639 "Display VPNv4 NLRI specific information\n"
6640 "Display information about all VPNv4 NLRIs\n"
6641 "Network in the BGP routing table to display\n")
6642{
6643 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6644}
6645
6646DEFUN (show_ip_bgp_vpnv4_rd_route,
6647 show_ip_bgp_vpnv4_rd_route_cmd,
6648 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6649 SHOW_STR
6650 IP_STR
6651 BGP_STR
6652 "Display VPNv4 NLRI specific information\n"
6653 "Display information for a route distinguisher\n"
6654 "VPN Route Distinguisher\n"
6655 "Network in the BGP routing table to display\n")
6656{
6657 int ret;
6658 struct prefix_rd prd;
6659
6660 ret = str2prefix_rd (argv[0], &prd);
6661 if (! ret)
6662 {
6663 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6664 return CMD_WARNING;
6665 }
6666 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6667}
6668
6669DEFUN (show_ip_bgp_prefix,
6670 show_ip_bgp_prefix_cmd,
6671 "show ip bgp A.B.C.D/M",
6672 SHOW_STR
6673 IP_STR
6674 BGP_STR
6675 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6676{
6677 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6678}
6679
6680DEFUN (show_ip_bgp_ipv4_prefix,
6681 show_ip_bgp_ipv4_prefix_cmd,
6682 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6683 SHOW_STR
6684 IP_STR
6685 BGP_STR
6686 "Address family\n"
6687 "Address Family modifier\n"
6688 "Address Family modifier\n"
6689 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6690{
6691 if (strncmp (argv[0], "m", 1) == 0)
6692 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6693
6694 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6695}
6696
Michael Lambert95cbbd22010-07-23 14:43:04 -04006697ALIAS (show_ip_bgp_ipv4_prefix,
6698 show_bgp_ipv4_safi_prefix_cmd,
6699 "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
6700 SHOW_STR
6701 BGP_STR
6702 "Address family\n"
6703 "Address Family modifier\n"
6704 "Address Family modifier\n"
6705 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6706
paul718e3742002-12-13 20:15:29 +00006707DEFUN (show_ip_bgp_vpnv4_all_prefix,
6708 show_ip_bgp_vpnv4_all_prefix_cmd,
6709 "show ip bgp vpnv4 all A.B.C.D/M",
6710 SHOW_STR
6711 IP_STR
6712 BGP_STR
6713 "Display VPNv4 NLRI specific information\n"
6714 "Display information about all VPNv4 NLRIs\n"
6715 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6716{
6717 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6718}
6719
6720DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6721 show_ip_bgp_vpnv4_rd_prefix_cmd,
6722 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6723 SHOW_STR
6724 IP_STR
6725 BGP_STR
6726 "Display VPNv4 NLRI specific information\n"
6727 "Display information for a route distinguisher\n"
6728 "VPN Route Distinguisher\n"
6729 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6730{
6731 int ret;
6732 struct prefix_rd prd;
6733
6734 ret = str2prefix_rd (argv[0], &prd);
6735 if (! ret)
6736 {
6737 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6738 return CMD_WARNING;
6739 }
6740 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6741}
6742
6743DEFUN (show_ip_bgp_view,
6744 show_ip_bgp_view_cmd,
6745 "show ip bgp view WORD",
6746 SHOW_STR
6747 IP_STR
6748 BGP_STR
6749 "BGP view\n"
6750 "BGP view name\n")
6751{
paulbb46e942003-10-24 19:02:03 +00006752 struct bgp *bgp;
6753
6754 /* BGP structure lookup. */
6755 bgp = bgp_lookup_by_name (argv[0]);
6756 if (bgp == NULL)
6757 {
6758 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6759 return CMD_WARNING;
6760 }
6761
ajs5a646652004-11-05 01:25:55 +00006762 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006763}
6764
6765DEFUN (show_ip_bgp_view_route,
6766 show_ip_bgp_view_route_cmd,
6767 "show ip bgp view WORD A.B.C.D",
6768 SHOW_STR
6769 IP_STR
6770 BGP_STR
6771 "BGP view\n"
6772 "BGP view name\n"
6773 "Network in the BGP routing table to display\n")
6774{
6775 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6776}
6777
6778DEFUN (show_ip_bgp_view_prefix,
6779 show_ip_bgp_view_prefix_cmd,
6780 "show ip bgp view WORD A.B.C.D/M",
6781 SHOW_STR
6782 IP_STR
6783 BGP_STR
6784 "BGP view\n"
6785 "BGP view name\n"
6786 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6787{
6788 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6789}
6790
6791#ifdef HAVE_IPV6
6792DEFUN (show_bgp,
6793 show_bgp_cmd,
6794 "show bgp",
6795 SHOW_STR
6796 BGP_STR)
6797{
ajs5a646652004-11-05 01:25:55 +00006798 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6799 NULL);
paul718e3742002-12-13 20:15:29 +00006800}
6801
6802ALIAS (show_bgp,
6803 show_bgp_ipv6_cmd,
6804 "show bgp ipv6",
6805 SHOW_STR
6806 BGP_STR
6807 "Address family\n")
6808
Michael Lambert95cbbd22010-07-23 14:43:04 -04006809DEFUN (show_bgp_ipv6_safi,
6810 show_bgp_ipv6_safi_cmd,
6811 "show bgp ipv6 (unicast|multicast)",
6812 SHOW_STR
6813 BGP_STR
6814 "Address family\n"
6815 "Address Family modifier\n"
6816 "Address Family modifier\n")
6817{
6818 if (strncmp (argv[0], "m", 1) == 0)
6819 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6820 NULL);
6821
6822 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6823}
6824
paul718e3742002-12-13 20:15:29 +00006825/* old command */
6826DEFUN (show_ipv6_bgp,
6827 show_ipv6_bgp_cmd,
6828 "show ipv6 bgp",
6829 SHOW_STR
6830 IP_STR
6831 BGP_STR)
6832{
ajs5a646652004-11-05 01:25:55 +00006833 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6834 NULL);
paul718e3742002-12-13 20:15:29 +00006835}
6836
6837DEFUN (show_bgp_route,
6838 show_bgp_route_cmd,
6839 "show bgp X:X::X:X",
6840 SHOW_STR
6841 BGP_STR
6842 "Network in the BGP routing table to display\n")
6843{
6844 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6845}
6846
6847ALIAS (show_bgp_route,
6848 show_bgp_ipv6_route_cmd,
6849 "show bgp ipv6 X:X::X:X",
6850 SHOW_STR
6851 BGP_STR
6852 "Address family\n"
6853 "Network in the BGP routing table to display\n")
6854
Michael Lambert95cbbd22010-07-23 14:43:04 -04006855DEFUN (show_bgp_ipv6_safi_route,
6856 show_bgp_ipv6_safi_route_cmd,
6857 "show bgp ipv6 (unicast|multicast) X:X::X:X",
6858 SHOW_STR
6859 BGP_STR
6860 "Address family\n"
6861 "Address Family modifier\n"
6862 "Address Family modifier\n"
6863 "Network in the BGP routing table to display\n")
6864{
6865 if (strncmp (argv[0], "m", 1) == 0)
6866 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6867
6868 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6869}
6870
paul718e3742002-12-13 20:15:29 +00006871/* old command */
6872DEFUN (show_ipv6_bgp_route,
6873 show_ipv6_bgp_route_cmd,
6874 "show ipv6 bgp X:X::X:X",
6875 SHOW_STR
6876 IP_STR
6877 BGP_STR
6878 "Network in the BGP routing table to display\n")
6879{
6880 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6881}
6882
6883DEFUN (show_bgp_prefix,
6884 show_bgp_prefix_cmd,
6885 "show bgp X:X::X:X/M",
6886 SHOW_STR
6887 BGP_STR
6888 "IPv6 prefix <network>/<length>\n")
6889{
6890 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6891}
6892
6893ALIAS (show_bgp_prefix,
6894 show_bgp_ipv6_prefix_cmd,
6895 "show bgp ipv6 X:X::X:X/M",
6896 SHOW_STR
6897 BGP_STR
6898 "Address family\n"
6899 "IPv6 prefix <network>/<length>\n")
6900
Michael Lambert95cbbd22010-07-23 14:43:04 -04006901DEFUN (show_bgp_ipv6_safi_prefix,
6902 show_bgp_ipv6_safi_prefix_cmd,
6903 "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
6904 SHOW_STR
6905 BGP_STR
6906 "Address family\n"
6907 "Address Family modifier\n"
6908 "Address Family modifier\n"
6909 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6910{
6911 if (strncmp (argv[0], "m", 1) == 0)
6912 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6913
6914 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6915}
6916
paul718e3742002-12-13 20:15:29 +00006917/* old command */
6918DEFUN (show_ipv6_bgp_prefix,
6919 show_ipv6_bgp_prefix_cmd,
6920 "show ipv6 bgp X:X::X:X/M",
6921 SHOW_STR
6922 IP_STR
6923 BGP_STR
6924 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6925{
6926 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6927}
6928
paulbb46e942003-10-24 19:02:03 +00006929DEFUN (show_bgp_view,
6930 show_bgp_view_cmd,
6931 "show bgp view WORD",
6932 SHOW_STR
6933 BGP_STR
6934 "BGP view\n"
6935 "View name\n")
6936{
6937 struct bgp *bgp;
6938
6939 /* BGP structure lookup. */
6940 bgp = bgp_lookup_by_name (argv[0]);
6941 if (bgp == NULL)
6942 {
6943 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6944 return CMD_WARNING;
6945 }
6946
ajs5a646652004-11-05 01:25:55 +00006947 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
paulbb46e942003-10-24 19:02:03 +00006948}
6949
6950ALIAS (show_bgp_view,
6951 show_bgp_view_ipv6_cmd,
6952 "show bgp view WORD ipv6",
6953 SHOW_STR
6954 BGP_STR
6955 "BGP view\n"
6956 "View name\n"
6957 "Address family\n")
6958
6959DEFUN (show_bgp_view_route,
6960 show_bgp_view_route_cmd,
6961 "show bgp view WORD X:X::X:X",
6962 SHOW_STR
6963 BGP_STR
6964 "BGP view\n"
6965 "View name\n"
6966 "Network in the BGP routing table to display\n")
6967{
6968 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6969}
6970
6971ALIAS (show_bgp_view_route,
6972 show_bgp_view_ipv6_route_cmd,
6973 "show bgp view WORD ipv6 X:X::X:X",
6974 SHOW_STR
6975 BGP_STR
6976 "BGP view\n"
6977 "View name\n"
6978 "Address family\n"
6979 "Network in the BGP routing table to display\n")
6980
6981DEFUN (show_bgp_view_prefix,
6982 show_bgp_view_prefix_cmd,
6983 "show bgp view WORD X:X::X:X/M",
6984 SHOW_STR
6985 BGP_STR
6986 "BGP view\n"
6987 "View name\n"
6988 "IPv6 prefix <network>/<length>\n")
6989{
6990 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6991}
6992
6993ALIAS (show_bgp_view_prefix,
6994 show_bgp_view_ipv6_prefix_cmd,
6995 "show bgp view WORD ipv6 X:X::X:X/M",
6996 SHOW_STR
6997 BGP_STR
6998 "BGP view\n"
6999 "View name\n"
7000 "Address family\n"
7001 "IPv6 prefix <network>/<length>\n")
7002
paul718e3742002-12-13 20:15:29 +00007003/* old command */
7004DEFUN (show_ipv6_mbgp,
7005 show_ipv6_mbgp_cmd,
7006 "show ipv6 mbgp",
7007 SHOW_STR
7008 IP_STR
7009 MBGP_STR)
7010{
ajs5a646652004-11-05 01:25:55 +00007011 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
7012 NULL);
paul718e3742002-12-13 20:15:29 +00007013}
7014
7015/* old command */
7016DEFUN (show_ipv6_mbgp_route,
7017 show_ipv6_mbgp_route_cmd,
7018 "show ipv6 mbgp X:X::X:X",
7019 SHOW_STR
7020 IP_STR
7021 MBGP_STR
7022 "Network in the MBGP routing table to display\n")
7023{
7024 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
7025}
7026
7027/* old command */
7028DEFUN (show_ipv6_mbgp_prefix,
7029 show_ipv6_mbgp_prefix_cmd,
7030 "show ipv6 mbgp X:X::X:X/M",
7031 SHOW_STR
7032 IP_STR
7033 MBGP_STR
7034 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7035{
7036 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
7037}
7038#endif
7039
paul718e3742002-12-13 20:15:29 +00007040
paul94f2b392005-06-28 12:44:16 +00007041static int
paulfd79ac92004-10-13 05:06:08 +00007042bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007043 safi_t safi, enum bgp_show_type type)
7044{
7045 int i;
7046 struct buffer *b;
7047 char *regstr;
7048 int first;
7049 regex_t *regex;
ajs5a646652004-11-05 01:25:55 +00007050 int rc;
paul718e3742002-12-13 20:15:29 +00007051
7052 first = 0;
7053 b = buffer_new (1024);
7054 for (i = 0; i < argc; i++)
7055 {
7056 if (first)
7057 buffer_putc (b, ' ');
7058 else
7059 {
7060 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7061 continue;
7062 first = 1;
7063 }
7064
7065 buffer_putstr (b, argv[i]);
7066 }
7067 buffer_putc (b, '\0');
7068
7069 regstr = buffer_getstr (b);
7070 buffer_free (b);
7071
7072 regex = bgp_regcomp (regstr);
ajs3b8b1852005-01-29 18:19:13 +00007073 XFREE(MTYPE_TMP, regstr);
paul718e3742002-12-13 20:15:29 +00007074 if (! regex)
7075 {
7076 vty_out (vty, "Can't compile regexp %s%s", argv[0],
7077 VTY_NEWLINE);
7078 return CMD_WARNING;
7079 }
7080
ajs5a646652004-11-05 01:25:55 +00007081 rc = bgp_show (vty, NULL, afi, safi, type, regex);
7082 bgp_regex_free (regex);
7083 return rc;
paul718e3742002-12-13 20:15:29 +00007084}
7085
7086DEFUN (show_ip_bgp_regexp,
7087 show_ip_bgp_regexp_cmd,
7088 "show ip bgp regexp .LINE",
7089 SHOW_STR
7090 IP_STR
7091 BGP_STR
7092 "Display routes matching the AS path regular expression\n"
7093 "A regular-expression to match the BGP AS paths\n")
7094{
7095 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7096 bgp_show_type_regexp);
7097}
7098
7099DEFUN (show_ip_bgp_flap_regexp,
7100 show_ip_bgp_flap_regexp_cmd,
7101 "show ip bgp flap-statistics regexp .LINE",
7102 SHOW_STR
7103 IP_STR
7104 BGP_STR
7105 "Display flap statistics of routes\n"
7106 "Display routes matching the AS path regular expression\n"
7107 "A regular-expression to match the BGP AS paths\n")
7108{
7109 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7110 bgp_show_type_flap_regexp);
7111}
7112
7113DEFUN (show_ip_bgp_ipv4_regexp,
7114 show_ip_bgp_ipv4_regexp_cmd,
7115 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7116 SHOW_STR
7117 IP_STR
7118 BGP_STR
7119 "Address family\n"
7120 "Address Family modifier\n"
7121 "Address Family modifier\n"
7122 "Display routes matching the AS path regular expression\n"
7123 "A regular-expression to match the BGP AS paths\n")
7124{
7125 if (strncmp (argv[0], "m", 1) == 0)
7126 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7127 bgp_show_type_regexp);
7128
7129 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7130 bgp_show_type_regexp);
7131}
7132
7133#ifdef HAVE_IPV6
7134DEFUN (show_bgp_regexp,
7135 show_bgp_regexp_cmd,
7136 "show bgp regexp .LINE",
7137 SHOW_STR
7138 BGP_STR
7139 "Display routes matching the AS path regular expression\n"
7140 "A regular-expression to match the BGP AS paths\n")
7141{
7142 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7143 bgp_show_type_regexp);
7144}
7145
7146ALIAS (show_bgp_regexp,
7147 show_bgp_ipv6_regexp_cmd,
7148 "show bgp ipv6 regexp .LINE",
7149 SHOW_STR
7150 BGP_STR
7151 "Address family\n"
7152 "Display routes matching the AS path regular expression\n"
7153 "A regular-expression to match the BGP AS paths\n")
7154
7155/* old command */
7156DEFUN (show_ipv6_bgp_regexp,
7157 show_ipv6_bgp_regexp_cmd,
7158 "show ipv6 bgp regexp .LINE",
7159 SHOW_STR
7160 IP_STR
7161 BGP_STR
7162 "Display routes matching the AS path regular expression\n"
7163 "A regular-expression to match the BGP AS paths\n")
7164{
7165 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7166 bgp_show_type_regexp);
7167}
7168
7169/* old command */
7170DEFUN (show_ipv6_mbgp_regexp,
7171 show_ipv6_mbgp_regexp_cmd,
7172 "show ipv6 mbgp regexp .LINE",
7173 SHOW_STR
7174 IP_STR
7175 BGP_STR
7176 "Display routes matching the AS path regular expression\n"
7177 "A regular-expression to match the MBGP AS paths\n")
7178{
7179 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7180 bgp_show_type_regexp);
7181}
7182#endif /* HAVE_IPV6 */
7183
paul94f2b392005-06-28 12:44:16 +00007184static int
paulfd79ac92004-10-13 05:06:08 +00007185bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007186 safi_t safi, enum bgp_show_type type)
7187{
7188 struct prefix_list *plist;
7189
7190 plist = prefix_list_lookup (afi, prefix_list_str);
7191 if (plist == NULL)
7192 {
7193 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7194 prefix_list_str, VTY_NEWLINE);
7195 return CMD_WARNING;
7196 }
7197
ajs5a646652004-11-05 01:25:55 +00007198 return bgp_show (vty, NULL, afi, safi, type, plist);
paul718e3742002-12-13 20:15:29 +00007199}
7200
7201DEFUN (show_ip_bgp_prefix_list,
7202 show_ip_bgp_prefix_list_cmd,
7203 "show ip bgp prefix-list WORD",
7204 SHOW_STR
7205 IP_STR
7206 BGP_STR
7207 "Display routes conforming to the prefix-list\n"
7208 "IP prefix-list name\n")
7209{
7210 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7211 bgp_show_type_prefix_list);
7212}
7213
7214DEFUN (show_ip_bgp_flap_prefix_list,
7215 show_ip_bgp_flap_prefix_list_cmd,
7216 "show ip bgp flap-statistics prefix-list WORD",
7217 SHOW_STR
7218 IP_STR
7219 BGP_STR
7220 "Display flap statistics of routes\n"
7221 "Display routes conforming to the prefix-list\n"
7222 "IP prefix-list name\n")
7223{
7224 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7225 bgp_show_type_flap_prefix_list);
7226}
7227
7228DEFUN (show_ip_bgp_ipv4_prefix_list,
7229 show_ip_bgp_ipv4_prefix_list_cmd,
7230 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7231 SHOW_STR
7232 IP_STR
7233 BGP_STR
7234 "Address family\n"
7235 "Address Family modifier\n"
7236 "Address Family modifier\n"
7237 "Display routes conforming to the prefix-list\n"
7238 "IP prefix-list name\n")
7239{
7240 if (strncmp (argv[0], "m", 1) == 0)
7241 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7242 bgp_show_type_prefix_list);
7243
7244 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7245 bgp_show_type_prefix_list);
7246}
7247
7248#ifdef HAVE_IPV6
7249DEFUN (show_bgp_prefix_list,
7250 show_bgp_prefix_list_cmd,
7251 "show bgp prefix-list WORD",
7252 SHOW_STR
7253 BGP_STR
7254 "Display routes conforming to the prefix-list\n"
7255 "IPv6 prefix-list name\n")
7256{
7257 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7258 bgp_show_type_prefix_list);
7259}
7260
7261ALIAS (show_bgp_prefix_list,
7262 show_bgp_ipv6_prefix_list_cmd,
7263 "show bgp ipv6 prefix-list WORD",
7264 SHOW_STR
7265 BGP_STR
7266 "Address family\n"
7267 "Display routes conforming to the prefix-list\n"
7268 "IPv6 prefix-list name\n")
7269
7270/* old command */
7271DEFUN (show_ipv6_bgp_prefix_list,
7272 show_ipv6_bgp_prefix_list_cmd,
7273 "show ipv6 bgp prefix-list WORD",
7274 SHOW_STR
7275 IPV6_STR
7276 BGP_STR
7277 "Display routes matching the prefix-list\n"
7278 "IPv6 prefix-list name\n")
7279{
7280 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7281 bgp_show_type_prefix_list);
7282}
7283
7284/* old command */
7285DEFUN (show_ipv6_mbgp_prefix_list,
7286 show_ipv6_mbgp_prefix_list_cmd,
7287 "show ipv6 mbgp prefix-list WORD",
7288 SHOW_STR
7289 IPV6_STR
7290 MBGP_STR
7291 "Display routes matching the prefix-list\n"
7292 "IPv6 prefix-list name\n")
7293{
7294 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7295 bgp_show_type_prefix_list);
7296}
7297#endif /* HAVE_IPV6 */
7298
paul94f2b392005-06-28 12:44:16 +00007299static int
paulfd79ac92004-10-13 05:06:08 +00007300bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007301 safi_t safi, enum bgp_show_type type)
7302{
7303 struct as_list *as_list;
7304
7305 as_list = as_list_lookup (filter);
7306 if (as_list == NULL)
7307 {
7308 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7309 return CMD_WARNING;
7310 }
7311
ajs5a646652004-11-05 01:25:55 +00007312 return bgp_show (vty, NULL, afi, safi, type, as_list);
paul718e3742002-12-13 20:15:29 +00007313}
7314
7315DEFUN (show_ip_bgp_filter_list,
7316 show_ip_bgp_filter_list_cmd,
7317 "show ip bgp filter-list WORD",
7318 SHOW_STR
7319 IP_STR
7320 BGP_STR
7321 "Display routes conforming to the filter-list\n"
7322 "Regular expression access list name\n")
7323{
7324 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7325 bgp_show_type_filter_list);
7326}
7327
7328DEFUN (show_ip_bgp_flap_filter_list,
7329 show_ip_bgp_flap_filter_list_cmd,
7330 "show ip bgp flap-statistics filter-list WORD",
7331 SHOW_STR
7332 IP_STR
7333 BGP_STR
7334 "Display flap statistics of routes\n"
7335 "Display routes conforming to the filter-list\n"
7336 "Regular expression access list name\n")
7337{
7338 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7339 bgp_show_type_flap_filter_list);
7340}
7341
7342DEFUN (show_ip_bgp_ipv4_filter_list,
7343 show_ip_bgp_ipv4_filter_list_cmd,
7344 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7345 SHOW_STR
7346 IP_STR
7347 BGP_STR
7348 "Address family\n"
7349 "Address Family modifier\n"
7350 "Address Family modifier\n"
7351 "Display routes conforming to the filter-list\n"
7352 "Regular expression access list name\n")
7353{
7354 if (strncmp (argv[0], "m", 1) == 0)
7355 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7356 bgp_show_type_filter_list);
7357
7358 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7359 bgp_show_type_filter_list);
7360}
7361
7362#ifdef HAVE_IPV6
7363DEFUN (show_bgp_filter_list,
7364 show_bgp_filter_list_cmd,
7365 "show bgp filter-list WORD",
7366 SHOW_STR
7367 BGP_STR
7368 "Display routes conforming to the filter-list\n"
7369 "Regular expression access list name\n")
7370{
7371 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7372 bgp_show_type_filter_list);
7373}
7374
7375ALIAS (show_bgp_filter_list,
7376 show_bgp_ipv6_filter_list_cmd,
7377 "show bgp ipv6 filter-list WORD",
7378 SHOW_STR
7379 BGP_STR
7380 "Address family\n"
7381 "Display routes conforming to the filter-list\n"
7382 "Regular expression access list name\n")
7383
7384/* old command */
7385DEFUN (show_ipv6_bgp_filter_list,
7386 show_ipv6_bgp_filter_list_cmd,
7387 "show ipv6 bgp filter-list WORD",
7388 SHOW_STR
7389 IPV6_STR
7390 BGP_STR
7391 "Display routes conforming to the filter-list\n"
7392 "Regular expression access list name\n")
7393{
7394 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7395 bgp_show_type_filter_list);
7396}
7397
7398/* old command */
7399DEFUN (show_ipv6_mbgp_filter_list,
7400 show_ipv6_mbgp_filter_list_cmd,
7401 "show ipv6 mbgp filter-list WORD",
7402 SHOW_STR
7403 IPV6_STR
7404 MBGP_STR
7405 "Display routes conforming to the filter-list\n"
7406 "Regular expression access list name\n")
7407{
7408 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7409 bgp_show_type_filter_list);
7410}
7411#endif /* HAVE_IPV6 */
7412
paul94f2b392005-06-28 12:44:16 +00007413static int
paulfd79ac92004-10-13 05:06:08 +00007414bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007415 safi_t safi, enum bgp_show_type type)
7416{
7417 struct route_map *rmap;
7418
7419 rmap = route_map_lookup_by_name (rmap_str);
7420 if (! rmap)
7421 {
7422 vty_out (vty, "%% %s is not a valid route-map name%s",
7423 rmap_str, VTY_NEWLINE);
7424 return CMD_WARNING;
7425 }
7426
ajs5a646652004-11-05 01:25:55 +00007427 return bgp_show (vty, NULL, afi, safi, type, rmap);
paul718e3742002-12-13 20:15:29 +00007428}
7429
7430DEFUN (show_ip_bgp_route_map,
7431 show_ip_bgp_route_map_cmd,
7432 "show ip bgp route-map WORD",
7433 SHOW_STR
7434 IP_STR
7435 BGP_STR
7436 "Display routes matching the route-map\n"
7437 "A route-map to match on\n")
7438{
7439 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7440 bgp_show_type_route_map);
7441}
7442
7443DEFUN (show_ip_bgp_flap_route_map,
7444 show_ip_bgp_flap_route_map_cmd,
7445 "show ip bgp flap-statistics route-map WORD",
7446 SHOW_STR
7447 IP_STR
7448 BGP_STR
7449 "Display flap statistics of routes\n"
7450 "Display routes matching the route-map\n"
7451 "A route-map to match on\n")
7452{
7453 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7454 bgp_show_type_flap_route_map);
7455}
7456
7457DEFUN (show_ip_bgp_ipv4_route_map,
7458 show_ip_bgp_ipv4_route_map_cmd,
7459 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7460 SHOW_STR
7461 IP_STR
7462 BGP_STR
7463 "Address family\n"
7464 "Address Family modifier\n"
7465 "Address Family modifier\n"
7466 "Display routes matching the route-map\n"
7467 "A route-map to match on\n")
7468{
7469 if (strncmp (argv[0], "m", 1) == 0)
7470 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7471 bgp_show_type_route_map);
7472
7473 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7474 bgp_show_type_route_map);
7475}
7476
7477DEFUN (show_bgp_route_map,
7478 show_bgp_route_map_cmd,
7479 "show bgp route-map WORD",
7480 SHOW_STR
7481 BGP_STR
7482 "Display routes matching the route-map\n"
7483 "A route-map to match on\n")
7484{
7485 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7486 bgp_show_type_route_map);
7487}
7488
7489ALIAS (show_bgp_route_map,
7490 show_bgp_ipv6_route_map_cmd,
7491 "show bgp ipv6 route-map WORD",
7492 SHOW_STR
7493 BGP_STR
7494 "Address family\n"
7495 "Display routes matching the route-map\n"
7496 "A route-map to match on\n")
7497
7498DEFUN (show_ip_bgp_cidr_only,
7499 show_ip_bgp_cidr_only_cmd,
7500 "show ip bgp cidr-only",
7501 SHOW_STR
7502 IP_STR
7503 BGP_STR
7504 "Display only routes with non-natural netmasks\n")
7505{
7506 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007507 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007508}
7509
7510DEFUN (show_ip_bgp_flap_cidr_only,
7511 show_ip_bgp_flap_cidr_only_cmd,
7512 "show ip bgp flap-statistics cidr-only",
7513 SHOW_STR
7514 IP_STR
7515 BGP_STR
7516 "Display flap statistics of routes\n"
7517 "Display only routes with non-natural netmasks\n")
7518{
7519 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007520 bgp_show_type_flap_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007521}
7522
7523DEFUN (show_ip_bgp_ipv4_cidr_only,
7524 show_ip_bgp_ipv4_cidr_only_cmd,
7525 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7526 SHOW_STR
7527 IP_STR
7528 BGP_STR
7529 "Address family\n"
7530 "Address Family modifier\n"
7531 "Address Family modifier\n"
7532 "Display only routes with non-natural netmasks\n")
7533{
7534 if (strncmp (argv[0], "m", 1) == 0)
7535 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007536 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007537
7538 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007539 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007540}
7541
7542DEFUN (show_ip_bgp_community_all,
7543 show_ip_bgp_community_all_cmd,
7544 "show ip bgp community",
7545 SHOW_STR
7546 IP_STR
7547 BGP_STR
7548 "Display routes matching the communities\n")
7549{
7550 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007551 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007552}
7553
7554DEFUN (show_ip_bgp_ipv4_community_all,
7555 show_ip_bgp_ipv4_community_all_cmd,
7556 "show ip bgp ipv4 (unicast|multicast) community",
7557 SHOW_STR
7558 IP_STR
7559 BGP_STR
7560 "Address family\n"
7561 "Address Family modifier\n"
7562 "Address Family modifier\n"
7563 "Display routes matching the communities\n")
7564{
7565 if (strncmp (argv[0], "m", 1) == 0)
7566 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007567 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007568
7569 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007570 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007571}
7572
7573#ifdef HAVE_IPV6
7574DEFUN (show_bgp_community_all,
7575 show_bgp_community_all_cmd,
7576 "show bgp community",
7577 SHOW_STR
7578 BGP_STR
7579 "Display routes matching the communities\n")
7580{
7581 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007582 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007583}
7584
7585ALIAS (show_bgp_community_all,
7586 show_bgp_ipv6_community_all_cmd,
7587 "show bgp ipv6 community",
7588 SHOW_STR
7589 BGP_STR
7590 "Address family\n"
7591 "Display routes matching the communities\n")
7592
7593/* old command */
7594DEFUN (show_ipv6_bgp_community_all,
7595 show_ipv6_bgp_community_all_cmd,
7596 "show ipv6 bgp community",
7597 SHOW_STR
7598 IPV6_STR
7599 BGP_STR
7600 "Display routes matching the communities\n")
7601{
7602 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007603 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007604}
7605
7606/* old command */
7607DEFUN (show_ipv6_mbgp_community_all,
7608 show_ipv6_mbgp_community_all_cmd,
7609 "show ipv6 mbgp community",
7610 SHOW_STR
7611 IPV6_STR
7612 MBGP_STR
7613 "Display routes matching the communities\n")
7614{
7615 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007616 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007617}
7618#endif /* HAVE_IPV6 */
7619
paul94f2b392005-06-28 12:44:16 +00007620static int
Michael Lambert95cbbd22010-07-23 14:43:04 -04007621bgp_show_community (struct vty *vty, const char *view_name, int argc,
7622 const char **argv, int exact, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00007623{
7624 struct community *com;
7625 struct buffer *b;
Michael Lambert95cbbd22010-07-23 14:43:04 -04007626 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +00007627 int i;
7628 char *str;
7629 int first = 0;
7630
Michael Lambert95cbbd22010-07-23 14:43:04 -04007631 /* BGP structure lookup */
7632 if (view_name)
7633 {
7634 bgp = bgp_lookup_by_name (view_name);
7635 if (bgp == NULL)
7636 {
7637 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
7638 return CMD_WARNING;
7639 }
7640 }
7641 else
7642 {
7643 bgp = bgp_get_default ();
7644 if (bgp == NULL)
7645 {
7646 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
7647 return CMD_WARNING;
7648 }
7649 }
7650
paul718e3742002-12-13 20:15:29 +00007651 b = buffer_new (1024);
7652 for (i = 0; i < argc; i++)
7653 {
7654 if (first)
7655 buffer_putc (b, ' ');
7656 else
7657 {
7658 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7659 continue;
7660 first = 1;
7661 }
7662
7663 buffer_putstr (b, argv[i]);
7664 }
7665 buffer_putc (b, '\0');
7666
7667 str = buffer_getstr (b);
7668 buffer_free (b);
7669
7670 com = community_str2com (str);
ajs3b8b1852005-01-29 18:19:13 +00007671 XFREE (MTYPE_TMP, str);
paul718e3742002-12-13 20:15:29 +00007672 if (! com)
7673 {
7674 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7675 return CMD_WARNING;
7676 }
7677
Michael Lambert95cbbd22010-07-23 14:43:04 -04007678 return bgp_show (vty, bgp, afi, safi,
ajs5a646652004-11-05 01:25:55 +00007679 (exact ? bgp_show_type_community_exact :
7680 bgp_show_type_community), com);
paul718e3742002-12-13 20:15:29 +00007681}
7682
7683DEFUN (show_ip_bgp_community,
7684 show_ip_bgp_community_cmd,
7685 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7686 SHOW_STR
7687 IP_STR
7688 BGP_STR
7689 "Display routes matching the communities\n"
7690 "community number\n"
7691 "Do not send outside local AS (well-known community)\n"
7692 "Do not advertise to any peer (well-known community)\n"
7693 "Do not export to next AS (well-known community)\n")
7694{
Michael Lambert95cbbd22010-07-23 14:43:04 -04007695 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007696}
7697
7698ALIAS (show_ip_bgp_community,
7699 show_ip_bgp_community2_cmd,
7700 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7701 SHOW_STR
7702 IP_STR
7703 BGP_STR
7704 "Display routes matching the communities\n"
7705 "community number\n"
7706 "Do not send outside local AS (well-known community)\n"
7707 "Do not advertise to any peer (well-known community)\n"
7708 "Do not export to next AS (well-known community)\n"
7709 "community number\n"
7710 "Do not send outside local AS (well-known community)\n"
7711 "Do not advertise to any peer (well-known community)\n"
7712 "Do not export to next AS (well-known community)\n")
7713
7714ALIAS (show_ip_bgp_community,
7715 show_ip_bgp_community3_cmd,
7716 "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)",
7717 SHOW_STR
7718 IP_STR
7719 BGP_STR
7720 "Display routes matching the communities\n"
7721 "community number\n"
7722 "Do not send outside local AS (well-known community)\n"
7723 "Do not advertise to any peer (well-known community)\n"
7724 "Do not export to next AS (well-known community)\n"
7725 "community number\n"
7726 "Do not send outside local AS (well-known community)\n"
7727 "Do not advertise to any peer (well-known community)\n"
7728 "Do not export to next AS (well-known community)\n"
7729 "community number\n"
7730 "Do not send outside local AS (well-known community)\n"
7731 "Do not advertise to any peer (well-known community)\n"
7732 "Do not export to next AS (well-known community)\n")
7733
7734ALIAS (show_ip_bgp_community,
7735 show_ip_bgp_community4_cmd,
7736 "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)",
7737 SHOW_STR
7738 IP_STR
7739 BGP_STR
7740 "Display routes matching the communities\n"
7741 "community number\n"
7742 "Do not send outside local AS (well-known community)\n"
7743 "Do not advertise to any peer (well-known community)\n"
7744 "Do not export to next AS (well-known community)\n"
7745 "community number\n"
7746 "Do not send outside local AS (well-known community)\n"
7747 "Do not advertise to any peer (well-known community)\n"
7748 "Do not export to next AS (well-known community)\n"
7749 "community number\n"
7750 "Do not send outside local AS (well-known community)\n"
7751 "Do not advertise to any peer (well-known community)\n"
7752 "Do not export to next AS (well-known community)\n"
7753 "community number\n"
7754 "Do not send outside local AS (well-known community)\n"
7755 "Do not advertise to any peer (well-known community)\n"
7756 "Do not export to next AS (well-known community)\n")
7757
7758DEFUN (show_ip_bgp_ipv4_community,
7759 show_ip_bgp_ipv4_community_cmd,
7760 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7761 SHOW_STR
7762 IP_STR
7763 BGP_STR
7764 "Address family\n"
7765 "Address Family modifier\n"
7766 "Address Family modifier\n"
7767 "Display routes matching the communities\n"
7768 "community number\n"
7769 "Do not send outside local AS (well-known community)\n"
7770 "Do not advertise to any peer (well-known community)\n"
7771 "Do not export to next AS (well-known community)\n")
7772{
7773 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04007774 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00007775
Michael Lambert95cbbd22010-07-23 14:43:04 -04007776 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007777}
7778
7779ALIAS (show_ip_bgp_ipv4_community,
7780 show_ip_bgp_ipv4_community2_cmd,
7781 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7782 SHOW_STR
7783 IP_STR
7784 BGP_STR
7785 "Address family\n"
7786 "Address Family modifier\n"
7787 "Address Family modifier\n"
7788 "Display routes matching the communities\n"
7789 "community number\n"
7790 "Do not send outside local AS (well-known community)\n"
7791 "Do not advertise to any peer (well-known community)\n"
7792 "Do not export to next AS (well-known community)\n"
7793 "community number\n"
7794 "Do not send outside local AS (well-known community)\n"
7795 "Do not advertise to any peer (well-known community)\n"
7796 "Do not export to next AS (well-known community)\n")
7797
7798ALIAS (show_ip_bgp_ipv4_community,
7799 show_ip_bgp_ipv4_community3_cmd,
7800 "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)",
7801 SHOW_STR
7802 IP_STR
7803 BGP_STR
7804 "Address family\n"
7805 "Address Family modifier\n"
7806 "Address Family modifier\n"
7807 "Display routes matching the communities\n"
7808 "community number\n"
7809 "Do not send outside local AS (well-known community)\n"
7810 "Do not advertise to any peer (well-known community)\n"
7811 "Do not export to next AS (well-known community)\n"
7812 "community number\n"
7813 "Do not send outside local AS (well-known community)\n"
7814 "Do not advertise to any peer (well-known community)\n"
7815 "Do not export to next AS (well-known community)\n"
7816 "community number\n"
7817 "Do not send outside local AS (well-known community)\n"
7818 "Do not advertise to any peer (well-known community)\n"
7819 "Do not export to next AS (well-known community)\n")
7820
7821ALIAS (show_ip_bgp_ipv4_community,
7822 show_ip_bgp_ipv4_community4_cmd,
7823 "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)",
7824 SHOW_STR
7825 IP_STR
7826 BGP_STR
7827 "Address family\n"
7828 "Address Family modifier\n"
7829 "Address Family modifier\n"
7830 "Display routes matching the communities\n"
7831 "community number\n"
7832 "Do not send outside local AS (well-known community)\n"
7833 "Do not advertise to any peer (well-known community)\n"
7834 "Do not export to next AS (well-known community)\n"
7835 "community number\n"
7836 "Do not send outside local AS (well-known community)\n"
7837 "Do not advertise to any peer (well-known community)\n"
7838 "Do not export to next AS (well-known community)\n"
7839 "community number\n"
7840 "Do not send outside local AS (well-known community)\n"
7841 "Do not advertise to any peer (well-known community)\n"
7842 "Do not export to next AS (well-known community)\n"
7843 "community number\n"
7844 "Do not send outside local AS (well-known community)\n"
7845 "Do not advertise to any peer (well-known community)\n"
7846 "Do not export to next AS (well-known community)\n")
7847
Michael Lambert95cbbd22010-07-23 14:43:04 -04007848DEFUN (show_bgp_view_afi_safi_community_all,
7849 show_bgp_view_afi_safi_community_all_cmd,
7850#ifdef HAVE_IPV6
7851 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
7852#else
7853 "show bgp view WORD ipv4 (unicast|multicast) community",
7854#endif
7855 SHOW_STR
7856 BGP_STR
7857 "BGP view\n"
7858 "BGP view name\n"
7859 "Address family\n"
7860#ifdef HAVE_IPV6
7861 "Address family\n"
7862#endif
7863 "Address Family modifier\n"
7864 "Address Family modifier\n"
7865 "Display routes containing communities\n")
7866{
7867 int afi;
7868 int safi;
7869 struct bgp *bgp;
7870
7871 /* BGP structure lookup. */
7872 bgp = bgp_lookup_by_name (argv[0]);
7873 if (bgp == NULL)
7874 {
7875 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7876 return CMD_WARNING;
7877 }
7878
7879#ifdef HAVE_IPV6
7880 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7881 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7882#else
7883 afi = AFI_IP;
7884 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7885#endif
7886 return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
7887}
7888
7889DEFUN (show_bgp_view_afi_safi_community,
7890 show_bgp_view_afi_safi_community_cmd,
7891#ifdef HAVE_IPV6
7892 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7893#else
7894 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7895#endif
7896 SHOW_STR
7897 BGP_STR
7898 "BGP view\n"
7899 "BGP view name\n"
7900 "Address family\n"
7901#ifdef HAVE_IPV6
7902 "Address family\n"
7903#endif
7904 "Address family modifier\n"
7905 "Address family modifier\n"
7906 "Display routes matching the communities\n"
7907 "community number\n"
7908 "Do not send outside local AS (well-known community)\n"
7909 "Do not advertise to any peer (well-known community)\n"
7910 "Do not export to next AS (well-known community)\n")
7911{
7912 int afi;
7913 int safi;
7914
7915#ifdef HAVE_IPV6
7916 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7917 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7918 return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
7919#else
7920 afi = AFI_IP;
7921 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7922 return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
7923#endif
7924}
7925
7926ALIAS (show_bgp_view_afi_safi_community,
7927 show_bgp_view_afi_safi_community2_cmd,
7928#ifdef HAVE_IPV6
7929 "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)",
7930#else
7931 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7932#endif
7933 SHOW_STR
7934 BGP_STR
7935 "BGP view\n"
7936 "BGP view name\n"
7937 "Address family\n"
7938#ifdef HAVE_IPV6
7939 "Address family\n"
7940#endif
7941 "Address family modifier\n"
7942 "Address family modifier\n"
7943 "Display routes matching the communities\n"
7944 "community number\n"
7945 "Do not send outside local AS (well-known community)\n"
7946 "Do not advertise to any peer (well-known community)\n"
7947 "Do not export to next AS (well-known community)\n"
7948 "community number\n"
7949 "Do not send outside local AS (well-known community)\n"
7950 "Do not advertise to any peer (well-known community)\n"
7951 "Do not export to next AS (well-known community)\n")
7952
7953ALIAS (show_bgp_view_afi_safi_community,
7954 show_bgp_view_afi_safi_community3_cmd,
7955#ifdef HAVE_IPV6
7956 "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)",
7957#else
7958 "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)",
7959#endif
7960 SHOW_STR
7961 BGP_STR
7962 "BGP view\n"
7963 "BGP view name\n"
7964 "Address family\n"
7965#ifdef HAVE_IPV6
7966 "Address family\n"
7967#endif
7968 "Address family modifier\n"
7969 "Address family modifier\n"
7970 "Display routes matching the communities\n"
7971 "community number\n"
7972 "Do not send outside local AS (well-known community)\n"
7973 "Do not advertise to any peer (well-known community)\n"
7974 "Do not export to next AS (well-known community)\n"
7975 "community number\n"
7976 "Do not send outside local AS (well-known community)\n"
7977 "Do not advertise to any peer (well-known community)\n"
7978 "Do not export to next AS (well-known community)\n"
7979 "community number\n"
7980 "Do not send outside local AS (well-known community)\n"
7981 "Do not advertise to any peer (well-known community)\n"
7982 "Do not export to next AS (well-known community)\n")
7983
7984ALIAS (show_bgp_view_afi_safi_community,
7985 show_bgp_view_afi_safi_community4_cmd,
7986#ifdef HAVE_IPV6
7987 "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)",
7988#else
7989 "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)",
7990#endif
7991 SHOW_STR
7992 BGP_STR
7993 "BGP view\n"
7994 "BGP view name\n"
7995 "Address family\n"
7996#ifdef HAVE_IPV6
7997 "Address family\n"
7998#endif
7999 "Address family modifier\n"
8000 "Address family modifier\n"
8001 "Display routes matching the communities\n"
8002 "community number\n"
8003 "Do not send outside local AS (well-known community)\n"
8004 "Do not advertise to any peer (well-known community)\n"
8005 "Do not export to next AS (well-known community)\n"
8006 "community number\n"
8007 "Do not send outside local AS (well-known community)\n"
8008 "Do not advertise to any peer (well-known community)\n"
8009 "Do not export to next AS (well-known community)\n"
8010 "community number\n"
8011 "Do not send outside local AS (well-known community)\n"
8012 "Do not advertise to any peer (well-known community)\n"
8013 "Do not export to next AS (well-known community)\n"
8014 "community number\n"
8015 "Do not send outside local AS (well-known community)\n"
8016 "Do not advertise to any peer (well-known community)\n"
8017 "Do not export to next AS (well-known community)\n")
8018
paul718e3742002-12-13 20:15:29 +00008019DEFUN (show_ip_bgp_community_exact,
8020 show_ip_bgp_community_exact_cmd,
8021 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8022 SHOW_STR
8023 IP_STR
8024 BGP_STR
8025 "Display routes matching the communities\n"
8026 "community number\n"
8027 "Do not send outside local AS (well-known community)\n"
8028 "Do not advertise to any peer (well-known community)\n"
8029 "Do not export to next AS (well-known community)\n"
8030 "Exact match of the communities")
8031{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008032 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008033}
8034
8035ALIAS (show_ip_bgp_community_exact,
8036 show_ip_bgp_community2_exact_cmd,
8037 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8038 SHOW_STR
8039 IP_STR
8040 BGP_STR
8041 "Display routes matching the communities\n"
8042 "community number\n"
8043 "Do not send outside local AS (well-known community)\n"
8044 "Do not advertise to any peer (well-known community)\n"
8045 "Do not export to next AS (well-known community)\n"
8046 "community number\n"
8047 "Do not send outside local AS (well-known community)\n"
8048 "Do not advertise to any peer (well-known community)\n"
8049 "Do not export to next AS (well-known community)\n"
8050 "Exact match of the communities")
8051
8052ALIAS (show_ip_bgp_community_exact,
8053 show_ip_bgp_community3_exact_cmd,
8054 "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",
8055 SHOW_STR
8056 IP_STR
8057 BGP_STR
8058 "Display routes matching the communities\n"
8059 "community number\n"
8060 "Do not send outside local AS (well-known community)\n"
8061 "Do not advertise to any peer (well-known community)\n"
8062 "Do not export to next AS (well-known community)\n"
8063 "community number\n"
8064 "Do not send outside local AS (well-known community)\n"
8065 "Do not advertise to any peer (well-known community)\n"
8066 "Do not export to next AS (well-known community)\n"
8067 "community number\n"
8068 "Do not send outside local AS (well-known community)\n"
8069 "Do not advertise to any peer (well-known community)\n"
8070 "Do not export to next AS (well-known community)\n"
8071 "Exact match of the communities")
8072
8073ALIAS (show_ip_bgp_community_exact,
8074 show_ip_bgp_community4_exact_cmd,
8075 "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",
8076 SHOW_STR
8077 IP_STR
8078 BGP_STR
8079 "Display routes matching the communities\n"
8080 "community number\n"
8081 "Do not send outside local AS (well-known community)\n"
8082 "Do not advertise to any peer (well-known community)\n"
8083 "Do not export to next AS (well-known community)\n"
8084 "community number\n"
8085 "Do not send outside local AS (well-known community)\n"
8086 "Do not advertise to any peer (well-known community)\n"
8087 "Do not export to next AS (well-known community)\n"
8088 "community number\n"
8089 "Do not send outside local AS (well-known community)\n"
8090 "Do not advertise to any peer (well-known community)\n"
8091 "Do not export to next AS (well-known community)\n"
8092 "community number\n"
8093 "Do not send outside local AS (well-known community)\n"
8094 "Do not advertise to any peer (well-known community)\n"
8095 "Do not export to next AS (well-known community)\n"
8096 "Exact match of the communities")
8097
8098DEFUN (show_ip_bgp_ipv4_community_exact,
8099 show_ip_bgp_ipv4_community_exact_cmd,
8100 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8101 SHOW_STR
8102 IP_STR
8103 BGP_STR
8104 "Address family\n"
8105 "Address Family modifier\n"
8106 "Address Family modifier\n"
8107 "Display routes matching the communities\n"
8108 "community number\n"
8109 "Do not send outside local AS (well-known community)\n"
8110 "Do not advertise to any peer (well-known community)\n"
8111 "Do not export to next AS (well-known community)\n"
8112 "Exact match of the communities")
8113{
8114 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04008115 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008116
Michael Lambert95cbbd22010-07-23 14:43:04 -04008117 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008118}
8119
8120ALIAS (show_ip_bgp_ipv4_community_exact,
8121 show_ip_bgp_ipv4_community2_exact_cmd,
8122 "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",
8123 SHOW_STR
8124 IP_STR
8125 BGP_STR
8126 "Address family\n"
8127 "Address Family modifier\n"
8128 "Address Family modifier\n"
8129 "Display routes matching the communities\n"
8130 "community number\n"
8131 "Do not send outside local AS (well-known community)\n"
8132 "Do not advertise to any peer (well-known community)\n"
8133 "Do not export to next AS (well-known community)\n"
8134 "community number\n"
8135 "Do not send outside local AS (well-known community)\n"
8136 "Do not advertise to any peer (well-known community)\n"
8137 "Do not export to next AS (well-known community)\n"
8138 "Exact match of the communities")
8139
8140ALIAS (show_ip_bgp_ipv4_community_exact,
8141 show_ip_bgp_ipv4_community3_exact_cmd,
8142 "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",
8143 SHOW_STR
8144 IP_STR
8145 BGP_STR
8146 "Address family\n"
8147 "Address Family modifier\n"
8148 "Address Family modifier\n"
8149 "Display routes matching the communities\n"
8150 "community number\n"
8151 "Do not send outside local AS (well-known community)\n"
8152 "Do not advertise to any peer (well-known community)\n"
8153 "Do not export to next AS (well-known community)\n"
8154 "community number\n"
8155 "Do not send outside local AS (well-known community)\n"
8156 "Do not advertise to any peer (well-known community)\n"
8157 "Do not export to next AS (well-known community)\n"
8158 "community number\n"
8159 "Do not send outside local AS (well-known community)\n"
8160 "Do not advertise to any peer (well-known community)\n"
8161 "Do not export to next AS (well-known community)\n"
8162 "Exact match of the communities")
8163
8164ALIAS (show_ip_bgp_ipv4_community_exact,
8165 show_ip_bgp_ipv4_community4_exact_cmd,
8166 "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",
8167 SHOW_STR
8168 IP_STR
8169 BGP_STR
8170 "Address family\n"
8171 "Address Family modifier\n"
8172 "Address Family modifier\n"
8173 "Display routes matching the communities\n"
8174 "community number\n"
8175 "Do not send outside local AS (well-known community)\n"
8176 "Do not advertise to any peer (well-known community)\n"
8177 "Do not export to next AS (well-known community)\n"
8178 "community number\n"
8179 "Do not send outside local AS (well-known community)\n"
8180 "Do not advertise to any peer (well-known community)\n"
8181 "Do not export to next AS (well-known community)\n"
8182 "community number\n"
8183 "Do not send outside local AS (well-known community)\n"
8184 "Do not advertise to any peer (well-known community)\n"
8185 "Do not export to next AS (well-known community)\n"
8186 "community number\n"
8187 "Do not send outside local AS (well-known community)\n"
8188 "Do not advertise to any peer (well-known community)\n"
8189 "Do not export to next AS (well-known community)\n"
8190 "Exact match of the communities")
8191
8192#ifdef HAVE_IPV6
8193DEFUN (show_bgp_community,
8194 show_bgp_community_cmd,
8195 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
8196 SHOW_STR
8197 BGP_STR
8198 "Display routes matching the communities\n"
8199 "community number\n"
8200 "Do not send outside local AS (well-known community)\n"
8201 "Do not advertise to any peer (well-known community)\n"
8202 "Do not export to next AS (well-known community)\n")
8203{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008204 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008205}
8206
8207ALIAS (show_bgp_community,
8208 show_bgp_ipv6_community_cmd,
8209 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
8210 SHOW_STR
8211 BGP_STR
8212 "Address family\n"
8213 "Display routes matching the communities\n"
8214 "community number\n"
8215 "Do not send outside local AS (well-known community)\n"
8216 "Do not advertise to any peer (well-known community)\n"
8217 "Do not export to next AS (well-known community)\n")
8218
8219ALIAS (show_bgp_community,
8220 show_bgp_community2_cmd,
8221 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8222 SHOW_STR
8223 BGP_STR
8224 "Display routes matching the communities\n"
8225 "community number\n"
8226 "Do not send outside local AS (well-known community)\n"
8227 "Do not advertise to any peer (well-known community)\n"
8228 "Do not export to next AS (well-known community)\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
8234ALIAS (show_bgp_community,
8235 show_bgp_ipv6_community2_cmd,
8236 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8237 SHOW_STR
8238 BGP_STR
8239 "Address family\n"
8240 "Display routes matching the communities\n"
8241 "community number\n"
8242 "Do not send outside local AS (well-known community)\n"
8243 "Do not advertise to any peer (well-known community)\n"
8244 "Do not export to next AS (well-known community)\n"
8245 "community number\n"
8246 "Do not send outside local AS (well-known community)\n"
8247 "Do not advertise to any peer (well-known community)\n"
8248 "Do not export to next AS (well-known community)\n")
8249
8250ALIAS (show_bgp_community,
8251 show_bgp_community3_cmd,
8252 "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)",
8253 SHOW_STR
8254 BGP_STR
8255 "Display routes matching the communities\n"
8256 "community number\n"
8257 "Do not send outside local AS (well-known community)\n"
8258 "Do not advertise to any peer (well-known community)\n"
8259 "Do not export to next AS (well-known community)\n"
8260 "community number\n"
8261 "Do not send outside local AS (well-known community)\n"
8262 "Do not advertise to any peer (well-known community)\n"
8263 "Do not export to next AS (well-known community)\n"
8264 "community number\n"
8265 "Do not send outside local AS (well-known community)\n"
8266 "Do not advertise to any peer (well-known community)\n"
8267 "Do not export to next AS (well-known community)\n")
8268
8269ALIAS (show_bgp_community,
8270 show_bgp_ipv6_community3_cmd,
8271 "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)",
8272 SHOW_STR
8273 BGP_STR
8274 "Address family\n"
8275 "Display routes matching the communities\n"
8276 "community number\n"
8277 "Do not send outside local AS (well-known community)\n"
8278 "Do not advertise to any peer (well-known community)\n"
8279 "Do not export to next AS (well-known community)\n"
8280 "community number\n"
8281 "Do not send outside local AS (well-known community)\n"
8282 "Do not advertise to any peer (well-known community)\n"
8283 "Do not export to next AS (well-known community)\n"
8284 "community number\n"
8285 "Do not send outside local AS (well-known community)\n"
8286 "Do not advertise to any peer (well-known community)\n"
8287 "Do not export to next AS (well-known community)\n")
8288
8289ALIAS (show_bgp_community,
8290 show_bgp_community4_cmd,
8291 "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)",
8292 SHOW_STR
8293 BGP_STR
8294 "Display routes matching the communities\n"
8295 "community number\n"
8296 "Do not send outside local AS (well-known community)\n"
8297 "Do not advertise to any peer (well-known community)\n"
8298 "Do not export to next AS (well-known community)\n"
8299 "community number\n"
8300 "Do not send outside local AS (well-known community)\n"
8301 "Do not advertise to any peer (well-known community)\n"
8302 "Do not export to next AS (well-known community)\n"
8303 "community number\n"
8304 "Do not send outside local AS (well-known community)\n"
8305 "Do not advertise to any peer (well-known community)\n"
8306 "Do not export to next AS (well-known community)\n"
8307 "community number\n"
8308 "Do not send outside local AS (well-known community)\n"
8309 "Do not advertise to any peer (well-known community)\n"
8310 "Do not export to next AS (well-known community)\n")
8311
8312ALIAS (show_bgp_community,
8313 show_bgp_ipv6_community4_cmd,
8314 "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)",
8315 SHOW_STR
8316 BGP_STR
8317 "Address family\n"
8318 "Display routes matching the communities\n"
8319 "community number\n"
8320 "Do not send outside local AS (well-known community)\n"
8321 "Do not advertise to any peer (well-known community)\n"
8322 "Do not export to next AS (well-known community)\n"
8323 "community number\n"
8324 "Do not send outside local AS (well-known community)\n"
8325 "Do not advertise to any peer (well-known community)\n"
8326 "Do not export to next AS (well-known community)\n"
8327 "community number\n"
8328 "Do not send outside local AS (well-known community)\n"
8329 "Do not advertise to any peer (well-known community)\n"
8330 "Do not export to next AS (well-known community)\n"
8331 "community number\n"
8332 "Do not send outside local AS (well-known community)\n"
8333 "Do not advertise to any peer (well-known community)\n"
8334 "Do not export to next AS (well-known community)\n")
8335
8336/* old command */
8337DEFUN (show_ipv6_bgp_community,
8338 show_ipv6_bgp_community_cmd,
8339 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8340 SHOW_STR
8341 IPV6_STR
8342 BGP_STR
8343 "Display routes matching the communities\n"
8344 "community number\n"
8345 "Do not send outside local AS (well-known community)\n"
8346 "Do not advertise to any peer (well-known community)\n"
8347 "Do not export to next AS (well-known community)\n")
8348{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008349 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008350}
8351
8352/* old command */
8353ALIAS (show_ipv6_bgp_community,
8354 show_ipv6_bgp_community2_cmd,
8355 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8356 SHOW_STR
8357 IPV6_STR
8358 BGP_STR
8359 "Display routes matching the communities\n"
8360 "community number\n"
8361 "Do not send outside local AS (well-known community)\n"
8362 "Do not advertise to any peer (well-known community)\n"
8363 "Do not export to next AS (well-known community)\n"
8364 "community number\n"
8365 "Do not send outside local AS (well-known community)\n"
8366 "Do not advertise to any peer (well-known community)\n"
8367 "Do not export to next AS (well-known community)\n")
8368
8369/* old command */
8370ALIAS (show_ipv6_bgp_community,
8371 show_ipv6_bgp_community3_cmd,
8372 "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)",
8373 SHOW_STR
8374 IPV6_STR
8375 BGP_STR
8376 "Display routes matching the communities\n"
8377 "community number\n"
8378 "Do not send outside local AS (well-known community)\n"
8379 "Do not advertise to any peer (well-known community)\n"
8380 "Do not export to next AS (well-known community)\n"
8381 "community number\n"
8382 "Do not send outside local AS (well-known community)\n"
8383 "Do not advertise to any peer (well-known community)\n"
8384 "Do not export to next AS (well-known community)\n"
8385 "community number\n"
8386 "Do not send outside local AS (well-known community)\n"
8387 "Do not advertise to any peer (well-known community)\n"
8388 "Do not export to next AS (well-known community)\n")
8389
8390/* old command */
8391ALIAS (show_ipv6_bgp_community,
8392 show_ipv6_bgp_community4_cmd,
8393 "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)",
8394 SHOW_STR
8395 IPV6_STR
8396 BGP_STR
8397 "Display routes matching the communities\n"
8398 "community number\n"
8399 "Do not send outside local AS (well-known community)\n"
8400 "Do not advertise to any peer (well-known community)\n"
8401 "Do not export to next AS (well-known community)\n"
8402 "community number\n"
8403 "Do not send outside local AS (well-known community)\n"
8404 "Do not advertise to any peer (well-known community)\n"
8405 "Do not export to next AS (well-known community)\n"
8406 "community number\n"
8407 "Do not send outside local AS (well-known community)\n"
8408 "Do not advertise to any peer (well-known community)\n"
8409 "Do not export to next AS (well-known community)\n"
8410 "community number\n"
8411 "Do not send outside local AS (well-known community)\n"
8412 "Do not advertise to any peer (well-known community)\n"
8413 "Do not export to next AS (well-known community)\n")
8414
8415DEFUN (show_bgp_community_exact,
8416 show_bgp_community_exact_cmd,
8417 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8418 SHOW_STR
8419 BGP_STR
8420 "Display routes matching the communities\n"
8421 "community number\n"
8422 "Do not send outside local AS (well-known community)\n"
8423 "Do not advertise to any peer (well-known community)\n"
8424 "Do not export to next AS (well-known community)\n"
8425 "Exact match of the communities")
8426{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008427 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008428}
8429
8430ALIAS (show_bgp_community_exact,
8431 show_bgp_ipv6_community_exact_cmd,
8432 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8433 SHOW_STR
8434 BGP_STR
8435 "Address family\n"
8436 "Display routes matching the communities\n"
8437 "community number\n"
8438 "Do not send outside local AS (well-known community)\n"
8439 "Do not advertise to any peer (well-known community)\n"
8440 "Do not export to next AS (well-known community)\n"
8441 "Exact match of the communities")
8442
8443ALIAS (show_bgp_community_exact,
8444 show_bgp_community2_exact_cmd,
8445 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8446 SHOW_STR
8447 BGP_STR
8448 "Display routes matching the communities\n"
8449 "community number\n"
8450 "Do not send outside local AS (well-known community)\n"
8451 "Do not advertise to any peer (well-known community)\n"
8452 "Do not export to next AS (well-known community)\n"
8453 "community number\n"
8454 "Do not send outside local AS (well-known community)\n"
8455 "Do not advertise to any peer (well-known community)\n"
8456 "Do not export to next AS (well-known community)\n"
8457 "Exact match of the communities")
8458
8459ALIAS (show_bgp_community_exact,
8460 show_bgp_ipv6_community2_exact_cmd,
8461 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8462 SHOW_STR
8463 BGP_STR
8464 "Address family\n"
8465 "Display routes matching the communities\n"
8466 "community number\n"
8467 "Do not send outside local AS (well-known community)\n"
8468 "Do not advertise to any peer (well-known community)\n"
8469 "Do not export to next AS (well-known community)\n"
8470 "community number\n"
8471 "Do not send outside local AS (well-known community)\n"
8472 "Do not advertise to any peer (well-known community)\n"
8473 "Do not export to next AS (well-known community)\n"
8474 "Exact match of the communities")
8475
8476ALIAS (show_bgp_community_exact,
8477 show_bgp_community3_exact_cmd,
8478 "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",
8479 SHOW_STR
8480 BGP_STR
8481 "Display routes matching the communities\n"
8482 "community number\n"
8483 "Do not send outside local AS (well-known community)\n"
8484 "Do not advertise to any peer (well-known community)\n"
8485 "Do not export to next AS (well-known community)\n"
8486 "community number\n"
8487 "Do not send outside local AS (well-known community)\n"
8488 "Do not advertise to any peer (well-known community)\n"
8489 "Do not export to next AS (well-known community)\n"
8490 "community number\n"
8491 "Do not send outside local AS (well-known community)\n"
8492 "Do not advertise to any peer (well-known community)\n"
8493 "Do not export to next AS (well-known community)\n"
8494 "Exact match of the communities")
8495
8496ALIAS (show_bgp_community_exact,
8497 show_bgp_ipv6_community3_exact_cmd,
8498 "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",
8499 SHOW_STR
8500 BGP_STR
8501 "Address family\n"
8502 "Display routes matching the communities\n"
8503 "community number\n"
8504 "Do not send outside local AS (well-known community)\n"
8505 "Do not advertise to any peer (well-known community)\n"
8506 "Do not export to next AS (well-known community)\n"
8507 "community number\n"
8508 "Do not send outside local AS (well-known community)\n"
8509 "Do not advertise to any peer (well-known community)\n"
8510 "Do not export to next AS (well-known community)\n"
8511 "community number\n"
8512 "Do not send outside local AS (well-known community)\n"
8513 "Do not advertise to any peer (well-known community)\n"
8514 "Do not export to next AS (well-known community)\n"
8515 "Exact match of the communities")
8516
8517ALIAS (show_bgp_community_exact,
8518 show_bgp_community4_exact_cmd,
8519 "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",
8520 SHOW_STR
8521 BGP_STR
8522 "Display routes matching the communities\n"
8523 "community number\n"
8524 "Do not send outside local AS (well-known community)\n"
8525 "Do not advertise to any peer (well-known community)\n"
8526 "Do not export to next AS (well-known community)\n"
8527 "community number\n"
8528 "Do not send outside local AS (well-known community)\n"
8529 "Do not advertise to any peer (well-known community)\n"
8530 "Do not export to next AS (well-known community)\n"
8531 "community number\n"
8532 "Do not send outside local AS (well-known community)\n"
8533 "Do not advertise to any peer (well-known community)\n"
8534 "Do not export to next AS (well-known community)\n"
8535 "community number\n"
8536 "Do not send outside local AS (well-known community)\n"
8537 "Do not advertise to any peer (well-known community)\n"
8538 "Do not export to next AS (well-known community)\n"
8539 "Exact match of the communities")
8540
8541ALIAS (show_bgp_community_exact,
8542 show_bgp_ipv6_community4_exact_cmd,
8543 "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",
8544 SHOW_STR
8545 BGP_STR
8546 "Address family\n"
8547 "Display routes matching the communities\n"
8548 "community number\n"
8549 "Do not send outside local AS (well-known community)\n"
8550 "Do not advertise to any peer (well-known community)\n"
8551 "Do not export to next AS (well-known community)\n"
8552 "community number\n"
8553 "Do not send outside local AS (well-known community)\n"
8554 "Do not advertise to any peer (well-known community)\n"
8555 "Do not export to next AS (well-known community)\n"
8556 "community number\n"
8557 "Do not send outside local AS (well-known community)\n"
8558 "Do not advertise to any peer (well-known community)\n"
8559 "Do not export to next AS (well-known community)\n"
8560 "community number\n"
8561 "Do not send outside local AS (well-known community)\n"
8562 "Do not advertise to any peer (well-known community)\n"
8563 "Do not export to next AS (well-known community)\n"
8564 "Exact match of the communities")
8565
8566/* old command */
8567DEFUN (show_ipv6_bgp_community_exact,
8568 show_ipv6_bgp_community_exact_cmd,
8569 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8570 SHOW_STR
8571 IPV6_STR
8572 BGP_STR
8573 "Display routes matching the communities\n"
8574 "community number\n"
8575 "Do not send outside local AS (well-known community)\n"
8576 "Do not advertise to any peer (well-known community)\n"
8577 "Do not export to next AS (well-known community)\n"
8578 "Exact match of the communities")
8579{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008580 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008581}
8582
8583/* old command */
8584ALIAS (show_ipv6_bgp_community_exact,
8585 show_ipv6_bgp_community2_exact_cmd,
8586 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8587 SHOW_STR
8588 IPV6_STR
8589 BGP_STR
8590 "Display routes matching the communities\n"
8591 "community number\n"
8592 "Do not send outside local AS (well-known community)\n"
8593 "Do not advertise to any peer (well-known community)\n"
8594 "Do not export to next AS (well-known community)\n"
8595 "community number\n"
8596 "Do not send outside local AS (well-known community)\n"
8597 "Do not advertise to any peer (well-known community)\n"
8598 "Do not export to next AS (well-known community)\n"
8599 "Exact match of the communities")
8600
8601/* old command */
8602ALIAS (show_ipv6_bgp_community_exact,
8603 show_ipv6_bgp_community3_exact_cmd,
8604 "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",
8605 SHOW_STR
8606 IPV6_STR
8607 BGP_STR
8608 "Display routes matching the communities\n"
8609 "community number\n"
8610 "Do not send outside local AS (well-known community)\n"
8611 "Do not advertise to any peer (well-known community)\n"
8612 "Do not export to next AS (well-known community)\n"
8613 "community number\n"
8614 "Do not send outside local AS (well-known community)\n"
8615 "Do not advertise to any peer (well-known community)\n"
8616 "Do not export to next AS (well-known community)\n"
8617 "community number\n"
8618 "Do not send outside local AS (well-known community)\n"
8619 "Do not advertise to any peer (well-known community)\n"
8620 "Do not export to next AS (well-known community)\n"
8621 "Exact match of the communities")
8622
8623/* old command */
8624ALIAS (show_ipv6_bgp_community_exact,
8625 show_ipv6_bgp_community4_exact_cmd,
8626 "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",
8627 SHOW_STR
8628 IPV6_STR
8629 BGP_STR
8630 "Display routes matching the communities\n"
8631 "community number\n"
8632 "Do not send outside local AS (well-known community)\n"
8633 "Do not advertise to any peer (well-known community)\n"
8634 "Do not export to next AS (well-known community)\n"
8635 "community number\n"
8636 "Do not send outside local AS (well-known community)\n"
8637 "Do not advertise to any peer (well-known community)\n"
8638 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
8648
8649/* old command */
8650DEFUN (show_ipv6_mbgp_community,
8651 show_ipv6_mbgp_community_cmd,
8652 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8653 SHOW_STR
8654 IPV6_STR
8655 MBGP_STR
8656 "Display routes matching the communities\n"
8657 "community number\n"
8658 "Do not send outside local AS (well-known community)\n"
8659 "Do not advertise to any peer (well-known community)\n"
8660 "Do not export to next AS (well-known community)\n")
8661{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008662 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008663}
8664
8665/* old command */
8666ALIAS (show_ipv6_mbgp_community,
8667 show_ipv6_mbgp_community2_cmd,
8668 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8669 SHOW_STR
8670 IPV6_STR
8671 MBGP_STR
8672 "Display routes matching the communities\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 "community number\n"
8678 "Do not send outside local AS (well-known community)\n"
8679 "Do not advertise to any peer (well-known community)\n"
8680 "Do not export to next AS (well-known community)\n")
8681
8682/* old command */
8683ALIAS (show_ipv6_mbgp_community,
8684 show_ipv6_mbgp_community3_cmd,
8685 "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)",
8686 SHOW_STR
8687 IPV6_STR
8688 MBGP_STR
8689 "Display routes matching the communities\n"
8690 "community number\n"
8691 "Do not send outside local AS (well-known community)\n"
8692 "Do not advertise to any peer (well-known community)\n"
8693 "Do not export to next AS (well-known community)\n"
8694 "community number\n"
8695 "Do not send outside local AS (well-known community)\n"
8696 "Do not advertise to any peer (well-known community)\n"
8697 "Do not export to next AS (well-known community)\n"
8698 "community number\n"
8699 "Do not send outside local AS (well-known community)\n"
8700 "Do not advertise to any peer (well-known community)\n"
8701 "Do not export to next AS (well-known community)\n")
8702
8703/* old command */
8704ALIAS (show_ipv6_mbgp_community,
8705 show_ipv6_mbgp_community4_cmd,
8706 "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)",
8707 SHOW_STR
8708 IPV6_STR
8709 MBGP_STR
8710 "Display routes matching the communities\n"
8711 "community number\n"
8712 "Do not send outside local AS (well-known community)\n"
8713 "Do not advertise to any peer (well-known community)\n"
8714 "Do not export to next AS (well-known community)\n"
8715 "community number\n"
8716 "Do not send outside local AS (well-known community)\n"
8717 "Do not advertise to any peer (well-known community)\n"
8718 "Do not export to next AS (well-known community)\n"
8719 "community number\n"
8720 "Do not send outside local AS (well-known community)\n"
8721 "Do not advertise to any peer (well-known community)\n"
8722 "Do not export to next AS (well-known community)\n"
8723 "community number\n"
8724 "Do not send outside local AS (well-known community)\n"
8725 "Do not advertise to any peer (well-known community)\n"
8726 "Do not export to next AS (well-known community)\n")
8727
8728/* old command */
8729DEFUN (show_ipv6_mbgp_community_exact,
8730 show_ipv6_mbgp_community_exact_cmd,
8731 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8732 SHOW_STR
8733 IPV6_STR
8734 MBGP_STR
8735 "Display routes matching the communities\n"
8736 "community number\n"
8737 "Do not send outside local AS (well-known community)\n"
8738 "Do not advertise to any peer (well-known community)\n"
8739 "Do not export to next AS (well-known community)\n"
8740 "Exact match of the communities")
8741{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008742 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008743}
8744
8745/* old command */
8746ALIAS (show_ipv6_mbgp_community_exact,
8747 show_ipv6_mbgp_community2_exact_cmd,
8748 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8749 SHOW_STR
8750 IPV6_STR
8751 MBGP_STR
8752 "Display routes matching the communities\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 "community number\n"
8758 "Do not send outside local AS (well-known community)\n"
8759 "Do not advertise to any peer (well-known community)\n"
8760 "Do not export to next AS (well-known community)\n"
8761 "Exact match of the communities")
8762
8763/* old command */
8764ALIAS (show_ipv6_mbgp_community_exact,
8765 show_ipv6_mbgp_community3_exact_cmd,
8766 "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",
8767 SHOW_STR
8768 IPV6_STR
8769 MBGP_STR
8770 "Display routes matching the communities\n"
8771 "community number\n"
8772 "Do not send outside local AS (well-known community)\n"
8773 "Do not advertise to any peer (well-known community)\n"
8774 "Do not export to next AS (well-known community)\n"
8775 "community number\n"
8776 "Do not send outside local AS (well-known community)\n"
8777 "Do not advertise to any peer (well-known community)\n"
8778 "Do not export to next AS (well-known community)\n"
8779 "community number\n"
8780 "Do not send outside local AS (well-known community)\n"
8781 "Do not advertise to any peer (well-known community)\n"
8782 "Do not export to next AS (well-known community)\n"
8783 "Exact match of the communities")
8784
8785/* old command */
8786ALIAS (show_ipv6_mbgp_community_exact,
8787 show_ipv6_mbgp_community4_exact_cmd,
8788 "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",
8789 SHOW_STR
8790 IPV6_STR
8791 MBGP_STR
8792 "Display routes matching the communities\n"
8793 "community number\n"
8794 "Do not send outside local AS (well-known community)\n"
8795 "Do not advertise to any peer (well-known community)\n"
8796 "Do not export to next AS (well-known community)\n"
8797 "community number\n"
8798 "Do not send outside local AS (well-known community)\n"
8799 "Do not advertise to any peer (well-known community)\n"
8800 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
8810#endif /* HAVE_IPV6 */
8811
paul94f2b392005-06-28 12:44:16 +00008812static int
paulfd79ac92004-10-13 05:06:08 +00008813bgp_show_community_list (struct vty *vty, const char *com, int exact,
Michael Lambert4c9641b2010-07-22 13:20:55 -04008814 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00008815{
8816 struct community_list *list;
8817
hassofee6e4e2005-02-02 16:29:31 +00008818 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
paul718e3742002-12-13 20:15:29 +00008819 if (list == NULL)
8820 {
8821 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8822 VTY_NEWLINE);
8823 return CMD_WARNING;
8824 }
8825
ajs5a646652004-11-05 01:25:55 +00008826 return bgp_show (vty, NULL, afi, safi,
8827 (exact ? bgp_show_type_community_list_exact :
8828 bgp_show_type_community_list), list);
paul718e3742002-12-13 20:15:29 +00008829}
8830
8831DEFUN (show_ip_bgp_community_list,
8832 show_ip_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008833 "show ip bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008834 SHOW_STR
8835 IP_STR
8836 BGP_STR
8837 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008838 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008839 "community-list name\n")
8840{
8841 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8842}
8843
8844DEFUN (show_ip_bgp_ipv4_community_list,
8845 show_ip_bgp_ipv4_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008846 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008847 SHOW_STR
8848 IP_STR
8849 BGP_STR
8850 "Address family\n"
8851 "Address Family modifier\n"
8852 "Address Family modifier\n"
8853 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008854 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008855 "community-list name\n")
8856{
8857 if (strncmp (argv[0], "m", 1) == 0)
8858 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8859
8860 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8861}
8862
8863DEFUN (show_ip_bgp_community_list_exact,
8864 show_ip_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008865 "show ip bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008866 SHOW_STR
8867 IP_STR
8868 BGP_STR
8869 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008870 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008871 "community-list name\n"
8872 "Exact match of the communities\n")
8873{
8874 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8875}
8876
8877DEFUN (show_ip_bgp_ipv4_community_list_exact,
8878 show_ip_bgp_ipv4_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008879 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008880 SHOW_STR
8881 IP_STR
8882 BGP_STR
8883 "Address family\n"
8884 "Address Family modifier\n"
8885 "Address Family modifier\n"
8886 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008887 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008888 "community-list name\n"
8889 "Exact match of the communities\n")
8890{
8891 if (strncmp (argv[0], "m", 1) == 0)
8892 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8893
8894 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8895}
8896
8897#ifdef HAVE_IPV6
8898DEFUN (show_bgp_community_list,
8899 show_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008900 "show bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008901 SHOW_STR
8902 BGP_STR
8903 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008904 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008905 "community-list name\n")
8906{
8907 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8908}
8909
8910ALIAS (show_bgp_community_list,
8911 show_bgp_ipv6_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008912 "show bgp ipv6 community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008913 SHOW_STR
8914 BGP_STR
8915 "Address family\n"
8916 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008917 "community-list number\n"
paule8e19462006-01-19 20:16:55 +00008918 "community-list name\n")
paul718e3742002-12-13 20:15:29 +00008919
8920/* old command */
8921DEFUN (show_ipv6_bgp_community_list,
8922 show_ipv6_bgp_community_list_cmd,
8923 "show ipv6 bgp community-list WORD",
8924 SHOW_STR
8925 IPV6_STR
8926 BGP_STR
8927 "Display routes matching the community-list\n"
8928 "community-list name\n")
8929{
8930 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8931}
8932
8933/* old command */
8934DEFUN (show_ipv6_mbgp_community_list,
8935 show_ipv6_mbgp_community_list_cmd,
8936 "show ipv6 mbgp community-list WORD",
8937 SHOW_STR
8938 IPV6_STR
8939 MBGP_STR
8940 "Display routes matching the community-list\n"
8941 "community-list name\n")
8942{
8943 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8944}
8945
8946DEFUN (show_bgp_community_list_exact,
8947 show_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008948 "show bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008949 SHOW_STR
8950 BGP_STR
8951 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008952 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008953 "community-list name\n"
8954 "Exact match of the communities\n")
8955{
8956 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8957}
8958
8959ALIAS (show_bgp_community_list_exact,
8960 show_bgp_ipv6_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008961 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008962 SHOW_STR
8963 BGP_STR
8964 "Address family\n"
8965 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008966 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008967 "community-list name\n"
8968 "Exact match of the communities\n")
8969
8970/* old command */
8971DEFUN (show_ipv6_bgp_community_list_exact,
8972 show_ipv6_bgp_community_list_exact_cmd,
8973 "show ipv6 bgp community-list WORD exact-match",
8974 SHOW_STR
8975 IPV6_STR
8976 BGP_STR
8977 "Display routes matching the community-list\n"
8978 "community-list name\n"
8979 "Exact match of the communities\n")
8980{
8981 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8982}
8983
8984/* old command */
8985DEFUN (show_ipv6_mbgp_community_list_exact,
8986 show_ipv6_mbgp_community_list_exact_cmd,
8987 "show ipv6 mbgp community-list WORD exact-match",
8988 SHOW_STR
8989 IPV6_STR
8990 MBGP_STR
8991 "Display routes matching the community-list\n"
8992 "community-list name\n"
8993 "Exact match of the communities\n")
8994{
8995 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8996}
8997#endif /* HAVE_IPV6 */
8998
paul94f2b392005-06-28 12:44:16 +00008999static int
paulfd79ac92004-10-13 05:06:08 +00009000bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
paul718e3742002-12-13 20:15:29 +00009001 safi_t safi, enum bgp_show_type type)
9002{
9003 int ret;
9004 struct prefix *p;
9005
9006 p = prefix_new();
9007
9008 ret = str2prefix (prefix, p);
9009 if (! ret)
9010 {
9011 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
9012 return CMD_WARNING;
9013 }
9014
ajs5a646652004-11-05 01:25:55 +00009015 ret = bgp_show (vty, NULL, afi, safi, type, p);
9016 prefix_free(p);
9017 return ret;
paul718e3742002-12-13 20:15:29 +00009018}
9019
9020DEFUN (show_ip_bgp_prefix_longer,
9021 show_ip_bgp_prefix_longer_cmd,
9022 "show ip bgp A.B.C.D/M longer-prefixes",
9023 SHOW_STR
9024 IP_STR
9025 BGP_STR
9026 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9027 "Display route and more specific routes\n")
9028{
9029 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9030 bgp_show_type_prefix_longer);
9031}
9032
9033DEFUN (show_ip_bgp_flap_prefix_longer,
9034 show_ip_bgp_flap_prefix_longer_cmd,
9035 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
9036 SHOW_STR
9037 IP_STR
9038 BGP_STR
9039 "Display flap statistics of routes\n"
9040 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9041 "Display route and more specific routes\n")
9042{
9043 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9044 bgp_show_type_flap_prefix_longer);
9045}
9046
9047DEFUN (show_ip_bgp_ipv4_prefix_longer,
9048 show_ip_bgp_ipv4_prefix_longer_cmd,
9049 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
9050 SHOW_STR
9051 IP_STR
9052 BGP_STR
9053 "Address family\n"
9054 "Address Family modifier\n"
9055 "Address Family modifier\n"
9056 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
9057 "Display route and more specific routes\n")
9058{
9059 if (strncmp (argv[0], "m", 1) == 0)
9060 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
9061 bgp_show_type_prefix_longer);
9062
9063 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
9064 bgp_show_type_prefix_longer);
9065}
9066
9067DEFUN (show_ip_bgp_flap_address,
9068 show_ip_bgp_flap_address_cmd,
9069 "show ip bgp flap-statistics A.B.C.D",
9070 SHOW_STR
9071 IP_STR
9072 BGP_STR
9073 "Display flap statistics of routes\n"
9074 "Network in the BGP routing table to display\n")
9075{
9076 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9077 bgp_show_type_flap_address);
9078}
9079
9080DEFUN (show_ip_bgp_flap_prefix,
9081 show_ip_bgp_flap_prefix_cmd,
9082 "show ip bgp flap-statistics A.B.C.D/M",
9083 SHOW_STR
9084 IP_STR
9085 BGP_STR
9086 "Display flap statistics of routes\n"
9087 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
9088{
9089 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9090 bgp_show_type_flap_prefix);
9091}
9092#ifdef HAVE_IPV6
9093DEFUN (show_bgp_prefix_longer,
9094 show_bgp_prefix_longer_cmd,
9095 "show bgp X:X::X:X/M longer-prefixes",
9096 SHOW_STR
9097 BGP_STR
9098 "IPv6 prefix <network>/<length>\n"
9099 "Display route and more specific routes\n")
9100{
9101 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9102 bgp_show_type_prefix_longer);
9103}
9104
9105ALIAS (show_bgp_prefix_longer,
9106 show_bgp_ipv6_prefix_longer_cmd,
9107 "show bgp ipv6 X:X::X:X/M longer-prefixes",
9108 SHOW_STR
9109 BGP_STR
9110 "Address family\n"
9111 "IPv6 prefix <network>/<length>\n"
9112 "Display route and more specific routes\n")
9113
9114/* old command */
9115DEFUN (show_ipv6_bgp_prefix_longer,
9116 show_ipv6_bgp_prefix_longer_cmd,
9117 "show ipv6 bgp X:X::X:X/M longer-prefixes",
9118 SHOW_STR
9119 IPV6_STR
9120 BGP_STR
9121 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9122 "Display route and more specific routes\n")
9123{
9124 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9125 bgp_show_type_prefix_longer);
9126}
9127
9128/* old command */
9129DEFUN (show_ipv6_mbgp_prefix_longer,
9130 show_ipv6_mbgp_prefix_longer_cmd,
9131 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
9132 SHOW_STR
9133 IPV6_STR
9134 MBGP_STR
9135 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9136 "Display route and more specific routes\n")
9137{
9138 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
9139 bgp_show_type_prefix_longer);
9140}
9141#endif /* HAVE_IPV6 */
paulbb46e942003-10-24 19:02:03 +00009142
paul94f2b392005-06-28 12:44:16 +00009143static struct peer *
paulfd79ac92004-10-13 05:06:08 +00009144peer_lookup_in_view (struct vty *vty, const char *view_name,
9145 const char *ip_str)
paulbb46e942003-10-24 19:02:03 +00009146{
9147 int ret;
9148 struct bgp *bgp;
9149 struct peer *peer;
9150 union sockunion su;
9151
9152 /* BGP structure lookup. */
9153 if (view_name)
9154 {
9155 bgp = bgp_lookup_by_name (view_name);
9156 if (! bgp)
9157 {
9158 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
9159 return NULL;
9160 }
9161 }
paul5228ad22004-06-04 17:58:18 +00009162 else
paulbb46e942003-10-24 19:02:03 +00009163 {
9164 bgp = bgp_get_default ();
9165 if (! bgp)
9166 {
9167 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
9168 return NULL;
9169 }
9170 }
9171
9172 /* Get peer sockunion. */
9173 ret = str2sockunion (ip_str, &su);
9174 if (ret < 0)
9175 {
9176 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
9177 return NULL;
9178 }
9179
9180 /* Peer structure lookup. */
9181 peer = peer_lookup (bgp, &su);
9182 if (! peer)
9183 {
9184 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
9185 return NULL;
9186 }
9187
9188 return peer;
9189}
Paul Jakma2815e612006-09-14 02:56:07 +00009190
9191enum bgp_stats
9192{
9193 BGP_STATS_MAXBITLEN = 0,
9194 BGP_STATS_RIB,
9195 BGP_STATS_PREFIXES,
9196 BGP_STATS_TOTPLEN,
9197 BGP_STATS_UNAGGREGATEABLE,
9198 BGP_STATS_MAX_AGGREGATEABLE,
9199 BGP_STATS_AGGREGATES,
9200 BGP_STATS_SPACE,
9201 BGP_STATS_ASPATH_COUNT,
9202 BGP_STATS_ASPATH_MAXHOPS,
9203 BGP_STATS_ASPATH_TOTHOPS,
9204 BGP_STATS_ASPATH_MAXSIZE,
9205 BGP_STATS_ASPATH_TOTSIZE,
9206 BGP_STATS_ASN_HIGHEST,
9207 BGP_STATS_MAX,
9208};
paulbb46e942003-10-24 19:02:03 +00009209
Paul Jakma2815e612006-09-14 02:56:07 +00009210static const char *table_stats_strs[] =
9211{
9212 [BGP_STATS_PREFIXES] = "Total Prefixes",
9213 [BGP_STATS_TOTPLEN] = "Average prefix length",
9214 [BGP_STATS_RIB] = "Total Advertisements",
9215 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
9216 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
9217 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
9218 [BGP_STATS_SPACE] = "Address space advertised",
9219 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
9220 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
9221 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
9222 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
9223 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
9224 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
9225 [BGP_STATS_MAX] = NULL,
9226};
9227
9228struct bgp_table_stats
9229{
9230 struct bgp_table *table;
9231 unsigned long long counts[BGP_STATS_MAX];
9232};
9233
9234#if 0
9235#define TALLY_SIGFIG 100000
9236static unsigned long
9237ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9238{
9239 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9240 unsigned long res = (newtot * TALLY_SIGFIG) / count;
9241 unsigned long ret = newtot / count;
9242
9243 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9244 return ret + 1;
9245 else
9246 return ret;
9247}
9248#endif
9249
9250static int
9251bgp_table_stats_walker (struct thread *t)
9252{
9253 struct bgp_node *rn;
9254 struct bgp_node *top;
9255 struct bgp_table_stats *ts = THREAD_ARG (t);
9256 unsigned int space = 0;
9257
Paul Jakma53d9f672006-10-15 23:41:16 +00009258 if (!(top = bgp_table_top (ts->table)))
9259 return 0;
Paul Jakma2815e612006-09-14 02:56:07 +00009260
9261 switch (top->p.family)
9262 {
9263 case AF_INET:
9264 space = IPV4_MAX_BITLEN;
9265 break;
9266 case AF_INET6:
9267 space = IPV6_MAX_BITLEN;
9268 break;
9269 }
9270
9271 ts->counts[BGP_STATS_MAXBITLEN] = space;
9272
9273 for (rn = top; rn; rn = bgp_route_next (rn))
9274 {
9275 struct bgp_info *ri;
9276 struct bgp_node *prn = rn->parent;
9277 unsigned int rinum = 0;
9278
9279 if (rn == top)
9280 continue;
9281
9282 if (!rn->info)
9283 continue;
9284
9285 ts->counts[BGP_STATS_PREFIXES]++;
9286 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9287
9288#if 0
9289 ts->counts[BGP_STATS_AVGPLEN]
9290 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9291 ts->counts[BGP_STATS_AVGPLEN],
9292 rn->p.prefixlen);
9293#endif
9294
9295 /* check if the prefix is included by any other announcements */
9296 while (prn && !prn->info)
9297 prn = prn->parent;
9298
9299 if (prn == NULL || prn == top)
Paul Jakma8383a9b2006-09-14 03:06:54 +00009300 {
9301 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9302 /* announced address space */
9303 if (space)
9304 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9305 }
Paul Jakma2815e612006-09-14 02:56:07 +00009306 else if (prn->info)
9307 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9308
Paul Jakma2815e612006-09-14 02:56:07 +00009309 for (ri = rn->info; ri; ri = ri->next)
9310 {
9311 rinum++;
9312 ts->counts[BGP_STATS_RIB]++;
9313
9314 if (ri->attr &&
9315 (CHECK_FLAG (ri->attr->flag,
9316 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9317 ts->counts[BGP_STATS_AGGREGATES]++;
9318
9319 /* as-path stats */
9320 if (ri->attr && ri->attr->aspath)
9321 {
9322 unsigned int hops = aspath_count_hops (ri->attr->aspath);
9323 unsigned int size = aspath_size (ri->attr->aspath);
9324 as_t highest = aspath_highest (ri->attr->aspath);
9325
9326 ts->counts[BGP_STATS_ASPATH_COUNT]++;
9327
9328 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9329 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9330
9331 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9332 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9333
9334 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9335 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9336#if 0
9337 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9338 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9339 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9340 hops);
9341 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9342 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9343 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9344 size);
9345#endif
9346 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9347 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9348 }
9349 }
9350 }
9351 return 0;
9352}
9353
9354static int
9355bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9356{
9357 struct bgp_table_stats ts;
9358 unsigned int i;
9359
9360 if (!bgp->rib[afi][safi])
9361 {
9362 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9363 return CMD_WARNING;
9364 }
9365
9366 memset (&ts, 0, sizeof (ts));
9367 ts.table = bgp->rib[afi][safi];
9368 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9369
9370 vty_out (vty, "BGP %s RIB statistics%s%s",
9371 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9372
9373 for (i = 0; i < BGP_STATS_MAX; i++)
9374 {
9375 if (!table_stats_strs[i])
9376 continue;
9377
9378 switch (i)
9379 {
9380#if 0
9381 case BGP_STATS_ASPATH_AVGHOPS:
9382 case BGP_STATS_ASPATH_AVGSIZE:
9383 case BGP_STATS_AVGPLEN:
9384 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9385 vty_out (vty, "%12.2f",
9386 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9387 break;
9388#endif
9389 case BGP_STATS_ASPATH_TOTHOPS:
9390 case BGP_STATS_ASPATH_TOTSIZE:
9391 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9392 vty_out (vty, "%12.2f",
9393 ts.counts[i] ?
9394 (float)ts.counts[i] /
9395 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9396 : 0);
9397 break;
9398 case BGP_STATS_TOTPLEN:
9399 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9400 vty_out (vty, "%12.2f",
9401 ts.counts[i] ?
9402 (float)ts.counts[i] /
9403 (float)ts.counts[BGP_STATS_PREFIXES]
9404 : 0);
9405 break;
9406 case BGP_STATS_SPACE:
9407 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9408 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9409 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9410 break;
Paul Jakma30a22312008-08-15 14:05:22 +01009411 vty_out (vty, "%30s: ", "%% announced ");
Paul Jakma2815e612006-09-14 02:56:07 +00009412 vty_out (vty, "%12.2f%s",
9413 100 * (float)ts.counts[BGP_STATS_SPACE] /
Paul Jakma56395af2006-10-27 16:58:20 +00009414 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
Paul Jakma2815e612006-09-14 02:56:07 +00009415 VTY_NEWLINE);
9416 vty_out (vty, "%30s: ", "/8 equivalent ");
9417 vty_out (vty, "%12.2f%s",
9418 (float)ts.counts[BGP_STATS_SPACE] /
9419 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9420 VTY_NEWLINE);
9421 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9422 break;
9423 vty_out (vty, "%30s: ", "/24 equivalent ");
9424 vty_out (vty, "%12.2f",
9425 (float)ts.counts[BGP_STATS_SPACE] /
9426 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9427 break;
9428 default:
9429 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9430 vty_out (vty, "%12llu", ts.counts[i]);
9431 }
9432
9433 vty_out (vty, "%s", VTY_NEWLINE);
9434 }
9435 return CMD_SUCCESS;
9436}
9437
9438static int
9439bgp_table_stats_vty (struct vty *vty, const char *name,
9440 const char *afi_str, const char *safi_str)
9441{
9442 struct bgp *bgp;
9443 afi_t afi;
9444 safi_t safi;
9445
9446 if (name)
9447 bgp = bgp_lookup_by_name (name);
9448 else
9449 bgp = bgp_get_default ();
9450
9451 if (!bgp)
9452 {
9453 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9454 return CMD_WARNING;
9455 }
9456 if (strncmp (afi_str, "ipv", 3) == 0)
9457 {
9458 if (strncmp (afi_str, "ipv4", 4) == 0)
9459 afi = AFI_IP;
9460 else if (strncmp (afi_str, "ipv6", 4) == 0)
9461 afi = AFI_IP6;
9462 else
9463 {
9464 vty_out (vty, "%% Invalid address family %s%s",
9465 afi_str, VTY_NEWLINE);
9466 return CMD_WARNING;
9467 }
9468 if (strncmp (safi_str, "m", 1) == 0)
9469 safi = SAFI_MULTICAST;
9470 else if (strncmp (safi_str, "u", 1) == 0)
9471 safi = SAFI_UNICAST;
Denis Ovsienko42e6d742011-07-14 12:36:19 +04009472 else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0)
9473 safi = SAFI_MPLS_LABELED_VPN;
Paul Jakma2815e612006-09-14 02:56:07 +00009474 else
9475 {
9476 vty_out (vty, "%% Invalid subsequent address family %s%s",
9477 safi_str, VTY_NEWLINE);
9478 return CMD_WARNING;
9479 }
9480 }
9481 else
9482 {
9483 vty_out (vty, "%% Invalid address family %s%s",
9484 afi_str, VTY_NEWLINE);
9485 return CMD_WARNING;
9486 }
9487
Paul Jakma2815e612006-09-14 02:56:07 +00009488 return bgp_table_stats (vty, bgp, afi, safi);
9489}
9490
9491DEFUN (show_bgp_statistics,
9492 show_bgp_statistics_cmd,
9493 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9494 SHOW_STR
9495 BGP_STR
9496 "Address family\n"
9497 "Address family\n"
9498 "Address Family modifier\n"
9499 "Address Family modifier\n"
9500 "BGP RIB advertisement statistics\n")
9501{
9502 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9503}
9504
9505ALIAS (show_bgp_statistics,
9506 show_bgp_statistics_vpnv4_cmd,
9507 "show bgp (ipv4) (vpnv4) statistics",
9508 SHOW_STR
9509 BGP_STR
9510 "Address family\n"
9511 "Address Family modifier\n"
9512 "BGP RIB advertisement statistics\n")
9513
9514DEFUN (show_bgp_statistics_view,
9515 show_bgp_statistics_view_cmd,
9516 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9517 SHOW_STR
9518 BGP_STR
9519 "BGP view\n"
9520 "Address family\n"
9521 "Address family\n"
9522 "Address Family modifier\n"
9523 "Address Family modifier\n"
9524 "BGP RIB advertisement statistics\n")
9525{
9526 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9527}
9528
9529ALIAS (show_bgp_statistics_view,
9530 show_bgp_statistics_view_vpnv4_cmd,
9531 "show bgp view WORD (ipv4) (vpnv4) statistics",
9532 SHOW_STR
9533 BGP_STR
9534 "BGP view\n"
9535 "Address family\n"
9536 "Address Family modifier\n"
9537 "BGP RIB advertisement statistics\n")
9538
Paul Jakmaff7924f2006-09-04 01:10:36 +00009539enum bgp_pcounts
9540{
9541 PCOUNT_ADJ_IN = 0,
9542 PCOUNT_DAMPED,
9543 PCOUNT_REMOVED,
9544 PCOUNT_HISTORY,
9545 PCOUNT_STALE,
9546 PCOUNT_VALID,
9547 PCOUNT_ALL,
9548 PCOUNT_COUNTED,
9549 PCOUNT_PFCNT, /* the figure we display to users */
9550 PCOUNT_MAX,
9551};
9552
9553static const char *pcount_strs[] =
9554{
9555 [PCOUNT_ADJ_IN] = "Adj-in",
9556 [PCOUNT_DAMPED] = "Damped",
9557 [PCOUNT_REMOVED] = "Removed",
9558 [PCOUNT_HISTORY] = "History",
9559 [PCOUNT_STALE] = "Stale",
9560 [PCOUNT_VALID] = "Valid",
9561 [PCOUNT_ALL] = "All RIB",
9562 [PCOUNT_COUNTED] = "PfxCt counted",
9563 [PCOUNT_PFCNT] = "Useable",
9564 [PCOUNT_MAX] = NULL,
9565};
9566
Paul Jakma2815e612006-09-14 02:56:07 +00009567struct peer_pcounts
9568{
9569 unsigned int count[PCOUNT_MAX];
9570 const struct peer *peer;
9571 const struct bgp_table *table;
9572};
9573
Paul Jakmaff7924f2006-09-04 01:10:36 +00009574static int
Paul Jakma2815e612006-09-14 02:56:07 +00009575bgp_peer_count_walker (struct thread *t)
Paul Jakmaff7924f2006-09-04 01:10:36 +00009576{
9577 struct bgp_node *rn;
Paul Jakma2815e612006-09-14 02:56:07 +00009578 struct peer_pcounts *pc = THREAD_ARG (t);
9579 const struct peer *peer = pc->peer;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009580
Paul Jakma2815e612006-09-14 02:56:07 +00009581 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009582 {
9583 struct bgp_adj_in *ain;
Paul Jakma2815e612006-09-14 02:56:07 +00009584 struct bgp_info *ri;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009585
9586 for (ain = rn->adj_in; ain; ain = ain->next)
9587 if (ain->peer == peer)
Paul Jakma2815e612006-09-14 02:56:07 +00009588 pc->count[PCOUNT_ADJ_IN]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009589
Paul Jakmaff7924f2006-09-04 01:10:36 +00009590 for (ri = rn->info; ri; ri = ri->next)
9591 {
9592 char buf[SU_ADDRSTRLEN];
9593
9594 if (ri->peer != peer)
9595 continue;
9596
Paul Jakma2815e612006-09-14 02:56:07 +00009597 pc->count[PCOUNT_ALL]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009598
9599 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
Paul Jakma2815e612006-09-14 02:56:07 +00009600 pc->count[PCOUNT_DAMPED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009601 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
Paul Jakma2815e612006-09-14 02:56:07 +00009602 pc->count[PCOUNT_HISTORY]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009603 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
Paul Jakma2815e612006-09-14 02:56:07 +00009604 pc->count[PCOUNT_REMOVED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009605 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma2815e612006-09-14 02:56:07 +00009606 pc->count[PCOUNT_STALE]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009607 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
Paul Jakma2815e612006-09-14 02:56:07 +00009608 pc->count[PCOUNT_VALID]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009609 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakma2815e612006-09-14 02:56:07 +00009610 pc->count[PCOUNT_PFCNT]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009611
9612 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9613 {
Paul Jakma2815e612006-09-14 02:56:07 +00009614 pc->count[PCOUNT_COUNTED]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009615 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009616 plog_warn (peer->log,
9617 "%s [pcount] %s/%d is counted but flags 0x%x",
9618 peer->host,
9619 inet_ntop(rn->p.family, &rn->p.u.prefix,
9620 buf, SU_ADDRSTRLEN),
9621 rn->p.prefixlen,
9622 ri->flags);
9623 }
9624 else
9625 {
Paul Jakma1a392d42006-09-07 00:24:49 +00009626 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009627 plog_warn (peer->log,
9628 "%s [pcount] %s/%d not counted but flags 0x%x",
9629 peer->host,
9630 inet_ntop(rn->p.family, &rn->p.u.prefix,
9631 buf, SU_ADDRSTRLEN),
9632 rn->p.prefixlen,
9633 ri->flags);
9634 }
9635 }
9636 }
Paul Jakma2815e612006-09-14 02:56:07 +00009637 return 0;
9638}
Paul Jakmaff7924f2006-09-04 01:10:36 +00009639
Paul Jakma2815e612006-09-14 02:56:07 +00009640static int
9641bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9642{
9643 struct peer_pcounts pcounts = { .peer = peer };
9644 unsigned int i;
9645
9646 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9647 || !peer->bgp->rib[afi][safi])
9648 {
9649 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9650 return CMD_WARNING;
9651 }
9652
9653 memset (&pcounts, 0, sizeof(pcounts));
9654 pcounts.peer = peer;
9655 pcounts.table = peer->bgp->rib[afi][safi];
9656
9657 /* in-place call via thread subsystem so as to record execution time
9658 * stats for the thread-walk (i.e. ensure this can't be blamed on
9659 * on just vty_read()).
9660 */
9661 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9662
Paul Jakmaff7924f2006-09-04 01:10:36 +00009663 vty_out (vty, "Prefix counts for %s, %s%s",
9664 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9665 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9666 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9667 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9668
9669 for (i = 0; i < PCOUNT_MAX; i++)
Paul Jakma2815e612006-09-14 02:56:07 +00009670 vty_out (vty, "%20s: %-10d%s",
9671 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
Paul Jakmaff7924f2006-09-04 01:10:36 +00009672
Paul Jakma2815e612006-09-14 02:56:07 +00009673 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
Paul Jakmaff7924f2006-09-04 01:10:36 +00009674 {
9675 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9676 peer->host, VTY_NEWLINE);
9677 vty_out (vty, "Please report this bug, with the above command output%s",
9678 VTY_NEWLINE);
9679 }
9680
9681 return CMD_SUCCESS;
9682}
9683
9684DEFUN (show_ip_bgp_neighbor_prefix_counts,
9685 show_ip_bgp_neighbor_prefix_counts_cmd,
9686 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9687 SHOW_STR
9688 IP_STR
9689 BGP_STR
9690 "Detailed information on TCP and BGP neighbor connections\n"
9691 "Neighbor to display information about\n"
9692 "Neighbor to display information about\n"
9693 "Display detailed prefix count information\n")
9694{
9695 struct peer *peer;
9696
9697 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9698 if (! peer)
9699 return CMD_WARNING;
9700
9701 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9702}
9703
9704DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9705 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9706 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9707 SHOW_STR
9708 BGP_STR
9709 "Address family\n"
9710 "Detailed information on TCP and BGP neighbor connections\n"
9711 "Neighbor to display information about\n"
9712 "Neighbor to display information about\n"
9713 "Display detailed prefix count information\n")
9714{
9715 struct peer *peer;
9716
9717 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9718 if (! peer)
9719 return CMD_WARNING;
9720
9721 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9722}
9723
9724DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9725 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9726 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9727 SHOW_STR
9728 IP_STR
9729 BGP_STR
9730 "Address family\n"
9731 "Address Family modifier\n"
9732 "Address Family modifier\n"
9733 "Detailed information on TCP and BGP neighbor connections\n"
9734 "Neighbor to display information about\n"
9735 "Neighbor to display information about\n"
9736 "Display detailed prefix count information\n")
9737{
9738 struct peer *peer;
9739
9740 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9741 if (! peer)
9742 return CMD_WARNING;
9743
9744 if (strncmp (argv[0], "m", 1) == 0)
9745 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9746
9747 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9748}
9749
9750DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9751 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9752 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9753 SHOW_STR
9754 IP_STR
9755 BGP_STR
9756 "Address family\n"
9757 "Address Family modifier\n"
9758 "Address Family modifier\n"
9759 "Detailed information on TCP and BGP neighbor connections\n"
9760 "Neighbor to display information about\n"
9761 "Neighbor to display information about\n"
9762 "Display detailed prefix count information\n")
9763{
9764 struct peer *peer;
9765
9766 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9767 if (! peer)
9768 return CMD_WARNING;
9769
9770 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9771}
9772
9773
paul94f2b392005-06-28 12:44:16 +00009774static void
paul718e3742002-12-13 20:15:29 +00009775show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9776 int in)
9777{
9778 struct bgp_table *table;
9779 struct bgp_adj_in *ain;
9780 struct bgp_adj_out *adj;
9781 unsigned long output_count;
9782 struct bgp_node *rn;
9783 int header1 = 1;
9784 struct bgp *bgp;
9785 int header2 = 1;
9786
paulbb46e942003-10-24 19:02:03 +00009787 bgp = peer->bgp;
paul718e3742002-12-13 20:15:29 +00009788
9789 if (! bgp)
9790 return;
9791
9792 table = bgp->rib[afi][safi];
9793
9794 output_count = 0;
9795
9796 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9797 PEER_STATUS_DEFAULT_ORIGINATE))
9798 {
9799 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 +00009800 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9801 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009802
9803 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9804 VTY_NEWLINE, VTY_NEWLINE);
9805 header1 = 0;
9806 }
9807
9808 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9809 if (in)
9810 {
9811 for (ain = rn->adj_in; ain; ain = ain->next)
9812 if (ain->peer == peer)
9813 {
9814 if (header1)
9815 {
9816 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 +00009817 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9818 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009819 header1 = 0;
9820 }
9821 if (header2)
9822 {
9823 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9824 header2 = 0;
9825 }
9826 if (ain->attr)
9827 {
9828 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9829 output_count++;
9830 }
9831 }
9832 }
9833 else
9834 {
9835 for (adj = rn->adj_out; adj; adj = adj->next)
9836 if (adj->peer == peer)
9837 {
9838 if (header1)
9839 {
9840 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 +00009841 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9842 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009843 header1 = 0;
9844 }
9845 if (header2)
9846 {
9847 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9848 header2 = 0;
9849 }
9850 if (adj->attr)
9851 {
9852 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9853 output_count++;
9854 }
9855 }
9856 }
9857
9858 if (output_count != 0)
9859 vty_out (vty, "%sTotal number of prefixes %ld%s",
9860 VTY_NEWLINE, output_count, VTY_NEWLINE);
9861}
9862
paul94f2b392005-06-28 12:44:16 +00009863static int
paulbb46e942003-10-24 19:02:03 +00009864peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9865{
paul718e3742002-12-13 20:15:29 +00009866 if (! peer || ! peer->afc[afi][safi])
9867 {
9868 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9869 return CMD_WARNING;
9870 }
9871
9872 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9873 {
9874 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9875 VTY_NEWLINE);
9876 return CMD_WARNING;
9877 }
9878
9879 show_adj_route (vty, peer, afi, safi, in);
9880
9881 return CMD_SUCCESS;
9882}
9883
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009884DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9885 show_ip_bgp_view_neighbor_advertised_route_cmd,
9886 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9887 SHOW_STR
9888 IP_STR
9889 BGP_STR
9890 "BGP view\n"
9891 "View name\n"
9892 "Detailed information on TCP and BGP neighbor connections\n"
9893 "Neighbor to display information about\n"
9894 "Neighbor to display information about\n"
9895 "Display the routes advertised to a BGP neighbor\n")
9896{
9897 struct peer *peer;
9898
9899 if (argc == 2)
9900 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9901 else
9902 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9903
9904 if (! peer)
9905 return CMD_WARNING;
9906
9907 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9908}
9909
9910ALIAS (show_ip_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009911 show_ip_bgp_neighbor_advertised_route_cmd,
9912 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9913 SHOW_STR
9914 IP_STR
9915 BGP_STR
9916 "Detailed information on TCP and BGP neighbor connections\n"
9917 "Neighbor to display information about\n"
9918 "Neighbor to display information about\n"
9919 "Display the routes advertised to a BGP neighbor\n")
paul718e3742002-12-13 20:15:29 +00009920
9921DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9922 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9923 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9924 SHOW_STR
9925 IP_STR
9926 BGP_STR
9927 "Address family\n"
9928 "Address Family modifier\n"
9929 "Address Family modifier\n"
9930 "Detailed information on TCP and BGP neighbor connections\n"
9931 "Neighbor to display information about\n"
9932 "Neighbor to display information about\n"
9933 "Display the routes advertised to a BGP neighbor\n")
9934{
paulbb46e942003-10-24 19:02:03 +00009935 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00009936
paulbb46e942003-10-24 19:02:03 +00009937 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9938 if (! peer)
9939 return CMD_WARNING;
9940
9941 if (strncmp (argv[0], "m", 1) == 0)
9942 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9943
9944 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
paul718e3742002-12-13 20:15:29 +00009945}
9946
9947#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +00009948DEFUN (show_bgp_view_neighbor_advertised_route,
9949 show_bgp_view_neighbor_advertised_route_cmd,
9950 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9951 SHOW_STR
9952 BGP_STR
9953 "BGP view\n"
9954 "View name\n"
9955 "Detailed information on TCP and BGP neighbor connections\n"
9956 "Neighbor to display information about\n"
9957 "Neighbor to display information about\n"
9958 "Display the routes advertised to a BGP neighbor\n")
9959{
9960 struct peer *peer;
9961
9962 if (argc == 2)
9963 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9964 else
9965 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9966
9967 if (! peer)
9968 return CMD_WARNING;
9969
9970 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9971}
9972
9973ALIAS (show_bgp_view_neighbor_advertised_route,
9974 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9975 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9976 SHOW_STR
9977 BGP_STR
9978 "BGP view\n"
9979 "View name\n"
9980 "Address family\n"
9981 "Detailed information on TCP and BGP neighbor connections\n"
9982 "Neighbor to display information about\n"
9983 "Neighbor to display information about\n"
9984 "Display the routes advertised to a BGP neighbor\n")
9985
9986DEFUN (show_bgp_view_neighbor_received_routes,
9987 show_bgp_view_neighbor_received_routes_cmd,
9988 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9989 SHOW_STR
9990 BGP_STR
9991 "BGP view\n"
9992 "View name\n"
9993 "Detailed information on TCP and BGP neighbor connections\n"
9994 "Neighbor to display information about\n"
9995 "Neighbor to display information about\n"
9996 "Display the received routes from neighbor\n")
9997{
9998 struct peer *peer;
9999
10000 if (argc == 2)
10001 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10002 else
10003 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10004
10005 if (! peer)
10006 return CMD_WARNING;
10007
10008 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
10009}
10010
10011ALIAS (show_bgp_view_neighbor_received_routes,
10012 show_bgp_view_ipv6_neighbor_received_routes_cmd,
10013 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10014 SHOW_STR
10015 BGP_STR
10016 "BGP view\n"
10017 "View name\n"
10018 "Address family\n"
10019 "Detailed information on TCP and BGP neighbor connections\n"
10020 "Neighbor to display information about\n"
10021 "Neighbor to display information about\n"
10022 "Display the received routes from neighbor\n")
10023
10024ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010025 show_bgp_neighbor_advertised_route_cmd,
10026 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10027 SHOW_STR
10028 BGP_STR
10029 "Detailed information on TCP and BGP neighbor connections\n"
10030 "Neighbor to display information about\n"
10031 "Neighbor to display information about\n"
10032 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +000010033
10034ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010035 show_bgp_ipv6_neighbor_advertised_route_cmd,
10036 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10037 SHOW_STR
10038 BGP_STR
10039 "Address family\n"
10040 "Detailed information on TCP and BGP neighbor connections\n"
10041 "Neighbor to display information about\n"
10042 "Neighbor to display information about\n"
10043 "Display the routes advertised to a BGP neighbor\n")
10044
10045/* old command */
paulbb46e942003-10-24 19:02:03 +000010046ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +000010047 ipv6_bgp_neighbor_advertised_route_cmd,
10048 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10049 SHOW_STR
10050 IPV6_STR
10051 BGP_STR
10052 "Detailed information on TCP and BGP neighbor connections\n"
10053 "Neighbor to display information about\n"
10054 "Neighbor to display information about\n"
10055 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +000010056
paul718e3742002-12-13 20:15:29 +000010057/* old command */
10058DEFUN (ipv6_mbgp_neighbor_advertised_route,
10059 ipv6_mbgp_neighbor_advertised_route_cmd,
10060 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
10061 SHOW_STR
10062 IPV6_STR
10063 MBGP_STR
10064 "Detailed information on TCP and BGP neighbor connections\n"
10065 "Neighbor to display information about\n"
10066 "Neighbor to display information about\n"
10067 "Display the routes advertised to a BGP neighbor\n")
10068{
paulbb46e942003-10-24 19:02:03 +000010069 struct peer *peer;
10070
10071 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10072 if (! peer)
10073 return CMD_WARNING;
10074
10075 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
paul718e3742002-12-13 20:15:29 +000010076}
10077#endif /* HAVE_IPV6 */
10078
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010010079DEFUN (show_ip_bgp_view_neighbor_received_routes,
10080 show_ip_bgp_view_neighbor_received_routes_cmd,
10081 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
10082 SHOW_STR
10083 IP_STR
10084 BGP_STR
10085 "BGP view\n"
10086 "View name\n"
10087 "Detailed information on TCP and BGP neighbor connections\n"
10088 "Neighbor to display information about\n"
10089 "Neighbor to display information about\n"
10090 "Display the received routes from neighbor\n")
10091{
10092 struct peer *peer;
10093
10094 if (argc == 2)
10095 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10096 else
10097 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10098
10099 if (! peer)
10100 return CMD_WARNING;
10101
10102 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
10103}
10104
10105ALIAS (show_ip_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010106 show_ip_bgp_neighbor_received_routes_cmd,
10107 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10108 SHOW_STR
10109 IP_STR
10110 BGP_STR
10111 "Detailed information on TCP and BGP neighbor connections\n"
10112 "Neighbor to display information about\n"
10113 "Neighbor to display information about\n"
10114 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010115
10116DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
10117 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
10118 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
10119 SHOW_STR
10120 IP_STR
10121 BGP_STR
10122 "Address family\n"
10123 "Address Family modifier\n"
10124 "Address Family modifier\n"
10125 "Detailed information on TCP and BGP neighbor connections\n"
10126 "Neighbor to display information about\n"
10127 "Neighbor to display information about\n"
10128 "Display the received routes from neighbor\n")
10129{
paulbb46e942003-10-24 19:02:03 +000010130 struct peer *peer;
paul718e3742002-12-13 20:15:29 +000010131
paulbb46e942003-10-24 19:02:03 +000010132 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10133 if (! peer)
10134 return CMD_WARNING;
10135
10136 if (strncmp (argv[0], "m", 1) == 0)
10137 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
10138
10139 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
paul718e3742002-12-13 20:15:29 +000010140}
10141
Michael Lambert95cbbd22010-07-23 14:43:04 -040010142DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
10143 show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
10144#ifdef HAVE_IPV6
10145 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10146#else
10147 "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10148#endif
10149 SHOW_STR
10150 BGP_STR
10151 "BGP view\n"
10152 "BGP view name\n"
10153 "Address family\n"
10154#ifdef HAVE_IPV6
10155 "Address family\n"
10156#endif
10157 "Address family modifier\n"
10158 "Address family modifier\n"
10159 "Detailed information on TCP and BGP neighbor connections\n"
10160 "Neighbor to display information about\n"
10161 "Neighbor to display information about\n"
10162 "Display the advertised routes to neighbor\n"
10163 "Display the received routes from neighbor\n")
10164{
10165 int afi;
10166 int safi;
10167 int in;
10168 struct peer *peer;
10169
10170#ifdef HAVE_IPV6
10171 peer = peer_lookup_in_view (vty, argv[0], argv[3]);
10172#else
10173 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10174#endif
10175
10176 if (! peer)
10177 return CMD_WARNING;
10178
10179#ifdef HAVE_IPV6
10180 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10181 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10182 in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
10183#else
10184 afi = AFI_IP;
10185 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10186 in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
10187#endif
10188
10189 return peer_adj_routes (vty, peer, afi, safi, in);
10190}
10191
paul718e3742002-12-13 20:15:29 +000010192DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
10193 show_ip_bgp_neighbor_received_prefix_filter_cmd,
10194 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10195 SHOW_STR
10196 IP_STR
10197 BGP_STR
10198 "Detailed information on TCP and BGP neighbor connections\n"
10199 "Neighbor to display information about\n"
10200 "Neighbor to display information about\n"
10201 "Display information received from a BGP neighbor\n"
10202 "Display the prefixlist filter\n")
10203{
10204 char name[BUFSIZ];
10205 union sockunion *su;
10206 struct peer *peer;
10207 int count;
10208
10209 su = sockunion_str2su (argv[0]);
10210 if (su == NULL)
10211 return CMD_WARNING;
10212
10213 peer = peer_lookup (NULL, su);
10214 if (! peer)
10215 return CMD_WARNING;
10216
10217 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10218 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10219 if (count)
10220 {
10221 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10222 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10223 }
10224
10225 return CMD_SUCCESS;
10226}
10227
10228DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
10229 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
10230 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10231 SHOW_STR
10232 IP_STR
10233 BGP_STR
10234 "Address family\n"
10235 "Address Family modifier\n"
10236 "Address Family modifier\n"
10237 "Detailed information on TCP and BGP neighbor connections\n"
10238 "Neighbor to display information about\n"
10239 "Neighbor to display information about\n"
10240 "Display information received from a BGP neighbor\n"
10241 "Display the prefixlist filter\n")
10242{
10243 char name[BUFSIZ];
10244 union sockunion *su;
10245 struct peer *peer;
10246 int count;
10247
10248 su = sockunion_str2su (argv[1]);
10249 if (su == NULL)
10250 return CMD_WARNING;
10251
10252 peer = peer_lookup (NULL, su);
10253 if (! peer)
10254 return CMD_WARNING;
10255
10256 if (strncmp (argv[0], "m", 1) == 0)
10257 {
10258 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
10259 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10260 if (count)
10261 {
10262 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
10263 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10264 }
10265 }
10266 else
10267 {
10268 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10269 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10270 if (count)
10271 {
10272 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10273 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10274 }
10275 }
10276
10277 return CMD_SUCCESS;
10278}
10279
10280
10281#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010282ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010283 show_bgp_neighbor_received_routes_cmd,
10284 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10285 SHOW_STR
10286 BGP_STR
10287 "Detailed information on TCP and BGP neighbor connections\n"
10288 "Neighbor to display information about\n"
10289 "Neighbor to display information about\n"
10290 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010291
paulbb46e942003-10-24 19:02:03 +000010292ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010293 show_bgp_ipv6_neighbor_received_routes_cmd,
10294 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10295 SHOW_STR
10296 BGP_STR
10297 "Address family\n"
10298 "Detailed information on TCP and BGP neighbor connections\n"
10299 "Neighbor to display information about\n"
10300 "Neighbor to display information about\n"
10301 "Display the received routes from neighbor\n")
10302
10303DEFUN (show_bgp_neighbor_received_prefix_filter,
10304 show_bgp_neighbor_received_prefix_filter_cmd,
10305 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10306 SHOW_STR
10307 BGP_STR
10308 "Detailed information on TCP and BGP neighbor connections\n"
10309 "Neighbor to display information about\n"
10310 "Neighbor to display information about\n"
10311 "Display information received from a BGP neighbor\n"
10312 "Display the prefixlist filter\n")
10313{
10314 char name[BUFSIZ];
10315 union sockunion *su;
10316 struct peer *peer;
10317 int count;
10318
10319 su = sockunion_str2su (argv[0]);
10320 if (su == NULL)
10321 return CMD_WARNING;
10322
10323 peer = peer_lookup (NULL, su);
10324 if (! peer)
10325 return CMD_WARNING;
10326
10327 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10328 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10329 if (count)
10330 {
10331 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10332 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10333 }
10334
10335 return CMD_SUCCESS;
10336}
10337
10338ALIAS (show_bgp_neighbor_received_prefix_filter,
10339 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10340 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10341 SHOW_STR
10342 BGP_STR
10343 "Address family\n"
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/* old command */
paulbb46e942003-10-24 19:02:03 +000010351ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010352 ipv6_bgp_neighbor_received_routes_cmd,
10353 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10354 SHOW_STR
10355 IPV6_STR
10356 BGP_STR
10357 "Detailed information on TCP and BGP neighbor connections\n"
10358 "Neighbor to display information about\n"
10359 "Neighbor to display information about\n"
10360 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010361
10362/* old command */
10363DEFUN (ipv6_mbgp_neighbor_received_routes,
10364 ipv6_mbgp_neighbor_received_routes_cmd,
10365 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10366 SHOW_STR
10367 IPV6_STR
10368 MBGP_STR
10369 "Detailed information on TCP and BGP neighbor connections\n"
10370 "Neighbor to display information about\n"
10371 "Neighbor to display information about\n"
10372 "Display the received routes from neighbor\n")
10373{
paulbb46e942003-10-24 19:02:03 +000010374 struct peer *peer;
10375
10376 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10377 if (! peer)
10378 return CMD_WARNING;
10379
10380 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
paul718e3742002-12-13 20:15:29 +000010381}
paulbb46e942003-10-24 19:02:03 +000010382
10383DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10384 show_bgp_view_neighbor_received_prefix_filter_cmd,
10385 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10386 SHOW_STR
10387 BGP_STR
10388 "BGP view\n"
10389 "View name\n"
10390 "Detailed information on TCP and BGP neighbor connections\n"
10391 "Neighbor to display information about\n"
10392 "Neighbor to display information about\n"
10393 "Display information received from a BGP neighbor\n"
10394 "Display the prefixlist filter\n")
10395{
10396 char name[BUFSIZ];
10397 union sockunion *su;
10398 struct peer *peer;
10399 struct bgp *bgp;
10400 int count;
10401
10402 /* BGP structure lookup. */
10403 bgp = bgp_lookup_by_name (argv[0]);
10404 if (bgp == NULL)
10405 {
10406 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10407 return CMD_WARNING;
10408 }
10409
10410 su = sockunion_str2su (argv[1]);
10411 if (su == NULL)
10412 return CMD_WARNING;
10413
10414 peer = peer_lookup (bgp, su);
10415 if (! peer)
10416 return CMD_WARNING;
10417
10418 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10419 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10420 if (count)
10421 {
10422 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10423 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10424 }
10425
10426 return CMD_SUCCESS;
10427}
10428
10429ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10430 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10431 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10432 SHOW_STR
10433 BGP_STR
10434 "BGP view\n"
10435 "View name\n"
10436 "Address family\n"
10437 "Detailed information on TCP and BGP neighbor connections\n"
10438 "Neighbor to display information about\n"
10439 "Neighbor to display information about\n"
10440 "Display information received from a BGP neighbor\n"
10441 "Display the prefixlist filter\n")
paul718e3742002-12-13 20:15:29 +000010442#endif /* HAVE_IPV6 */
10443
paul94f2b392005-06-28 12:44:16 +000010444static int
paulbb46e942003-10-24 19:02:03 +000010445bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
paul718e3742002-12-13 20:15:29 +000010446 safi_t safi, enum bgp_show_type type)
10447{
paul718e3742002-12-13 20:15:29 +000010448 if (! peer || ! peer->afc[afi][safi])
10449 {
10450 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +000010451 return CMD_WARNING;
10452 }
10453
ajs5a646652004-11-05 01:25:55 +000010454 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
paul718e3742002-12-13 20:15:29 +000010455}
10456
10457DEFUN (show_ip_bgp_neighbor_routes,
10458 show_ip_bgp_neighbor_routes_cmd,
10459 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10460 SHOW_STR
10461 IP_STR
10462 BGP_STR
10463 "Detailed information on TCP and BGP neighbor connections\n"
10464 "Neighbor to display information about\n"
10465 "Neighbor to display information about\n"
10466 "Display routes learned from neighbor\n")
10467{
paulbb46e942003-10-24 19:02:03 +000010468 struct peer *peer;
10469
10470 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10471 if (! peer)
10472 return CMD_WARNING;
10473
10474 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010475 bgp_show_type_neighbor);
10476}
10477
10478DEFUN (show_ip_bgp_neighbor_flap,
10479 show_ip_bgp_neighbor_flap_cmd,
10480 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10481 SHOW_STR
10482 IP_STR
10483 BGP_STR
10484 "Detailed information on TCP and BGP neighbor connections\n"
10485 "Neighbor to display information about\n"
10486 "Neighbor to display information about\n"
10487 "Display flap statistics of the routes learned from neighbor\n")
10488{
paulbb46e942003-10-24 19:02:03 +000010489 struct peer *peer;
10490
10491 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10492 if (! peer)
10493 return CMD_WARNING;
10494
10495 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010496 bgp_show_type_flap_neighbor);
10497}
10498
10499DEFUN (show_ip_bgp_neighbor_damp,
10500 show_ip_bgp_neighbor_damp_cmd,
10501 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-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 the dampened routes received 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_damp_neighbor);
10518}
10519
10520DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10521 show_ip_bgp_ipv4_neighbor_routes_cmd,
10522 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10523 SHOW_STR
10524 IP_STR
10525 BGP_STR
10526 "Address family\n"
10527 "Address Family modifier\n"
10528 "Address Family modifier\n"
10529 "Detailed information on TCP and BGP neighbor connections\n"
10530 "Neighbor to display information about\n"
10531 "Neighbor to display information about\n"
10532 "Display routes learned from neighbor\n")
10533{
paulbb46e942003-10-24 19:02:03 +000010534 struct peer *peer;
10535
10536 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10537 if (! peer)
10538 return CMD_WARNING;
10539
paul718e3742002-12-13 20:15:29 +000010540 if (strncmp (argv[0], "m", 1) == 0)
paulbb46e942003-10-24 19:02:03 +000010541 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000010542 bgp_show_type_neighbor);
10543
paulbb46e942003-10-24 19:02:03 +000010544 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010545 bgp_show_type_neighbor);
10546}
paulbb46e942003-10-24 19:02:03 +000010547
paulfee0f4c2004-09-13 05:12:46 +000010548DEFUN (show_ip_bgp_view_rsclient,
10549 show_ip_bgp_view_rsclient_cmd,
10550 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10551 SHOW_STR
10552 IP_STR
10553 BGP_STR
10554 "BGP view\n"
10555 "BGP view name\n"
10556 "Information about Route Server Client\n"
10557 NEIGHBOR_ADDR_STR)
10558{
10559 struct bgp_table *table;
10560 struct peer *peer;
10561
10562 if (argc == 2)
10563 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10564 else
10565 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10566
10567 if (! peer)
10568 return CMD_WARNING;
10569
10570 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10571 {
10572 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10573 VTY_NEWLINE);
10574 return CMD_WARNING;
10575 }
10576
10577 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10578 PEER_FLAG_RSERVER_CLIENT))
10579 {
10580 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10581 VTY_NEWLINE);
10582 return CMD_WARNING;
10583 }
10584
10585 table = peer->rib[AFI_IP][SAFI_UNICAST];
10586
ajs5a646652004-11-05 01:25:55 +000010587 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000010588}
10589
10590ALIAS (show_ip_bgp_view_rsclient,
10591 show_ip_bgp_rsclient_cmd,
10592 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10593 SHOW_STR
10594 IP_STR
10595 BGP_STR
10596 "Information about Route Server Client\n"
10597 NEIGHBOR_ADDR_STR)
10598
Michael Lambert95cbbd22010-07-23 14:43:04 -040010599DEFUN (show_bgp_view_ipv4_safi_rsclient,
10600 show_bgp_view_ipv4_safi_rsclient_cmd,
10601 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10602 SHOW_STR
10603 BGP_STR
10604 "BGP view\n"
10605 "BGP view name\n"
10606 "Address family\n"
10607 "Address Family modifier\n"
10608 "Address Family modifier\n"
10609 "Information about Route Server Client\n"
10610 NEIGHBOR_ADDR_STR)
10611{
10612 struct bgp_table *table;
10613 struct peer *peer;
10614 safi_t safi;
10615
10616 if (argc == 3) {
10617 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10618 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10619 } else {
10620 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10621 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10622 }
10623
10624 if (! peer)
10625 return CMD_WARNING;
10626
10627 if (! peer->afc[AFI_IP][safi])
10628 {
10629 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10630 VTY_NEWLINE);
10631 return CMD_WARNING;
10632 }
10633
10634 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10635 PEER_FLAG_RSERVER_CLIENT))
10636 {
10637 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10638 VTY_NEWLINE);
10639 return CMD_WARNING;
10640 }
10641
10642 table = peer->rib[AFI_IP][safi];
10643
10644 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10645}
10646
10647ALIAS (show_bgp_view_ipv4_safi_rsclient,
10648 show_bgp_ipv4_safi_rsclient_cmd,
10649 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10650 SHOW_STR
10651 BGP_STR
10652 "Address family\n"
10653 "Address Family modifier\n"
10654 "Address Family modifier\n"
10655 "Information about Route Server Client\n"
10656 NEIGHBOR_ADDR_STR)
10657
paulfee0f4c2004-09-13 05:12:46 +000010658DEFUN (show_ip_bgp_view_rsclient_route,
10659 show_ip_bgp_view_rsclient_route_cmd,
Michael Lamberta8bf6f52008-09-24 17:23:11 +010010660 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
paulfee0f4c2004-09-13 05:12:46 +000010661 SHOW_STR
10662 IP_STR
10663 BGP_STR
10664 "BGP view\n"
10665 "BGP view name\n"
10666 "Information about Route Server Client\n"
10667 NEIGHBOR_ADDR_STR
10668 "Network in the BGP routing table to display\n")
10669{
10670 struct bgp *bgp;
10671 struct peer *peer;
10672
10673 /* BGP structure lookup. */
10674 if (argc == 3)
10675 {
10676 bgp = bgp_lookup_by_name (argv[0]);
10677 if (bgp == NULL)
10678 {
10679 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10680 return CMD_WARNING;
10681 }
10682 }
10683 else
10684 {
10685 bgp = bgp_get_default ();
10686 if (bgp == NULL)
10687 {
10688 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10689 return CMD_WARNING;
10690 }
10691 }
10692
10693 if (argc == 3)
10694 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10695 else
10696 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10697
10698 if (! peer)
10699 return CMD_WARNING;
10700
10701 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10702 {
10703 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10704 VTY_NEWLINE);
10705 return CMD_WARNING;
10706}
10707
10708 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10709 PEER_FLAG_RSERVER_CLIENT))
10710 {
10711 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10712 VTY_NEWLINE);
10713 return CMD_WARNING;
10714 }
10715
10716 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10717 (argc == 3) ? argv[2] : argv[1],
10718 AFI_IP, SAFI_UNICAST, NULL, 0);
10719}
10720
10721ALIAS (show_ip_bgp_view_rsclient_route,
10722 show_ip_bgp_rsclient_route_cmd,
10723 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10724 SHOW_STR
10725 IP_STR
10726 BGP_STR
10727 "Information about Route Server Client\n"
10728 NEIGHBOR_ADDR_STR
10729 "Network in the BGP routing table to display\n")
10730
Michael Lambert95cbbd22010-07-23 14:43:04 -040010731DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
10732 show_bgp_view_ipv4_safi_rsclient_route_cmd,
10733 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10734 SHOW_STR
10735 BGP_STR
10736 "BGP view\n"
10737 "BGP view name\n"
10738 "Address family\n"
10739 "Address Family modifier\n"
10740 "Address Family modifier\n"
10741 "Information about Route Server Client\n"
10742 NEIGHBOR_ADDR_STR
10743 "Network in the BGP routing table to display\n")
10744{
10745 struct bgp *bgp;
10746 struct peer *peer;
10747 safi_t safi;
10748
10749 /* BGP structure lookup. */
10750 if (argc == 4)
10751 {
10752 bgp = bgp_lookup_by_name (argv[0]);
10753 if (bgp == NULL)
10754 {
10755 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10756 return CMD_WARNING;
10757 }
10758 }
10759 else
10760 {
10761 bgp = bgp_get_default ();
10762 if (bgp == NULL)
10763 {
10764 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10765 return CMD_WARNING;
10766 }
10767 }
10768
10769 if (argc == 4) {
10770 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10771 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10772 } else {
10773 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10774 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10775 }
10776
10777 if (! peer)
10778 return CMD_WARNING;
10779
10780 if (! peer->afc[AFI_IP][safi])
10781 {
10782 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10783 VTY_NEWLINE);
10784 return CMD_WARNING;
10785}
10786
10787 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10788 PEER_FLAG_RSERVER_CLIENT))
10789 {
10790 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10791 VTY_NEWLINE);
10792 return CMD_WARNING;
10793 }
10794
10795 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10796 (argc == 4) ? argv[3] : argv[2],
10797 AFI_IP, safi, NULL, 0);
10798}
10799
10800ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
10801 show_bgp_ipv4_safi_rsclient_route_cmd,
10802 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10803 SHOW_STR
10804 BGP_STR
10805 "Address family\n"
10806 "Address Family modifier\n"
10807 "Address Family modifier\n"
10808 "Information about Route Server Client\n"
10809 NEIGHBOR_ADDR_STR
10810 "Network in the BGP routing table to display\n")
10811
paulfee0f4c2004-09-13 05:12:46 +000010812DEFUN (show_ip_bgp_view_rsclient_prefix,
10813 show_ip_bgp_view_rsclient_prefix_cmd,
10814 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10815 SHOW_STR
10816 IP_STR
10817 BGP_STR
10818 "BGP view\n"
10819 "BGP view name\n"
10820 "Information about Route Server Client\n"
10821 NEIGHBOR_ADDR_STR
10822 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10823{
10824 struct bgp *bgp;
10825 struct peer *peer;
10826
10827 /* BGP structure lookup. */
10828 if (argc == 3)
10829 {
10830 bgp = bgp_lookup_by_name (argv[0]);
10831 if (bgp == NULL)
10832 {
10833 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10834 return CMD_WARNING;
10835 }
10836 }
10837 else
10838 {
10839 bgp = bgp_get_default ();
10840 if (bgp == NULL)
10841 {
10842 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10843 return CMD_WARNING;
10844 }
10845 }
10846
10847 if (argc == 3)
10848 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10849 else
10850 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10851
10852 if (! peer)
10853 return CMD_WARNING;
10854
10855 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10856 {
10857 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10858 VTY_NEWLINE);
10859 return CMD_WARNING;
10860}
10861
10862 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10863 PEER_FLAG_RSERVER_CLIENT))
10864{
10865 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10866 VTY_NEWLINE);
10867 return CMD_WARNING;
10868 }
10869
10870 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10871 (argc == 3) ? argv[2] : argv[1],
10872 AFI_IP, SAFI_UNICAST, NULL, 1);
10873}
10874
10875ALIAS (show_ip_bgp_view_rsclient_prefix,
10876 show_ip_bgp_rsclient_prefix_cmd,
10877 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10878 SHOW_STR
10879 IP_STR
10880 BGP_STR
10881 "Information about Route Server Client\n"
10882 NEIGHBOR_ADDR_STR
10883 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10884
Michael Lambert95cbbd22010-07-23 14:43:04 -040010885DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
10886 show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
10887 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10888 SHOW_STR
10889 BGP_STR
10890 "BGP view\n"
10891 "BGP view name\n"
10892 "Address family\n"
10893 "Address Family modifier\n"
10894 "Address Family modifier\n"
10895 "Information about Route Server Client\n"
10896 NEIGHBOR_ADDR_STR
10897 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10898{
10899 struct bgp *bgp;
10900 struct peer *peer;
10901 safi_t safi;
10902
10903 /* BGP structure lookup. */
10904 if (argc == 4)
10905 {
10906 bgp = bgp_lookup_by_name (argv[0]);
10907 if (bgp == NULL)
10908 {
10909 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10910 return CMD_WARNING;
10911 }
10912 }
10913 else
10914 {
10915 bgp = bgp_get_default ();
10916 if (bgp == NULL)
10917 {
10918 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10919 return CMD_WARNING;
10920 }
10921 }
10922
10923 if (argc == 4) {
10924 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10925 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10926 } else {
10927 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10928 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10929 }
10930
10931 if (! peer)
10932 return CMD_WARNING;
10933
10934 if (! peer->afc[AFI_IP][safi])
10935 {
10936 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10937 VTY_NEWLINE);
10938 return CMD_WARNING;
10939}
10940
10941 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10942 PEER_FLAG_RSERVER_CLIENT))
10943{
10944 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10945 VTY_NEWLINE);
10946 return CMD_WARNING;
10947 }
10948
10949 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10950 (argc == 4) ? argv[3] : argv[2],
10951 AFI_IP, safi, NULL, 1);
10952}
10953
10954ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
10955 show_bgp_ipv4_safi_rsclient_prefix_cmd,
10956 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10957 SHOW_STR
10958 BGP_STR
10959 "Address family\n"
10960 "Address Family modifier\n"
10961 "Address Family modifier\n"
10962 "Information about Route Server Client\n"
10963 NEIGHBOR_ADDR_STR
10964 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
paulfee0f4c2004-09-13 05:12:46 +000010965
paul718e3742002-12-13 20:15:29 +000010966#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010967DEFUN (show_bgp_view_neighbor_routes,
10968 show_bgp_view_neighbor_routes_cmd,
10969 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10970 SHOW_STR
10971 BGP_STR
10972 "BGP view\n"
10973 "BGP view name\n"
10974 "Detailed information on TCP and BGP neighbor connections\n"
10975 "Neighbor to display information about\n"
10976 "Neighbor to display information about\n"
10977 "Display routes learned from neighbor\n")
10978{
10979 struct peer *peer;
10980
10981 if (argc == 2)
10982 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10983 else
10984 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10985
10986 if (! peer)
10987 return CMD_WARNING;
10988
10989 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10990 bgp_show_type_neighbor);
10991}
10992
10993ALIAS (show_bgp_view_neighbor_routes,
10994 show_bgp_view_ipv6_neighbor_routes_cmd,
10995 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10996 SHOW_STR
10997 BGP_STR
10998 "BGP view\n"
10999 "BGP view name\n"
11000 "Address family\n"
11001 "Detailed information on TCP and BGP neighbor connections\n"
11002 "Neighbor to display information about\n"
11003 "Neighbor to display information about\n"
11004 "Display routes learned from neighbor\n")
11005
11006DEFUN (show_bgp_view_neighbor_damp,
11007 show_bgp_view_neighbor_damp_cmd,
11008 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11009 SHOW_STR
11010 BGP_STR
11011 "BGP view\n"
11012 "BGP view name\n"
11013 "Detailed information on TCP and BGP neighbor connections\n"
11014 "Neighbor to display information about\n"
11015 "Neighbor to display information about\n"
11016 "Display the dampened routes received from neighbor\n")
11017{
11018 struct peer *peer;
11019
11020 if (argc == 2)
11021 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11022 else
11023 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11024
11025 if (! peer)
11026 return CMD_WARNING;
11027
11028 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
11029 bgp_show_type_damp_neighbor);
11030}
11031
11032ALIAS (show_bgp_view_neighbor_damp,
11033 show_bgp_view_ipv6_neighbor_damp_cmd,
11034 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11035 SHOW_STR
11036 BGP_STR
11037 "BGP view\n"
11038 "BGP view name\n"
11039 "Address family\n"
11040 "Detailed information on TCP and BGP neighbor connections\n"
11041 "Neighbor to display information about\n"
11042 "Neighbor to display information about\n"
11043 "Display the dampened routes received from neighbor\n")
11044
11045DEFUN (show_bgp_view_neighbor_flap,
11046 show_bgp_view_neighbor_flap_cmd,
11047 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11048 SHOW_STR
11049 BGP_STR
11050 "BGP view\n"
11051 "BGP view name\n"
11052 "Detailed information on TCP and BGP neighbor connections\n"
11053 "Neighbor to display information about\n"
11054 "Neighbor to display information about\n"
11055 "Display flap statistics of the routes learned from neighbor\n")
11056{
11057 struct peer *peer;
11058
11059 if (argc == 2)
11060 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11061 else
11062 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11063
11064 if (! peer)
11065 return CMD_WARNING;
11066
11067 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
11068 bgp_show_type_flap_neighbor);
11069}
11070
11071ALIAS (show_bgp_view_neighbor_flap,
11072 show_bgp_view_ipv6_neighbor_flap_cmd,
11073 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11074 SHOW_STR
11075 BGP_STR
11076 "BGP view\n"
11077 "BGP view name\n"
11078 "Address family\n"
11079 "Detailed information on TCP and BGP neighbor connections\n"
11080 "Neighbor to display information about\n"
11081 "Neighbor to display information about\n"
11082 "Display flap statistics of the routes learned from neighbor\n")
11083
11084ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011085 show_bgp_neighbor_routes_cmd,
11086 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
11087 SHOW_STR
11088 BGP_STR
11089 "Detailed information on TCP and BGP neighbor connections\n"
11090 "Neighbor to display information about\n"
11091 "Neighbor to display information about\n"
11092 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011093
paulbb46e942003-10-24 19:02:03 +000011094
11095ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011096 show_bgp_ipv6_neighbor_routes_cmd,
11097 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
11098 SHOW_STR
11099 BGP_STR
11100 "Address family\n"
11101 "Detailed information on TCP and BGP neighbor connections\n"
11102 "Neighbor to display information about\n"
11103 "Neighbor to display information about\n"
11104 "Display routes learned from neighbor\n")
11105
11106/* old command */
paulbb46e942003-10-24 19:02:03 +000011107ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011108 ipv6_bgp_neighbor_routes_cmd,
11109 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
11110 SHOW_STR
11111 IPV6_STR
11112 BGP_STR
11113 "Detailed information on TCP and BGP neighbor connections\n"
11114 "Neighbor to display information about\n"
11115 "Neighbor to display information about\n"
11116 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011117
11118/* old command */
11119DEFUN (ipv6_mbgp_neighbor_routes,
11120 ipv6_mbgp_neighbor_routes_cmd,
11121 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
11122 SHOW_STR
11123 IPV6_STR
11124 MBGP_STR
11125 "Detailed information on TCP and BGP neighbor connections\n"
11126 "Neighbor to display information about\n"
11127 "Neighbor to display information about\n"
11128 "Display routes learned from neighbor\n")
11129{
paulbb46e942003-10-24 19:02:03 +000011130 struct peer *peer;
11131
11132 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11133 if (! peer)
11134 return CMD_WARNING;
11135
11136 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000011137 bgp_show_type_neighbor);
11138}
paulbb46e942003-10-24 19:02:03 +000011139
11140ALIAS (show_bgp_view_neighbor_flap,
11141 show_bgp_neighbor_flap_cmd,
11142 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11143 SHOW_STR
11144 BGP_STR
11145 "Detailed information on TCP and BGP neighbor connections\n"
11146 "Neighbor to display information about\n"
11147 "Neighbor to display information about\n"
11148 "Display flap statistics of the routes learned from neighbor\n")
11149
11150ALIAS (show_bgp_view_neighbor_flap,
11151 show_bgp_ipv6_neighbor_flap_cmd,
11152 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11153 SHOW_STR
11154 BGP_STR
11155 "Address family\n"
11156 "Detailed information on TCP and BGP neighbor connections\n"
11157 "Neighbor to display information about\n"
11158 "Neighbor to display information about\n"
11159 "Display flap statistics of the routes learned from neighbor\n")
11160
11161ALIAS (show_bgp_view_neighbor_damp,
11162 show_bgp_neighbor_damp_cmd,
11163 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11164 SHOW_STR
11165 BGP_STR
11166 "Detailed information on TCP and BGP neighbor connections\n"
11167 "Neighbor to display information about\n"
11168 "Neighbor to display information about\n"
11169 "Display the dampened routes received from neighbor\n")
11170
11171ALIAS (show_bgp_view_neighbor_damp,
11172 show_bgp_ipv6_neighbor_damp_cmd,
11173 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11174 SHOW_STR
11175 BGP_STR
11176 "Address family\n"
11177 "Detailed information on TCP and BGP neighbor connections\n"
11178 "Neighbor to display information about\n"
11179 "Neighbor to display information about\n"
paulc001ae62003-11-03 12:37:43 +000011180 "Display the dampened routes received from neighbor\n")
paulfee0f4c2004-09-13 05:12:46 +000011181
11182DEFUN (show_bgp_view_rsclient,
11183 show_bgp_view_rsclient_cmd,
11184 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
11185 SHOW_STR
11186 BGP_STR
11187 "BGP view\n"
11188 "BGP view name\n"
11189 "Information about Route Server Client\n"
11190 NEIGHBOR_ADDR_STR)
11191{
11192 struct bgp_table *table;
11193 struct peer *peer;
11194
11195 if (argc == 2)
11196 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11197 else
11198 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11199
11200 if (! peer)
11201 return CMD_WARNING;
11202
11203 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11204 {
11205 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11206 VTY_NEWLINE);
11207 return CMD_WARNING;
11208 }
11209
11210 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11211 PEER_FLAG_RSERVER_CLIENT))
11212 {
11213 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11214 VTY_NEWLINE);
11215 return CMD_WARNING;
11216 }
11217
11218 table = peer->rib[AFI_IP6][SAFI_UNICAST];
11219
ajs5a646652004-11-05 01:25:55 +000011220 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000011221}
11222
11223ALIAS (show_bgp_view_rsclient,
11224 show_bgp_rsclient_cmd,
11225 "show bgp rsclient (A.B.C.D|X:X::X:X)",
11226 SHOW_STR
11227 BGP_STR
11228 "Information about Route Server Client\n"
11229 NEIGHBOR_ADDR_STR)
11230
Michael Lambert95cbbd22010-07-23 14:43:04 -040011231DEFUN (show_bgp_view_ipv6_safi_rsclient,
11232 show_bgp_view_ipv6_safi_rsclient_cmd,
11233 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11234 SHOW_STR
11235 BGP_STR
11236 "BGP view\n"
11237 "BGP view name\n"
11238 "Address family\n"
11239 "Address Family modifier\n"
11240 "Address Family modifier\n"
11241 "Information about Route Server Client\n"
11242 NEIGHBOR_ADDR_STR)
11243{
11244 struct bgp_table *table;
11245 struct peer *peer;
11246 safi_t safi;
11247
11248 if (argc == 3) {
11249 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11250 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11251 } else {
11252 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11253 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11254 }
11255
11256 if (! peer)
11257 return CMD_WARNING;
11258
11259 if (! peer->afc[AFI_IP6][safi])
11260 {
11261 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11262 VTY_NEWLINE);
11263 return CMD_WARNING;
11264 }
11265
11266 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11267 PEER_FLAG_RSERVER_CLIENT))
11268 {
11269 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11270 VTY_NEWLINE);
11271 return CMD_WARNING;
11272 }
11273
11274 table = peer->rib[AFI_IP6][safi];
11275
11276 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
11277}
11278
11279ALIAS (show_bgp_view_ipv6_safi_rsclient,
11280 show_bgp_ipv6_safi_rsclient_cmd,
11281 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11282 SHOW_STR
11283 BGP_STR
11284 "Address family\n"
11285 "Address Family modifier\n"
11286 "Address Family modifier\n"
11287 "Information about Route Server Client\n"
11288 NEIGHBOR_ADDR_STR)
11289
paulfee0f4c2004-09-13 05:12:46 +000011290DEFUN (show_bgp_view_rsclient_route,
11291 show_bgp_view_rsclient_route_cmd,
11292 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11293 SHOW_STR
11294 BGP_STR
11295 "BGP view\n"
11296 "BGP view name\n"
11297 "Information about Route Server Client\n"
11298 NEIGHBOR_ADDR_STR
11299 "Network in the BGP routing table to display\n")
11300{
11301 struct bgp *bgp;
11302 struct peer *peer;
11303
11304 /* BGP structure lookup. */
11305 if (argc == 3)
11306 {
11307 bgp = bgp_lookup_by_name (argv[0]);
11308 if (bgp == NULL)
11309 {
11310 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11311 return CMD_WARNING;
11312 }
11313 }
11314 else
11315 {
11316 bgp = bgp_get_default ();
11317 if (bgp == NULL)
11318 {
11319 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11320 return CMD_WARNING;
11321 }
11322 }
11323
11324 if (argc == 3)
11325 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11326 else
11327 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11328
11329 if (! peer)
11330 return CMD_WARNING;
11331
11332 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11333 {
11334 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11335 VTY_NEWLINE);
11336 return CMD_WARNING;
11337 }
11338
11339 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11340 PEER_FLAG_RSERVER_CLIENT))
11341 {
11342 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11343 VTY_NEWLINE);
11344 return CMD_WARNING;
11345 }
11346
11347 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11348 (argc == 3) ? argv[2] : argv[1],
11349 AFI_IP6, SAFI_UNICAST, NULL, 0);
11350}
11351
11352ALIAS (show_bgp_view_rsclient_route,
11353 show_bgp_rsclient_route_cmd,
11354 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11355 SHOW_STR
11356 BGP_STR
11357 "Information about Route Server Client\n"
11358 NEIGHBOR_ADDR_STR
11359 "Network in the BGP routing table to display\n")
11360
Michael Lambert95cbbd22010-07-23 14:43:04 -040011361DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
11362 show_bgp_view_ipv6_safi_rsclient_route_cmd,
11363 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11364 SHOW_STR
11365 BGP_STR
11366 "BGP view\n"
11367 "BGP view name\n"
11368 "Address family\n"
11369 "Address Family modifier\n"
11370 "Address Family modifier\n"
11371 "Information about Route Server Client\n"
11372 NEIGHBOR_ADDR_STR
11373 "Network in the BGP routing table to display\n")
11374{
11375 struct bgp *bgp;
11376 struct peer *peer;
11377 safi_t safi;
11378
11379 /* BGP structure lookup. */
11380 if (argc == 4)
11381 {
11382 bgp = bgp_lookup_by_name (argv[0]);
11383 if (bgp == NULL)
11384 {
11385 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11386 return CMD_WARNING;
11387 }
11388 }
11389 else
11390 {
11391 bgp = bgp_get_default ();
11392 if (bgp == NULL)
11393 {
11394 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11395 return CMD_WARNING;
11396 }
11397 }
11398
11399 if (argc == 4) {
11400 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11401 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11402 } else {
11403 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11404 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11405 }
11406
11407 if (! peer)
11408 return CMD_WARNING;
11409
11410 if (! peer->afc[AFI_IP6][safi])
11411 {
11412 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11413 VTY_NEWLINE);
11414 return CMD_WARNING;
11415}
11416
11417 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11418 PEER_FLAG_RSERVER_CLIENT))
11419 {
11420 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11421 VTY_NEWLINE);
11422 return CMD_WARNING;
11423 }
11424
11425 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11426 (argc == 4) ? argv[3] : argv[2],
11427 AFI_IP6, safi, NULL, 0);
11428}
11429
11430ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
11431 show_bgp_ipv6_safi_rsclient_route_cmd,
11432 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11433 SHOW_STR
11434 BGP_STR
11435 "Address family\n"
11436 "Address Family modifier\n"
11437 "Address Family modifier\n"
11438 "Information about Route Server Client\n"
11439 NEIGHBOR_ADDR_STR
11440 "Network in the BGP routing table to display\n")
11441
paulfee0f4c2004-09-13 05:12:46 +000011442DEFUN (show_bgp_view_rsclient_prefix,
11443 show_bgp_view_rsclient_prefix_cmd,
11444 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11445 SHOW_STR
11446 BGP_STR
11447 "BGP view\n"
11448 "BGP view name\n"
11449 "Information about Route Server Client\n"
11450 NEIGHBOR_ADDR_STR
11451 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11452{
11453 struct bgp *bgp;
11454 struct peer *peer;
11455
11456 /* BGP structure lookup. */
11457 if (argc == 3)
11458 {
11459 bgp = bgp_lookup_by_name (argv[0]);
11460 if (bgp == NULL)
11461 {
11462 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11463 return CMD_WARNING;
11464 }
11465 }
11466 else
11467 {
11468 bgp = bgp_get_default ();
11469 if (bgp == NULL)
11470 {
11471 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11472 return CMD_WARNING;
11473 }
11474 }
11475
11476 if (argc == 3)
11477 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11478 else
11479 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11480
11481 if (! peer)
11482 return CMD_WARNING;
11483
11484 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11485 {
11486 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11487 VTY_NEWLINE);
11488 return CMD_WARNING;
11489 }
11490
11491 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11492 PEER_FLAG_RSERVER_CLIENT))
11493 {
11494 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11495 VTY_NEWLINE);
11496 return CMD_WARNING;
11497 }
11498
11499 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11500 (argc == 3) ? argv[2] : argv[1],
11501 AFI_IP6, SAFI_UNICAST, NULL, 1);
11502}
11503
11504ALIAS (show_bgp_view_rsclient_prefix,
11505 show_bgp_rsclient_prefix_cmd,
11506 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11507 SHOW_STR
11508 BGP_STR
11509 "Information about Route Server Client\n"
11510 NEIGHBOR_ADDR_STR
11511 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11512
Michael Lambert95cbbd22010-07-23 14:43:04 -040011513DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
11514 show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
11515 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11516 SHOW_STR
11517 BGP_STR
11518 "BGP view\n"
11519 "BGP view name\n"
11520 "Address family\n"
11521 "Address Family modifier\n"
11522 "Address Family modifier\n"
11523 "Information about Route Server Client\n"
11524 NEIGHBOR_ADDR_STR
11525 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11526{
11527 struct bgp *bgp;
11528 struct peer *peer;
11529 safi_t safi;
11530
11531 /* BGP structure lookup. */
11532 if (argc == 4)
11533 {
11534 bgp = bgp_lookup_by_name (argv[0]);
11535 if (bgp == NULL)
11536 {
11537 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11538 return CMD_WARNING;
11539 }
11540 }
11541 else
11542 {
11543 bgp = bgp_get_default ();
11544 if (bgp == NULL)
11545 {
11546 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11547 return CMD_WARNING;
11548 }
11549 }
11550
11551 if (argc == 4) {
11552 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11553 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11554 } else {
11555 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11556 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11557 }
11558
11559 if (! peer)
11560 return CMD_WARNING;
11561
11562 if (! peer->afc[AFI_IP6][safi])
11563 {
11564 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11565 VTY_NEWLINE);
11566 return CMD_WARNING;
11567}
11568
11569 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11570 PEER_FLAG_RSERVER_CLIENT))
11571{
11572 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11573 VTY_NEWLINE);
11574 return CMD_WARNING;
11575 }
11576
11577 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11578 (argc == 4) ? argv[3] : argv[2],
11579 AFI_IP6, safi, NULL, 1);
11580}
11581
11582ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
11583 show_bgp_ipv6_safi_rsclient_prefix_cmd,
11584 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11585 SHOW_STR
11586 BGP_STR
11587 "Address family\n"
11588 "Address Family modifier\n"
11589 "Address Family modifier\n"
11590 "Information about Route Server Client\n"
11591 NEIGHBOR_ADDR_STR
11592 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11593
paul718e3742002-12-13 20:15:29 +000011594#endif /* HAVE_IPV6 */
11595
11596struct bgp_table *bgp_distance_table;
11597
11598struct bgp_distance
11599{
11600 /* Distance value for the IP source prefix. */
11601 u_char distance;
11602
11603 /* Name of the access-list to be matched. */
11604 char *access_list;
11605};
11606
paul94f2b392005-06-28 12:44:16 +000011607static struct bgp_distance *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080011608bgp_distance_new (void)
paul718e3742002-12-13 20:15:29 +000011609{
Stephen Hemminger393deb92008-08-18 14:13:29 -070011610 return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
paul718e3742002-12-13 20:15:29 +000011611}
11612
paul94f2b392005-06-28 12:44:16 +000011613static void
paul718e3742002-12-13 20:15:29 +000011614bgp_distance_free (struct bgp_distance *bdistance)
11615{
11616 XFREE (MTYPE_BGP_DISTANCE, bdistance);
11617}
11618
paul94f2b392005-06-28 12:44:16 +000011619static int
paulfd79ac92004-10-13 05:06:08 +000011620bgp_distance_set (struct vty *vty, const char *distance_str,
11621 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011622{
11623 int ret;
11624 struct prefix_ipv4 p;
11625 u_char distance;
11626 struct bgp_node *rn;
11627 struct bgp_distance *bdistance;
11628
11629 ret = str2prefix_ipv4 (ip_str, &p);
11630 if (ret == 0)
11631 {
11632 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11633 return CMD_WARNING;
11634 }
11635
11636 distance = atoi (distance_str);
11637
11638 /* Get BGP distance node. */
11639 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
11640 if (rn->info)
11641 {
11642 bdistance = rn->info;
11643 bgp_unlock_node (rn);
11644 }
11645 else
11646 {
11647 bdistance = bgp_distance_new ();
11648 rn->info = bdistance;
11649 }
11650
11651 /* Set distance value. */
11652 bdistance->distance = distance;
11653
11654 /* Reset access-list configuration. */
11655 if (bdistance->access_list)
11656 {
11657 free (bdistance->access_list);
11658 bdistance->access_list = NULL;
11659 }
11660 if (access_list_str)
11661 bdistance->access_list = strdup (access_list_str);
11662
11663 return CMD_SUCCESS;
11664}
11665
paul94f2b392005-06-28 12:44:16 +000011666static int
paulfd79ac92004-10-13 05:06:08 +000011667bgp_distance_unset (struct vty *vty, const char *distance_str,
11668 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011669{
11670 int ret;
11671 struct prefix_ipv4 p;
11672 u_char distance;
11673 struct bgp_node *rn;
11674 struct bgp_distance *bdistance;
11675
11676 ret = str2prefix_ipv4 (ip_str, &p);
11677 if (ret == 0)
11678 {
11679 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11680 return CMD_WARNING;
11681 }
11682
11683 distance = atoi (distance_str);
11684
11685 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
11686 if (! rn)
11687 {
11688 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
11689 return CMD_WARNING;
11690 }
11691
11692 bdistance = rn->info;
11693
11694 if (bdistance->access_list)
11695 free (bdistance->access_list);
11696 bgp_distance_free (bdistance);
11697
11698 rn->info = NULL;
11699 bgp_unlock_node (rn);
11700 bgp_unlock_node (rn);
11701
11702 return CMD_SUCCESS;
11703}
11704
paul718e3742002-12-13 20:15:29 +000011705/* Apply BGP information to distance method. */
11706u_char
11707bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
11708{
11709 struct bgp_node *rn;
11710 struct prefix_ipv4 q;
11711 struct peer *peer;
11712 struct bgp_distance *bdistance;
11713 struct access_list *alist;
11714 struct bgp_static *bgp_static;
11715
11716 if (! bgp)
11717 return 0;
11718
11719 if (p->family != AF_INET)
11720 return 0;
11721
11722 peer = rinfo->peer;
11723
11724 if (peer->su.sa.sa_family != AF_INET)
11725 return 0;
11726
11727 memset (&q, 0, sizeof (struct prefix_ipv4));
11728 q.family = AF_INET;
11729 q.prefix = peer->su.sin.sin_addr;
11730 q.prefixlen = IPV4_MAX_BITLEN;
11731
11732 /* Check source address. */
11733 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11734 if (rn)
11735 {
11736 bdistance = rn->info;
11737 bgp_unlock_node (rn);
11738
11739 if (bdistance->access_list)
11740 {
11741 alist = access_list_lookup (AFI_IP, bdistance->access_list);
11742 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11743 return bdistance->distance;
11744 }
11745 else
11746 return bdistance->distance;
11747 }
11748
11749 /* Backdoor check. */
11750 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11751 if (rn)
11752 {
11753 bgp_static = rn->info;
11754 bgp_unlock_node (rn);
11755
11756 if (bgp_static->backdoor)
11757 {
11758 if (bgp->distance_local)
11759 return bgp->distance_local;
11760 else
11761 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11762 }
11763 }
11764
11765 if (peer_sort (peer) == BGP_PEER_EBGP)
11766 {
11767 if (bgp->distance_ebgp)
11768 return bgp->distance_ebgp;
11769 return ZEBRA_EBGP_DISTANCE_DEFAULT;
11770 }
11771 else
11772 {
11773 if (bgp->distance_ibgp)
11774 return bgp->distance_ibgp;
11775 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11776 }
11777}
11778
11779DEFUN (bgp_distance,
11780 bgp_distance_cmd,
11781 "distance bgp <1-255> <1-255> <1-255>",
11782 "Define an administrative distance\n"
11783 "BGP distance\n"
11784 "Distance for routes external to the AS\n"
11785 "Distance for routes internal to the AS\n"
11786 "Distance for local routes\n")
11787{
11788 struct bgp *bgp;
11789
11790 bgp = vty->index;
11791
11792 bgp->distance_ebgp = atoi (argv[0]);
11793 bgp->distance_ibgp = atoi (argv[1]);
11794 bgp->distance_local = atoi (argv[2]);
11795 return CMD_SUCCESS;
11796}
11797
11798DEFUN (no_bgp_distance,
11799 no_bgp_distance_cmd,
11800 "no distance bgp <1-255> <1-255> <1-255>",
11801 NO_STR
11802 "Define an administrative distance\n"
11803 "BGP distance\n"
11804 "Distance for routes external to the AS\n"
11805 "Distance for routes internal to the AS\n"
11806 "Distance for local routes\n")
11807{
11808 struct bgp *bgp;
11809
11810 bgp = vty->index;
11811
11812 bgp->distance_ebgp= 0;
11813 bgp->distance_ibgp = 0;
11814 bgp->distance_local = 0;
11815 return CMD_SUCCESS;
11816}
11817
11818ALIAS (no_bgp_distance,
11819 no_bgp_distance2_cmd,
11820 "no distance bgp",
11821 NO_STR
11822 "Define an administrative distance\n"
11823 "BGP distance\n")
11824
11825DEFUN (bgp_distance_source,
11826 bgp_distance_source_cmd,
11827 "distance <1-255> A.B.C.D/M",
11828 "Define an administrative distance\n"
11829 "Administrative distance\n"
11830 "IP source prefix\n")
11831{
11832 bgp_distance_set (vty, argv[0], argv[1], NULL);
11833 return CMD_SUCCESS;
11834}
11835
11836DEFUN (no_bgp_distance_source,
11837 no_bgp_distance_source_cmd,
11838 "no distance <1-255> A.B.C.D/M",
11839 NO_STR
11840 "Define an administrative distance\n"
11841 "Administrative distance\n"
11842 "IP source prefix\n")
11843{
11844 bgp_distance_unset (vty, argv[0], argv[1], NULL);
11845 return CMD_SUCCESS;
11846}
11847
11848DEFUN (bgp_distance_source_access_list,
11849 bgp_distance_source_access_list_cmd,
11850 "distance <1-255> A.B.C.D/M WORD",
11851 "Define an administrative distance\n"
11852 "Administrative distance\n"
11853 "IP source prefix\n"
11854 "Access list name\n")
11855{
11856 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11857 return CMD_SUCCESS;
11858}
11859
11860DEFUN (no_bgp_distance_source_access_list,
11861 no_bgp_distance_source_access_list_cmd,
11862 "no distance <1-255> A.B.C.D/M WORD",
11863 NO_STR
11864 "Define an administrative distance\n"
11865 "Administrative distance\n"
11866 "IP source prefix\n"
11867 "Access list name\n")
11868{
11869 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11870 return CMD_SUCCESS;
11871}
11872
11873DEFUN (bgp_damp_set,
11874 bgp_damp_set_cmd,
11875 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11876 "BGP Specific commands\n"
11877 "Enable route-flap dampening\n"
11878 "Half-life time for the penalty\n"
11879 "Value to start reusing a route\n"
11880 "Value to start suppressing a route\n"
11881 "Maximum duration to suppress a stable route\n")
11882{
11883 struct bgp *bgp;
11884 int half = DEFAULT_HALF_LIFE * 60;
11885 int reuse = DEFAULT_REUSE;
11886 int suppress = DEFAULT_SUPPRESS;
11887 int max = 4 * half;
11888
11889 if (argc == 4)
11890 {
11891 half = atoi (argv[0]) * 60;
11892 reuse = atoi (argv[1]);
11893 suppress = atoi (argv[2]);
11894 max = atoi (argv[3]) * 60;
11895 }
11896 else if (argc == 1)
11897 {
11898 half = atoi (argv[0]) * 60;
11899 max = 4 * half;
11900 }
11901
11902 bgp = vty->index;
11903 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11904 half, reuse, suppress, max);
11905}
11906
11907ALIAS (bgp_damp_set,
11908 bgp_damp_set2_cmd,
11909 "bgp dampening <1-45>",
11910 "BGP Specific commands\n"
11911 "Enable route-flap dampening\n"
11912 "Half-life time for the penalty\n")
11913
11914ALIAS (bgp_damp_set,
11915 bgp_damp_set3_cmd,
11916 "bgp dampening",
11917 "BGP Specific commands\n"
11918 "Enable route-flap dampening\n")
11919
11920DEFUN (bgp_damp_unset,
11921 bgp_damp_unset_cmd,
11922 "no bgp dampening",
11923 NO_STR
11924 "BGP Specific commands\n"
11925 "Enable route-flap dampening\n")
11926{
11927 struct bgp *bgp;
11928
11929 bgp = vty->index;
11930 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11931}
11932
11933ALIAS (bgp_damp_unset,
11934 bgp_damp_unset2_cmd,
11935 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11936 NO_STR
11937 "BGP Specific commands\n"
11938 "Enable route-flap dampening\n"
11939 "Half-life time for the penalty\n"
11940 "Value to start reusing a route\n"
11941 "Value to start suppressing a route\n"
11942 "Maximum duration to suppress a stable route\n")
11943
11944DEFUN (show_ip_bgp_dampened_paths,
11945 show_ip_bgp_dampened_paths_cmd,
11946 "show ip bgp dampened-paths",
11947 SHOW_STR
11948 IP_STR
11949 BGP_STR
11950 "Display paths suppressed due to dampening\n")
11951{
ajs5a646652004-11-05 01:25:55 +000011952 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11953 NULL);
paul718e3742002-12-13 20:15:29 +000011954}
11955
11956DEFUN (show_ip_bgp_flap_statistics,
11957 show_ip_bgp_flap_statistics_cmd,
11958 "show ip bgp flap-statistics",
11959 SHOW_STR
11960 IP_STR
11961 BGP_STR
11962 "Display flap statistics of routes\n")
11963{
ajs5a646652004-11-05 01:25:55 +000011964 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11965 bgp_show_type_flap_statistics, NULL);
paul718e3742002-12-13 20:15:29 +000011966}
11967
11968/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +000011969static int
paulfd79ac92004-10-13 05:06:08 +000011970bgp_clear_damp_route (struct vty *vty, const char *view_name,
11971 const char *ip_str, afi_t afi, safi_t safi,
11972 struct prefix_rd *prd, int prefix_check)
paul718e3742002-12-13 20:15:29 +000011973{
11974 int ret;
11975 struct prefix match;
11976 struct bgp_node *rn;
11977 struct bgp_node *rm;
11978 struct bgp_info *ri;
11979 struct bgp_info *ri_temp;
11980 struct bgp *bgp;
11981 struct bgp_table *table;
11982
11983 /* BGP structure lookup. */
11984 if (view_name)
11985 {
11986 bgp = bgp_lookup_by_name (view_name);
11987 if (bgp == NULL)
11988 {
11989 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11990 return CMD_WARNING;
11991 }
11992 }
11993 else
11994 {
11995 bgp = bgp_get_default ();
11996 if (bgp == NULL)
11997 {
11998 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11999 return CMD_WARNING;
12000 }
12001 }
12002
12003 /* Check IP address argument. */
12004 ret = str2prefix (ip_str, &match);
12005 if (! ret)
12006 {
12007 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
12008 return CMD_WARNING;
12009 }
12010
12011 match.family = afi2family (afi);
12012
12013 if (safi == SAFI_MPLS_VPN)
12014 {
12015 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
12016 {
12017 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
12018 continue;
12019
12020 if ((table = rn->info) != NULL)
12021 if ((rm = bgp_node_match (table, &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000012022 {
12023 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
12024 {
12025 ri = rm->info;
12026 while (ri)
12027 {
12028 if (ri->extra && ri->extra->damp_info)
12029 {
12030 ri_temp = ri->next;
12031 bgp_damp_info_free (ri->extra->damp_info, 1);
12032 ri = ri_temp;
12033 }
12034 else
12035 ri = ri->next;
12036 }
12037 }
12038
12039 bgp_unlock_node (rm);
12040 }
paul718e3742002-12-13 20:15:29 +000012041 }
12042 }
12043 else
12044 {
12045 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000012046 {
12047 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
12048 {
12049 ri = rn->info;
12050 while (ri)
12051 {
12052 if (ri->extra && ri->extra->damp_info)
12053 {
12054 ri_temp = ri->next;
12055 bgp_damp_info_free (ri->extra->damp_info, 1);
12056 ri = ri_temp;
12057 }
12058 else
12059 ri = ri->next;
12060 }
12061 }
12062
12063 bgp_unlock_node (rn);
12064 }
paul718e3742002-12-13 20:15:29 +000012065 }
12066
12067 return CMD_SUCCESS;
12068}
12069
12070DEFUN (clear_ip_bgp_dampening,
12071 clear_ip_bgp_dampening_cmd,
12072 "clear ip bgp dampening",
12073 CLEAR_STR
12074 IP_STR
12075 BGP_STR
12076 "Clear route flap dampening information\n")
12077{
12078 bgp_damp_info_clean ();
12079 return CMD_SUCCESS;
12080}
12081
12082DEFUN (clear_ip_bgp_dampening_prefix,
12083 clear_ip_bgp_dampening_prefix_cmd,
12084 "clear ip bgp dampening A.B.C.D/M",
12085 CLEAR_STR
12086 IP_STR
12087 BGP_STR
12088 "Clear route flap dampening information\n"
12089 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
12090{
12091 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12092 SAFI_UNICAST, NULL, 1);
12093}
12094
12095DEFUN (clear_ip_bgp_dampening_address,
12096 clear_ip_bgp_dampening_address_cmd,
12097 "clear ip bgp dampening A.B.C.D",
12098 CLEAR_STR
12099 IP_STR
12100 BGP_STR
12101 "Clear route flap dampening information\n"
12102 "Network to clear damping information\n")
12103{
12104 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12105 SAFI_UNICAST, NULL, 0);
12106}
12107
12108DEFUN (clear_ip_bgp_dampening_address_mask,
12109 clear_ip_bgp_dampening_address_mask_cmd,
12110 "clear ip bgp dampening A.B.C.D A.B.C.D",
12111 CLEAR_STR
12112 IP_STR
12113 BGP_STR
12114 "Clear route flap dampening information\n"
12115 "Network to clear damping information\n"
12116 "Network mask\n")
12117{
12118 int ret;
12119 char prefix_str[BUFSIZ];
12120
12121 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
12122 if (! ret)
12123 {
12124 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
12125 return CMD_WARNING;
12126 }
12127
12128 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
12129 SAFI_UNICAST, NULL, 0);
12130}
12131
paul94f2b392005-06-28 12:44:16 +000012132static int
paul718e3742002-12-13 20:15:29 +000012133bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
12134 afi_t afi, safi_t safi, int *write)
12135{
12136 struct bgp_node *prn;
12137 struct bgp_node *rn;
12138 struct bgp_table *table;
12139 struct prefix *p;
12140 struct prefix_rd *prd;
12141 struct bgp_static *bgp_static;
12142 u_int32_t label;
12143 char buf[SU_ADDRSTRLEN];
12144 char rdbuf[RD_ADDRSTRLEN];
12145
12146 /* Network configuration. */
12147 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
12148 if ((table = prn->info) != NULL)
12149 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
12150 if ((bgp_static = rn->info) != NULL)
12151 {
12152 p = &rn->p;
12153 prd = (struct prefix_rd *) &prn->p;
12154
12155 /* "address-family" display. */
12156 bgp_config_write_family_header (vty, afi, safi, write);
12157
12158 /* "network" configuration display. */
12159 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
12160 label = decode_label (bgp_static->tag);
12161
12162 vty_out (vty, " network %s/%d rd %s tag %d",
12163 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12164 p->prefixlen,
12165 rdbuf, label);
12166 vty_out (vty, "%s", VTY_NEWLINE);
12167 }
12168 return 0;
12169}
12170
12171/* Configuration of static route announcement and aggregate
12172 information. */
12173int
12174bgp_config_write_network (struct vty *vty, struct bgp *bgp,
12175 afi_t afi, safi_t safi, int *write)
12176{
12177 struct bgp_node *rn;
12178 struct prefix *p;
12179 struct bgp_static *bgp_static;
12180 struct bgp_aggregate *bgp_aggregate;
12181 char buf[SU_ADDRSTRLEN];
12182
12183 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
12184 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
12185
12186 /* Network configuration. */
12187 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
12188 if ((bgp_static = rn->info) != NULL)
12189 {
12190 p = &rn->p;
12191
12192 /* "address-family" display. */
12193 bgp_config_write_family_header (vty, afi, safi, write);
12194
12195 /* "network" configuration display. */
12196 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12197 {
12198 u_int32_t destination;
12199 struct in_addr netmask;
12200
12201 destination = ntohl (p->u.prefix4.s_addr);
12202 masklen2ip (p->prefixlen, &netmask);
12203 vty_out (vty, " network %s",
12204 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
12205
12206 if ((IN_CLASSC (destination) && p->prefixlen == 24)
12207 || (IN_CLASSB (destination) && p->prefixlen == 16)
12208 || (IN_CLASSA (destination) && p->prefixlen == 8)
12209 || p->u.prefix4.s_addr == 0)
12210 {
12211 /* Natural mask is not display. */
12212 }
12213 else
12214 vty_out (vty, " mask %s", inet_ntoa (netmask));
12215 }
12216 else
12217 {
12218 vty_out (vty, " network %s/%d",
12219 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12220 p->prefixlen);
12221 }
12222
12223 if (bgp_static->rmap.name)
12224 vty_out (vty, " route-map %s", bgp_static->rmap.name);
Paul Jakma41367172007-08-06 15:24:51 +000012225 else
12226 {
12227 if (bgp_static->backdoor)
12228 vty_out (vty, " backdoor");
Paul Jakma41367172007-08-06 15:24:51 +000012229 }
paul718e3742002-12-13 20:15:29 +000012230
12231 vty_out (vty, "%s", VTY_NEWLINE);
12232 }
12233
12234 /* Aggregate-address configuration. */
12235 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
12236 if ((bgp_aggregate = rn->info) != NULL)
12237 {
12238 p = &rn->p;
12239
12240 /* "address-family" display. */
12241 bgp_config_write_family_header (vty, afi, safi, write);
12242
12243 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12244 {
12245 struct in_addr netmask;
12246
12247 masklen2ip (p->prefixlen, &netmask);
12248 vty_out (vty, " aggregate-address %s %s",
12249 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12250 inet_ntoa (netmask));
12251 }
12252 else
12253 {
12254 vty_out (vty, " aggregate-address %s/%d",
12255 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12256 p->prefixlen);
12257 }
12258
12259 if (bgp_aggregate->as_set)
12260 vty_out (vty, " as-set");
12261
12262 if (bgp_aggregate->summary_only)
12263 vty_out (vty, " summary-only");
12264
12265 vty_out (vty, "%s", VTY_NEWLINE);
12266 }
12267
12268 return 0;
12269}
12270
12271int
12272bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
12273{
12274 struct bgp_node *rn;
12275 struct bgp_distance *bdistance;
12276
12277 /* Distance configuration. */
12278 if (bgp->distance_ebgp
12279 && bgp->distance_ibgp
12280 && bgp->distance_local
12281 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
12282 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
12283 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
12284 vty_out (vty, " distance bgp %d %d %d%s",
12285 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
12286 VTY_NEWLINE);
12287
12288 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
12289 if ((bdistance = rn->info) != NULL)
12290 {
12291 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
12292 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
12293 bdistance->access_list ? bdistance->access_list : "",
12294 VTY_NEWLINE);
12295 }
12296
12297 return 0;
12298}
12299
12300/* Allocate routing table structure and install commands. */
12301void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080012302bgp_route_init (void)
paul718e3742002-12-13 20:15:29 +000012303{
12304 /* Init BGP distance table. */
Paul Jakma64e580a2006-02-21 01:09:01 +000012305 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +000012306
12307 /* IPv4 BGP commands. */
12308 install_element (BGP_NODE, &bgp_network_cmd);
12309 install_element (BGP_NODE, &bgp_network_mask_cmd);
12310 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
12311 install_element (BGP_NODE, &bgp_network_route_map_cmd);
12312 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
12313 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
12314 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
12315 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
12316 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
12317 install_element (BGP_NODE, &no_bgp_network_cmd);
12318 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
12319 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
12320 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
12321 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
12322 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12323 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
12324 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
12325 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
12326
12327 install_element (BGP_NODE, &aggregate_address_cmd);
12328 install_element (BGP_NODE, &aggregate_address_mask_cmd);
12329 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
12330 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
12331 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
12332 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
12333 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
12334 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
12335 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
12336 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
12337 install_element (BGP_NODE, &no_aggregate_address_cmd);
12338 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
12339 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
12340 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
12341 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
12342 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
12343 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
12344 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
12345 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12346 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12347
12348 /* IPv4 unicast configuration. */
12349 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
12350 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
12351 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
12352 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
12353 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
12354 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012355 install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
paul718e3742002-12-13 20:15:29 +000012356 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
12357 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
12358 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
12359 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
12360 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012361
paul718e3742002-12-13 20:15:29 +000012362 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
12363 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
12364 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
12365 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
12366 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
12367 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
12368 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
12369 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
12370 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
12371 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
12372 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
12373 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
12374 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
12375 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
12376 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
12377 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
12378 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
12379 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
12380 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12381 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12382
12383 /* IPv4 multicast configuration. */
12384 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
12385 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
12386 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
12387 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
12388 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
12389 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
12390 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
12391 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
12392 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
12393 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
12394 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
12395 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12396 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
12397 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
12398 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
12399 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
12400 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
12401 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
12402 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
12403 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
12404 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
12405 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
12406 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
12407 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
12408 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
12409 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
12410 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
12411 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
12412 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
12413 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
12414 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12415 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12416
12417 install_element (VIEW_NODE, &show_ip_bgp_cmd);
12418 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012419 install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012420 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
12421 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012422 install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012423 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12424 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12425 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
12426 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012427 install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012428 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12429 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12430 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
12431 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
12432 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
12433 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
12434 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12435 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
12436 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12437 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
12438 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12439 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
12440 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12441 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
12442 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12443 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
12444 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12445 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
12446 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
12447 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
12448 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
12449 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
12450 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
12451 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
12452 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012453 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12454 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
12455 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
12456 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
12457 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012458 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
12459 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
12460 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
12461 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
12462 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12463 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12464 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12465 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12466 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
12467 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12468 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
12469 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12470 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
12471 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12472 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12473 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12474 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12475 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012476 install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012477 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
12478 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12479 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12480 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12481 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
12482 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
12483 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
12484 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
12485 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12486 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
12487 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
12488 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12489 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12490 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
12491 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
12492 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012493 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012494 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012495 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012496 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012497 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012498 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012499 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12500 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012501 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012502 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012503 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012504 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012505 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012506 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012507
12508 /* Restricted node: VIEW_NODE - (set of dangerous commands) */
12509 install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
12510 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012511 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012512 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12513 install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
12514 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012515 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012516 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12517 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12518 install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
12519 install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
12520 install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
12521 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
12522 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
12523 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
12524 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
12525 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
12526 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
12527 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012528 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12529 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
12530 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
12531 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
12532 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012533 install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
12534 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
12535 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
12536 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
12537 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12538 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12539 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12540 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12541 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012542 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012543 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012544 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012545 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012546 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012547 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012548 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012549
12550 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
12551 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012552 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012553 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
12554 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012555 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012556 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12557 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12558 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
12559 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012560 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012561 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12562 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12563 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
12564 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
12565 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
12566 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
12567 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12568 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
12569 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12570 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
12571 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12572 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
12573 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12574 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
12575 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12576 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
12577 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12578 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
12579 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
12580 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
12581 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
12582 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
12583 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
12584 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
12585 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012586 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12587 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
12588 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
12589 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
12590 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012591 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
12592 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
12593 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
12594 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
12595 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12596 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12597 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12598 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12599 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
12600 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12601 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
12602 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12603 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
12604 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12605 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12606 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12607 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12608 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012609 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012610 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
12611 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12612 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12613 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12614 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
12615 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
12616 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
12617 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
12618 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12619 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
12620 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
12621 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12622 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12623 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
12624 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
12625 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012626 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012627 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012628 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012629 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012630 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012631 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012632 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12633 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012634 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012635 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012636 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012637 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012638 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012639 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012640
12641 /* BGP dampening clear commands */
12642 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
12643 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
12644 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
12645 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
12646
Paul Jakmaff7924f2006-09-04 01:10:36 +000012647 /* prefix count */
12648 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
12649 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
12650 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
paul718e3742002-12-13 20:15:29 +000012651#ifdef HAVE_IPV6
Paul Jakmaff7924f2006-09-04 01:10:36 +000012652 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
12653
paul718e3742002-12-13 20:15:29 +000012654 /* New config IPv6 BGP commands. */
12655 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
12656 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
12657 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
12658 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
12659
12660 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
12661 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
12662 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
12663 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
12664
G.Balaji73bfe0b2011-09-23 22:36:20 +053012665 install_element (BGP_IPV6M_NODE, &ipv6_bgp_network_cmd);
12666 install_element (BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd);
12667
paul718e3742002-12-13 20:15:29 +000012668 /* Old config IPv6 BGP commands. */
12669 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
12670 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
12671
12672 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
12673 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
12674 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
12675 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
12676
12677 install_element (VIEW_NODE, &show_bgp_cmd);
12678 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012679 install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012680 install_element (VIEW_NODE, &show_bgp_route_cmd);
12681 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012682 install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012683 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
12684 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012685 install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012686 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
12687 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
12688 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
12689 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
12690 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
12691 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
12692 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
12693 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
12694 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
12695 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
12696 install_element (VIEW_NODE, &show_bgp_community_cmd);
12697 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
12698 install_element (VIEW_NODE, &show_bgp_community2_cmd);
12699 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
12700 install_element (VIEW_NODE, &show_bgp_community3_cmd);
12701 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
12702 install_element (VIEW_NODE, &show_bgp_community4_cmd);
12703 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
12704 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
12705 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
12706 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
12707 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
12708 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
12709 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
12710 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
12711 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
12712 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
12713 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
12714 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
12715 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12716 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
12717 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12718 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
12719 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12720 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
12721 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12722 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
12723 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12724 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12725 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012726 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
12727 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12728 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
12729 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012730 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012731 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012732 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012733 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012734 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012735 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012736 install_element (VIEW_NODE, &show_bgp_view_cmd);
12737 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
12738 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
12739 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
12740 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
12741 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
12742 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12743 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12744 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12745 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12746 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
12747 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12748 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12749 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12750 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
12751 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12752 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
12753 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012754 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012755 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012756 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012757 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012758 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012759 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012760
12761 /* Restricted:
12762 * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
12763 */
12764 install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
12765 install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012766 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012767 install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
12768 install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012769 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012770 install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
12771 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
12772 install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
12773 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
12774 install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
12775 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
12776 install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
12777 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
12778 install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
12779 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
12780 install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
12781 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
12782 install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
12783 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
12784 install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
12785 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
12786 install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012787 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012788 install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012789 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012790 install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
12791 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
12792 install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
12793 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
12794 install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12795 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12796 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012797 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012798 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012799 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012800
12801 install_element (ENABLE_NODE, &show_bgp_cmd);
12802 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012803 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012804 install_element (ENABLE_NODE, &show_bgp_route_cmd);
12805 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012806 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012807 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
12808 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012809 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012810 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
12811 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
12812 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
12813 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
12814 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
12815 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
12816 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
12817 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
12818 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
12819 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
12820 install_element (ENABLE_NODE, &show_bgp_community_cmd);
12821 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
12822 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
12823 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
12824 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
12825 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
12826 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
12827 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
12828 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12829 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12830 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12831 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12832 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12833 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12834 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12835 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12836 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12837 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12838 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12839 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12840 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12841 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12842 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12843 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12844 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12845 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12846 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12847 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12848 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12849 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012850 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12851 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12852 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12853 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012854 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012855 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012856 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012857 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012858 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012859 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012860 install_element (ENABLE_NODE, &show_bgp_view_cmd);
12861 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12862 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12863 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12864 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12865 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12866 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12867 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12868 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12869 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12870 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12871 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12872 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12873 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12874 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12875 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12876 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12877 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012878 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012879 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012880 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012881 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012882 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012883 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma2815e612006-09-14 02:56:07 +000012884
12885 /* Statistics */
12886 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12887 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12888 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12889 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12890
paul718e3742002-12-13 20:15:29 +000012891 /* old command */
12892 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12893 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12894 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12895 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12896 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12897 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12898 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12899 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12900 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12901 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12902 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12903 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12904 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12905 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12906 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12907 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12908 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12909 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12910 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12911 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12912 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12913 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12914 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12915 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12916 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12917 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12918 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12919 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12920 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12921 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12922 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12923 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12924 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12925 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12926 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12927 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
paulbb46e942003-10-24 19:02:03 +000012928
paul718e3742002-12-13 20:15:29 +000012929 /* old command */
12930 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12931 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12932 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12933 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12934 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12935 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12936 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12937 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12938 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12939 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12940 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12941 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12942 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12943 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12944 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12945 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12946 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12947 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12948 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12949 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12950 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12951 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12952 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12953 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12954 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12955 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12956 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12957 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12958 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12959 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12960 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12961 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12962 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12963 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12964 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12965 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12966
12967 /* old command */
12968 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12969 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12970 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12971 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12972
12973 /* old command */
12974 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12975 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12976 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12977 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12978
12979 /* old command */
12980 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12981 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12982 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12983 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12984#endif /* HAVE_IPV6 */
12985
12986 install_element (BGP_NODE, &bgp_distance_cmd);
12987 install_element (BGP_NODE, &no_bgp_distance_cmd);
12988 install_element (BGP_NODE, &no_bgp_distance2_cmd);
12989 install_element (BGP_NODE, &bgp_distance_source_cmd);
12990 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12991 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12992 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12993
12994 install_element (BGP_NODE, &bgp_damp_set_cmd);
12995 install_element (BGP_NODE, &bgp_damp_set2_cmd);
12996 install_element (BGP_NODE, &bgp_damp_set3_cmd);
12997 install_element (BGP_NODE, &bgp_damp_unset_cmd);
12998 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12999 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
13000 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
13001 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
13002 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
13003 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000013004
13005 /* Deprecated AS-Pathlimit commands */
13006 install_element (BGP_NODE, &bgp_network_ttl_cmd);
13007 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
13008 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
13009 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
13010 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13011 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13012
13013 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
13014 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
13015 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13016 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
13017 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13018 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
13019
13020 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
13021 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
13022 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
13023 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
13024 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13025 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13026
13027 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
13028 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
13029 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13030 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
13031 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13032 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
13033
13034 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
13035 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
13036 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
13037 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
13038 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
13039 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
13040
13041 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
13042 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
13043 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
13044 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
13045 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
13046 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
Paul Jakma3bde17f2011-03-23 10:30:30 +000013047
13048#ifdef HAVE_IPV6
Paul Jakmac8f3fe32010-12-05 20:28:02 +000013049 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
13050 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
Paul Jakma3bde17f2011-03-23 10:30:30 +000013051#endif
paul718e3742002-12-13 20:15:29 +000013052}
Chris Caputo228da422009-07-18 05:44:03 +000013053
13054void
13055bgp_route_finish (void)
13056{
13057 bgp_table_unlock (bgp_distance_table);
13058 bgp_distance_table = NULL;
13059}