blob: 8c05ba6b4f605f357a5b8249d4311d76d4f7052a [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"
paul718e3742002-12-13 20:15:29 +000057
58/* Extern from bgp_dump.c */
Stephen Hemmingerdde72582009-05-08 15:19:07 -070059extern const char *bgp_origin_str[];
60extern const char *bgp_origin_long_str[];
paul718e3742002-12-13 20:15:29 +000061
paul94f2b392005-06-28 12:44:16 +000062static struct bgp_node *
paulfee0f4c2004-09-13 05:12:46 +000063bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
paul718e3742002-12-13 20:15:29 +000064 struct prefix_rd *prd)
65{
66 struct bgp_node *rn;
67 struct bgp_node *prn = NULL;
Paul Jakmada5b30f2006-05-08 14:37:17 +000068
69 assert (table);
70 if (!table)
71 return NULL;
72
paul718e3742002-12-13 20:15:29 +000073 if (safi == SAFI_MPLS_VPN)
74 {
paulfee0f4c2004-09-13 05:12:46 +000075 prn = bgp_node_get (table, (struct prefix *) prd);
paul718e3742002-12-13 20:15:29 +000076
77 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +000078 prn->info = bgp_table_init (afi, safi);
paul718e3742002-12-13 20:15:29 +000079 else
80 bgp_unlock_node (prn);
81 table = prn->info;
82 }
paul718e3742002-12-13 20:15:29 +000083
84 rn = bgp_node_get (table, p);
85
86 if (safi == SAFI_MPLS_VPN)
87 rn->prn = prn;
88
89 return rn;
90}
91
Paul Jakmafb982c22007-05-04 20:15:47 +000092/* Allocate bgp_info_extra */
93static struct bgp_info_extra *
94bgp_info_extra_new (void)
95{
96 struct bgp_info_extra *new;
97 new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
98 return new;
99}
100
101static void
102bgp_info_extra_free (struct bgp_info_extra **extra)
103{
104 if (extra && *extra)
105 {
106 if ((*extra)->damp_info)
107 bgp_damp_info_free ((*extra)->damp_info, 0);
108
109 (*extra)->damp_info = NULL;
110
111 XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
112
113 *extra = NULL;
114 }
115}
116
117/* Get bgp_info extra information for the given bgp_info, lazy allocated
118 * if required.
119 */
120struct bgp_info_extra *
121bgp_info_extra_get (struct bgp_info *ri)
122{
123 if (!ri->extra)
124 ri->extra = bgp_info_extra_new();
125 return ri->extra;
126}
127
paul718e3742002-12-13 20:15:29 +0000128/* Allocate new bgp info structure. */
paul200df112005-06-01 11:17:05 +0000129static struct bgp_info *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -0800130bgp_info_new (void)
paul718e3742002-12-13 20:15:29 +0000131{
Stephen Hemminger393deb92008-08-18 14:13:29 -0700132 return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
paul718e3742002-12-13 20:15:29 +0000133}
134
135/* Free bgp route information. */
paul200df112005-06-01 11:17:05 +0000136static void
paul718e3742002-12-13 20:15:29 +0000137bgp_info_free (struct bgp_info *binfo)
138{
139 if (binfo->attr)
140 bgp_attr_unintern (binfo->attr);
Paul Jakmafb982c22007-05-04 20:15:47 +0000141
142 bgp_info_extra_free (&binfo->extra);
paul718e3742002-12-13 20:15:29 +0000143
paul200df112005-06-01 11:17:05 +0000144 peer_unlock (binfo->peer); /* bgp_info peer reference */
145
paul718e3742002-12-13 20:15:29 +0000146 XFREE (MTYPE_BGP_ROUTE, binfo);
147}
148
paul200df112005-06-01 11:17:05 +0000149struct bgp_info *
150bgp_info_lock (struct bgp_info *binfo)
151{
152 binfo->lock++;
153 return binfo;
154}
155
156struct bgp_info *
157bgp_info_unlock (struct bgp_info *binfo)
158{
159 assert (binfo && binfo->lock > 0);
160 binfo->lock--;
161
162 if (binfo->lock == 0)
163 {
164#if 0
165 zlog_debug ("%s: unlocked and freeing", __func__);
166 zlog_backtrace (LOG_DEBUG);
167#endif
168 bgp_info_free (binfo);
169 return NULL;
170 }
171
172#if 0
173 if (binfo->lock == 1)
174 {
175 zlog_debug ("%s: unlocked to 1", __func__);
176 zlog_backtrace (LOG_DEBUG);
177 }
178#endif
179
180 return binfo;
181}
182
paul718e3742002-12-13 20:15:29 +0000183void
184bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
185{
186 struct bgp_info *top;
187
188 top = rn->info;
paul200df112005-06-01 11:17:05 +0000189
paul718e3742002-12-13 20:15:29 +0000190 ri->next = rn->info;
191 ri->prev = NULL;
192 if (top)
193 top->prev = ri;
194 rn->info = ri;
paul200df112005-06-01 11:17:05 +0000195
196 bgp_info_lock (ri);
197 bgp_lock_node (rn);
198 peer_lock (ri->peer); /* bgp_info peer reference */
paul718e3742002-12-13 20:15:29 +0000199}
200
paulb40d9392005-08-22 22:34:41 +0000201/* Do the actual removal of info from RIB, for use by bgp_process
202 completion callback *only* */
203static void
204bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
paul718e3742002-12-13 20:15:29 +0000205{
206 if (ri->next)
207 ri->next->prev = ri->prev;
208 if (ri->prev)
209 ri->prev->next = ri->next;
210 else
211 rn->info = ri->next;
paul200df112005-06-01 11:17:05 +0000212
213 bgp_info_unlock (ri);
214 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +0000215}
216
paulb40d9392005-08-22 22:34:41 +0000217void
218bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
219{
Paul Jakma1a392d42006-09-07 00:24:49 +0000220 bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
221 /* set of previous already took care of pcount */
paulb40d9392005-08-22 22:34:41 +0000222 UNSET_FLAG (ri->flags, BGP_INFO_VALID);
223}
224
Andrew J. Schorr8d452102006-11-28 19:50:46 +0000225/* undo the effects of a previous call to bgp_info_delete; typically
226 called when a route is deleted and then quickly re-added before the
227 deletion has been processed */
228static void
229bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
230{
231 bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
232 /* unset of previous already took care of pcount */
233 SET_FLAG (ri->flags, BGP_INFO_VALID);
234}
235
Paul Jakma1a392d42006-09-07 00:24:49 +0000236/* Adjust pcount as required */
237static void
238bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
239{
Paul Jakma6f585442006-10-22 19:13:07 +0000240 assert (rn && rn->table);
241 assert (ri && ri->peer && ri->peer->bgp);
242
Paul Jakma1a392d42006-09-07 00:24:49 +0000243 /* Ignore 'pcount' for RS-client tables */
244 if (rn->table->type != BGP_TABLE_MAIN
245 || ri->peer == ri->peer->bgp->peer_self)
246 return;
247
248 if (BGP_INFO_HOLDDOWN (ri)
249 && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
250 {
251
252 UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
253
254 /* slight hack, but more robust against errors. */
255 if (ri->peer->pcount[rn->table->afi][rn->table->safi])
256 ri->peer->pcount[rn->table->afi][rn->table->safi]--;
257 else
258 {
259 zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
260 __func__, ri->peer->host);
261 zlog_backtrace (LOG_WARNING);
262 zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
263 }
264 }
265 else if (!BGP_INFO_HOLDDOWN (ri)
266 && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
267 {
268 SET_FLAG (ri->flags, BGP_INFO_COUNTED);
269 ri->peer->pcount[rn->table->afi][rn->table->safi]++;
270 }
271}
272
273
274/* Set/unset bgp_info flags, adjusting any other state as needed.
275 * This is here primarily to keep prefix-count in check.
276 */
277void
278bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
279{
280 SET_FLAG (ri->flags, flag);
281
282 /* early bath if we know it's not a flag that changes useability state */
283 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
284 return;
285
286 bgp_pcount_adjust (rn, ri);
287}
288
289void
290bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
291{
292 UNSET_FLAG (ri->flags, flag);
293
294 /* early bath if we know it's not a flag that changes useability state */
295 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
296 return;
297
298 bgp_pcount_adjust (rn, ri);
299}
300
paul718e3742002-12-13 20:15:29 +0000301/* Get MED value. If MED value is missing and "bgp bestpath
302 missing-as-worst" is specified, treat it as the worst value. */
paul94f2b392005-06-28 12:44:16 +0000303static u_int32_t
paul718e3742002-12-13 20:15:29 +0000304bgp_med_value (struct attr *attr, struct bgp *bgp)
305{
306 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
307 return attr->med;
308 else
309 {
310 if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
paul3b424972003-10-13 09:47:32 +0000311 return BGP_MED_MAX;
paul718e3742002-12-13 20:15:29 +0000312 else
313 return 0;
314 }
315}
316
317/* Compare two bgp route entity. br is preferable then return 1. */
paul94f2b392005-06-28 12:44:16 +0000318static int
paul718e3742002-12-13 20:15:29 +0000319bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
320{
321 u_int32_t new_pref;
322 u_int32_t exist_pref;
323 u_int32_t new_med;
324 u_int32_t exist_med;
Paul Jakmafb982c22007-05-04 20:15:47 +0000325 u_int32_t new_weight = 0;
326 u_int32_t exist_weight = 0;
paul718e3742002-12-13 20:15:29 +0000327 struct in_addr new_id;
328 struct in_addr exist_id;
329 int new_cluster;
330 int exist_cluster;
331 int internal_as_route = 0;
332 int confed_as_route = 0;
333 int ret;
334
335 /* 0. Null check. */
336 if (new == NULL)
337 return 0;
338 if (exist == NULL)
339 return 1;
340
341 /* 1. Weight check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000342 if (new->attr->extra)
343 new_weight = new->attr->extra->weight;
344 if (exist->attr->extra)
345 exist_weight = exist->attr->extra->weight;
346 if (new_weight > exist_weight)
paul718e3742002-12-13 20:15:29 +0000347 return 1;
Paul Jakmafb982c22007-05-04 20:15:47 +0000348 if (new_weight < exist_weight)
paul718e3742002-12-13 20:15:29 +0000349 return 0;
350
351 /* 2. Local preference check. */
352 if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
353 new_pref = new->attr->local_pref;
354 else
355 new_pref = bgp->default_local_pref;
356
357 if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
358 exist_pref = exist->attr->local_pref;
359 else
360 exist_pref = bgp->default_local_pref;
361
362 if (new_pref > exist_pref)
363 return 1;
364 if (new_pref < exist_pref)
365 return 0;
366
367 /* 3. Local route check. */
368 if (new->sub_type == BGP_ROUTE_STATIC)
369 return 1;
370 if (exist->sub_type == BGP_ROUTE_STATIC)
371 return 0;
372
373 if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
374 return 1;
375 if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
376 return 0;
377
378 if (new->sub_type == BGP_ROUTE_AGGREGATE)
379 return 1;
380 if (exist->sub_type == BGP_ROUTE_AGGREGATE)
381 return 0;
382
383 /* 4. AS path length check. */
384 if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
385 {
paulfe69a502005-09-10 16:55:02 +0000386 int exist_hops = aspath_count_hops (exist->attr->aspath);
387 int exist_confeds = aspath_count_confeds (exist->attr->aspath);
388
hasso68118452005-04-08 15:40:36 +0000389 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
390 {
paulfe69a502005-09-10 16:55:02 +0000391 int aspath_hops;
392
393 aspath_hops = aspath_count_hops (new->attr->aspath);
394 aspath_hops += aspath_count_confeds (new->attr->aspath);
395
396 if ( aspath_hops < (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000397 return 1;
paulfe69a502005-09-10 16:55:02 +0000398 if ( aspath_hops > (exist_hops + exist_confeds))
hasso68118452005-04-08 15:40:36 +0000399 return 0;
400 }
401 else
402 {
paulfe69a502005-09-10 16:55:02 +0000403 int newhops = aspath_count_hops (new->attr->aspath);
404
405 if (newhops < exist_hops)
hasso68118452005-04-08 15:40:36 +0000406 return 1;
paulfe69a502005-09-10 16:55:02 +0000407 if (newhops > exist_hops)
hasso68118452005-04-08 15:40:36 +0000408 return 0;
409 }
paul718e3742002-12-13 20:15:29 +0000410 }
411
412 /* 5. Origin check. */
413 if (new->attr->origin < exist->attr->origin)
414 return 1;
415 if (new->attr->origin > exist->attr->origin)
416 return 0;
417
418 /* 6. MED check. */
paulfe69a502005-09-10 16:55:02 +0000419 internal_as_route = (aspath_count_hops (new->attr->aspath) == 0
420 && aspath_count_hops (exist->attr->aspath) == 0);
421 confed_as_route = (aspath_count_confeds (new->attr->aspath) > 0
422 && aspath_count_confeds (exist->attr->aspath) > 0
423 && aspath_count_hops (new->attr->aspath) == 0
424 && aspath_count_hops (exist->attr->aspath) == 0);
paul718e3742002-12-13 20:15:29 +0000425
426 if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
427 || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
428 && confed_as_route)
429 || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
430 || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
431 || internal_as_route)
432 {
433 new_med = bgp_med_value (new->attr, bgp);
434 exist_med = bgp_med_value (exist->attr, bgp);
435
436 if (new_med < exist_med)
437 return 1;
438 if (new_med > exist_med)
439 return 0;
440 }
441
442 /* 7. Peer type check. */
443 if (peer_sort (new->peer) == BGP_PEER_EBGP
444 && peer_sort (exist->peer) == BGP_PEER_IBGP)
445 return 1;
446 if (peer_sort (new->peer) == BGP_PEER_EBGP
447 && peer_sort (exist->peer) == BGP_PEER_CONFED)
448 return 1;
449 if (peer_sort (new->peer) == BGP_PEER_IBGP
450 && peer_sort (exist->peer) == BGP_PEER_EBGP)
451 return 0;
452 if (peer_sort (new->peer) == BGP_PEER_CONFED
453 && peer_sort (exist->peer) == BGP_PEER_EBGP)
454 return 0;
455
456 /* 8. IGP metric check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000457 if (new->extra || exist->extra)
458 {
459 uint32_t newm = (new->extra ? new->extra->igpmetric : 0);
460 uint32_t existm = (exist->extra ? exist->extra->igpmetric : 0);
461
462 if (newm < existm)
463 return 1;
464 if (newm > existm)
465 return 0;
466 }
paul718e3742002-12-13 20:15:29 +0000467
468 /* 9. Maximum path check. */
469
470 /* 10. If both paths are external, prefer the path that was received
471 first (the oldest one). This step minimizes route-flap, since a
472 newer path won't displace an older one, even if it was the
473 preferred route based on the additional decision criteria below. */
474 if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
475 && peer_sort (new->peer) == BGP_PEER_EBGP
476 && peer_sort (exist->peer) == BGP_PEER_EBGP)
477 {
478 if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
479 return 1;
480 if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
481 return 0;
482 }
483
484 /* 11. Rourter-ID comparision. */
485 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +0000486 new_id.s_addr = new->attr->extra->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000487 else
488 new_id.s_addr = new->peer->remote_id.s_addr;
489 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +0000490 exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
paul718e3742002-12-13 20:15:29 +0000491 else
492 exist_id.s_addr = exist->peer->remote_id.s_addr;
493
494 if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
495 return 1;
496 if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
497 return 0;
498
499 /* 12. Cluster length comparision. */
500 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
Paul Jakmafb982c22007-05-04 20:15:47 +0000501 new_cluster = new->attr->extra->cluster->length;
paul718e3742002-12-13 20:15:29 +0000502 else
503 new_cluster = 0;
504 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
Paul Jakmafb982c22007-05-04 20:15:47 +0000505 exist_cluster = exist->attr->extra->cluster->length;
paul718e3742002-12-13 20:15:29 +0000506 else
507 exist_cluster = 0;
508
509 if (new_cluster < exist_cluster)
510 return 1;
511 if (new_cluster > exist_cluster)
512 return 0;
513
514 /* 13. Neighbor address comparision. */
515 ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
516
517 if (ret == 1)
518 return 0;
519 if (ret == -1)
520 return 1;
521
522 return 1;
523}
524
paul94f2b392005-06-28 12:44:16 +0000525static enum filter_type
paul718e3742002-12-13 20:15:29 +0000526bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
527 afi_t afi, safi_t safi)
528{
529 struct bgp_filter *filter;
530
531 filter = &peer->filter[afi][safi];
532
Paul Jakma650f76c2009-06-25 18:06:31 +0100533#define FILTER_EXIST_WARN(F,f,filter) \
534 if (BGP_DEBUG (update, UPDATE_IN) \
535 && !(F ## _IN (filter))) \
536 plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
537 peer->host, #f, F ## _IN_NAME(filter));
538
539 if (DISTRIBUTE_IN_NAME (filter)) {
540 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
541
paul718e3742002-12-13 20:15:29 +0000542 if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
543 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100544 }
paul718e3742002-12-13 20:15:29 +0000545
Paul Jakma650f76c2009-06-25 18:06:31 +0100546 if (PREFIX_LIST_IN_NAME (filter)) {
547 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
548
paul718e3742002-12-13 20:15:29 +0000549 if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
550 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100551 }
paul718e3742002-12-13 20:15:29 +0000552
Paul Jakma650f76c2009-06-25 18:06:31 +0100553 if (FILTER_LIST_IN_NAME (filter)) {
554 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
555
paul718e3742002-12-13 20:15:29 +0000556 if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
557 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100558 }
559
paul718e3742002-12-13 20:15:29 +0000560 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100561#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000562}
563
paul94f2b392005-06-28 12:44:16 +0000564static enum filter_type
paul718e3742002-12-13 20:15:29 +0000565bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
566 afi_t afi, safi_t safi)
567{
568 struct bgp_filter *filter;
569
570 filter = &peer->filter[afi][safi];
571
Paul Jakma650f76c2009-06-25 18:06:31 +0100572#define FILTER_EXIST_WARN(F,f,filter) \
573 if (BGP_DEBUG (update, UPDATE_OUT) \
574 && !(F ## _OUT (filter))) \
575 plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
576 peer->host, #f, F ## _OUT_NAME(filter));
577
578 if (DISTRIBUTE_OUT_NAME (filter)) {
579 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
580
paul718e3742002-12-13 20:15:29 +0000581 if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
582 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100583 }
paul718e3742002-12-13 20:15:29 +0000584
Paul Jakma650f76c2009-06-25 18:06:31 +0100585 if (PREFIX_LIST_OUT_NAME (filter)) {
586 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
587
paul718e3742002-12-13 20:15:29 +0000588 if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
589 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100590 }
paul718e3742002-12-13 20:15:29 +0000591
Paul Jakma650f76c2009-06-25 18:06:31 +0100592 if (FILTER_LIST_OUT_NAME (filter)) {
593 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
594
paul718e3742002-12-13 20:15:29 +0000595 if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
596 return FILTER_DENY;
Paul Jakma650f76c2009-06-25 18:06:31 +0100597 }
paul718e3742002-12-13 20:15:29 +0000598
599 return FILTER_PERMIT;
Paul Jakma650f76c2009-06-25 18:06:31 +0100600#undef FILTER_EXIST_WARN
paul718e3742002-12-13 20:15:29 +0000601}
602
603/* If community attribute includes no_export then return 1. */
paul94f2b392005-06-28 12:44:16 +0000604static int
paul718e3742002-12-13 20:15:29 +0000605bgp_community_filter (struct peer *peer, struct attr *attr)
606{
607 if (attr->community)
608 {
609 /* NO_ADVERTISE check. */
610 if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
611 return 1;
612
613 /* NO_EXPORT check. */
614 if (peer_sort (peer) == BGP_PEER_EBGP &&
615 community_include (attr->community, COMMUNITY_NO_EXPORT))
616 return 1;
617
618 /* NO_EXPORT_SUBCONFED check. */
619 if (peer_sort (peer) == BGP_PEER_EBGP
620 || peer_sort (peer) == BGP_PEER_CONFED)
621 if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
622 return 1;
623 }
624 return 0;
625}
626
627/* Route reflection loop check. */
628static int
629bgp_cluster_filter (struct peer *peer, struct attr *attr)
630{
631 struct in_addr cluster_id;
632
Paul Jakmafb982c22007-05-04 20:15:47 +0000633 if (attr->extra && attr->extra->cluster)
paul718e3742002-12-13 20:15:29 +0000634 {
635 if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
636 cluster_id = peer->bgp->cluster_id;
637 else
638 cluster_id = peer->bgp->router_id;
639
Paul Jakmafb982c22007-05-04 20:15:47 +0000640 if (cluster_loop_check (attr->extra->cluster, cluster_id))
paul718e3742002-12-13 20:15:29 +0000641 return 1;
642 }
643 return 0;
644}
645
paul94f2b392005-06-28 12:44:16 +0000646static int
paul718e3742002-12-13 20:15:29 +0000647bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
648 afi_t afi, safi_t safi)
649{
650 struct bgp_filter *filter;
651 struct bgp_info info;
652 route_map_result_t ret;
653
654 filter = &peer->filter[afi][safi];
655
656 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000657 if (peer->weight)
658 (bgp_attr_extra_get (attr))->weight = peer->weight;
paul718e3742002-12-13 20:15:29 +0000659
660 /* Route map apply. */
661 if (ROUTE_MAP_IN_NAME (filter))
662 {
663 /* Duplicate current value to new strucutre for modification. */
664 info.peer = peer;
665 info.attr = attr;
666
paulac41b2a2003-08-12 05:32:27 +0000667 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
668
paul718e3742002-12-13 20:15:29 +0000669 /* Apply BGP route map to the attribute. */
670 ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
paulac41b2a2003-08-12 05:32:27 +0000671
672 peer->rmap_type = 0;
673
paul718e3742002-12-13 20:15:29 +0000674 if (ret == RMAP_DENYMATCH)
675 {
676 /* Free newly generated AS path and community by route-map. */
677 bgp_attr_flush (attr);
678 return RMAP_DENY;
679 }
680 }
681 return RMAP_PERMIT;
682}
683
paul94f2b392005-06-28 12:44:16 +0000684static int
paulfee0f4c2004-09-13 05:12:46 +0000685bgp_export_modifier (struct peer *rsclient, struct peer *peer,
686 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
687{
688 struct bgp_filter *filter;
689 struct bgp_info info;
690 route_map_result_t ret;
691
692 filter = &peer->filter[afi][safi];
693
694 /* Route map apply. */
695 if (ROUTE_MAP_EXPORT_NAME (filter))
696 {
697 /* Duplicate current value to new strucutre for modification. */
698 info.peer = rsclient;
699 info.attr = attr;
700
701 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
702
703 /* Apply BGP route map to the attribute. */
704 ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
705
706 rsclient->rmap_type = 0;
707
708 if (ret == RMAP_DENYMATCH)
709 {
710 /* Free newly generated AS path and community by route-map. */
711 bgp_attr_flush (attr);
712 return RMAP_DENY;
713 }
714 }
715 return RMAP_PERMIT;
716}
717
paul94f2b392005-06-28 12:44:16 +0000718static int
paulfee0f4c2004-09-13 05:12:46 +0000719bgp_import_modifier (struct peer *rsclient, struct peer *peer,
720 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
721{
722 struct bgp_filter *filter;
723 struct bgp_info info;
724 route_map_result_t ret;
725
726 filter = &rsclient->filter[afi][safi];
727
728 /* Apply default weight value. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000729 if (peer->weight)
730 (bgp_attr_extra_get (attr))->weight = peer->weight;
paulfee0f4c2004-09-13 05:12:46 +0000731
732 /* Route map apply. */
733 if (ROUTE_MAP_IMPORT_NAME (filter))
734 {
735 /* Duplicate current value to new strucutre for modification. */
736 info.peer = peer;
737 info.attr = attr;
738
739 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
740
741 /* Apply BGP route map to the attribute. */
742 ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
743
744 peer->rmap_type = 0;
745
746 if (ret == RMAP_DENYMATCH)
747 {
748 /* Free newly generated AS path and community by route-map. */
749 bgp_attr_flush (attr);
750 return RMAP_DENY;
751 }
752 }
753 return RMAP_PERMIT;
754}
755
paul94f2b392005-06-28 12:44:16 +0000756static int
paul718e3742002-12-13 20:15:29 +0000757bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
758 struct attr *attr, afi_t afi, safi_t safi)
759{
760 int ret;
761 char buf[SU_ADDRSTRLEN];
762 struct bgp_filter *filter;
paul718e3742002-12-13 20:15:29 +0000763 struct peer *from;
764 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +0000765 int transparent;
766 int reflect;
767
768 from = ri->peer;
769 filter = &peer->filter[afi][safi];
770 bgp = peer->bgp;
771
Paul Jakma750e8142008-07-22 21:11:48 +0000772 if (DISABLE_BGP_ANNOUNCE)
773 return 0;
paul718e3742002-12-13 20:15:29 +0000774
paulfee0f4c2004-09-13 05:12:46 +0000775 /* Do not send announces to RS-clients from the 'normal' bgp_table. */
776 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
777 return 0;
778
paul718e3742002-12-13 20:15:29 +0000779 /* Do not send back route to sender. */
780 if (from == peer)
781 return 0;
782
paul35be31b2004-05-01 18:17:04 +0000783 /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
784 if (p->family == AF_INET
785 && IPV4_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
786 return 0;
787#ifdef HAVE_IPV6
788 if (p->family == AF_INET6
789 && IPV6_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
790 return 0;
791#endif
792
paul718e3742002-12-13 20:15:29 +0000793 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000794 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +0000795 if (! UNSUPPRESS_MAP_NAME (filter))
796 return 0;
797
798 /* Default route check. */
799 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
800 {
801 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
802 return 0;
803#ifdef HAVE_IPV6
804 else if (p->family == AF_INET6 && p->prefixlen == 0)
805 return 0;
806#endif /* HAVE_IPV6 */
807 }
808
paul286e1e72003-08-08 00:24:31 +0000809 /* Transparency check. */
810 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
811 && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
812 transparent = 1;
813 else
814 transparent = 0;
815
paul718e3742002-12-13 20:15:29 +0000816 /* If community is not disabled check the no-export and local. */
paul286e1e72003-08-08 00:24:31 +0000817 if (! transparent && bgp_community_filter (peer, ri->attr))
paul718e3742002-12-13 20:15:29 +0000818 return 0;
819
820 /* If the attribute has originator-id and it is same as remote
821 peer's id. */
822 if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
823 {
Paul Jakmafb982c22007-05-04 20:15:47 +0000824 if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +0000825 {
826 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000827 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +0000828 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
829 peer->host,
830 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
831 p->prefixlen);
832 return 0;
833 }
834 }
835
836 /* ORF prefix-list filter check */
837 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
838 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
839 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
840 if (peer->orf_plist[afi][safi])
841 {
842 if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
843 return 0;
844 }
845
846 /* Output filter check. */
847 if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
848 {
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 is filtered",
852 peer->host,
853 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
854 p->prefixlen);
855 return 0;
856 }
857
858#ifdef BGP_SEND_ASPATH_CHECK
859 /* AS path loop check. */
860 if (aspath_loop_check (ri->attr->aspath, peer->as))
861 {
862 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000863 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400864 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000865 peer->host, peer->as);
866 return 0;
867 }
868#endif /* BGP_SEND_ASPATH_CHECK */
869
870 /* If we're a CONFED we need to loop check the CONFED ID too */
871 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
872 {
873 if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
874 {
875 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +0000876 zlog (peer->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400877 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paul718e3742002-12-13 20:15:29 +0000878 peer->host,
879 bgp->confed_id);
880 return 0;
881 }
882 }
883
884 /* Route-Reflect check. */
885 if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
886 reflect = 1;
887 else
888 reflect = 0;
889
890 /* IBGP reflection check. */
891 if (reflect)
892 {
893 /* A route from a Client peer. */
894 if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
895 {
896 /* Reflect to all the Non-Client peers and also to the
897 Client peers other than the originator. Originator check
898 is already done. So there is noting to do. */
899 /* no bgp client-to-client reflection check. */
900 if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
901 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
902 return 0;
903 }
904 else
905 {
906 /* A route from a Non-client peer. Reflect to all other
907 clients. */
908 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
909 return 0;
910 }
911 }
Paul Jakma41367172007-08-06 15:24:51 +0000912
paul718e3742002-12-13 20:15:29 +0000913 /* For modify attribute, copy it to temporary structure. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000914 bgp_attr_dup (attr, ri->attr);
915
paul718e3742002-12-13 20:15:29 +0000916 /* If local-preference is not set. */
917 if ((peer_sort (peer) == BGP_PEER_IBGP
918 || peer_sort (peer) == BGP_PEER_CONFED)
919 && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
920 {
921 attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
922 attr->local_pref = bgp->default_local_pref;
923 }
924
paul718e3742002-12-13 20:15:29 +0000925 /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
926 if (peer_sort (peer) == BGP_PEER_EBGP
927 && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
928 {
929 if (ri->peer != bgp->peer_self && ! transparent
930 && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
931 attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
932 }
933
934 /* next-hop-set */
935 if (transparent || reflect
936 || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
937 && ((p->family == AF_INET && attr->nexthop.s_addr)
paul286e1e72003-08-08 00:24:31 +0000938#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000939 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000940 ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul286e1e72003-08-08 00:24:31 +0000941#endif /* HAVE_IPV6 */
942 )))
paul718e3742002-12-13 20:15:29 +0000943 {
944 /* NEXT-HOP Unchanged. */
945 }
946 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
947 || (p->family == AF_INET && attr->nexthop.s_addr == 0)
948#ifdef HAVE_IPV6
paulfee0f4c2004-09-13 05:12:46 +0000949 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +0000950 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paul718e3742002-12-13 20:15:29 +0000951#endif /* HAVE_IPV6 */
952 || (peer_sort (peer) == BGP_PEER_EBGP
953 && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
954 {
955 /* Set IPv4 nexthop. */
956 if (p->family == AF_INET)
957 {
958 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +0000959 memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
960 IPV4_MAX_BYTELEN);
paul718e3742002-12-13 20:15:29 +0000961 else
962 memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
963 }
964#ifdef HAVE_IPV6
965 /* Set IPv6 nexthop. */
966 if (p->family == AF_INET6)
967 {
968 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000969 memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +0000970 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +0000971 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +0000972 }
973#endif /* HAVE_IPV6 */
974 }
975
976#ifdef HAVE_IPV6
977 if (p->family == AF_INET6)
978 {
paulfee0f4c2004-09-13 05:12:46 +0000979 /* Left nexthop_local unchanged if so configured. */
980 if ( CHECK_FLAG (peer->af_flags[afi][safi],
981 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
982 {
Paul Jakmafb982c22007-05-04 20:15:47 +0000983 if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
984 attr->extra->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +0000985 else
Paul Jakmafb982c22007-05-04 20:15:47 +0000986 attr->extra->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +0000987 }
988
989 /* Default nexthop_local treatment for non-RS-Clients */
990 else
991 {
paul718e3742002-12-13 20:15:29 +0000992 /* Link-local address should not be transit to different peer. */
Paul Jakmafb982c22007-05-04 20:15:47 +0000993 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +0000994
995 /* Set link-local address for shared network peer. */
996 if (peer->shared_network
997 && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
998 {
Paul Jakmafb982c22007-05-04 20:15:47 +0000999 memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00001000 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001001 attr->extra->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00001002 }
1003
1004 /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1005 address.*/
1006 if (reflect)
Paul Jakmafb982c22007-05-04 20:15:47 +00001007 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001008
1009 /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1010 if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
Paul Jakmafb982c22007-05-04 20:15:47 +00001011 attr->extra->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00001012 }
paulfee0f4c2004-09-13 05:12:46 +00001013
1014 }
paul718e3742002-12-13 20:15:29 +00001015#endif /* HAVE_IPV6 */
1016
1017 /* If this is EBGP peer and remove-private-AS is set. */
1018 if (peer_sort (peer) == BGP_PEER_EBGP
1019 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1020 && aspath_private_as_check (attr->aspath))
1021 attr->aspath = aspath_empty_get ();
1022
1023 /* Route map & unsuppress-map apply. */
1024 if (ROUTE_MAP_OUT_NAME (filter)
Paul Jakmafb982c22007-05-04 20:15:47 +00001025 || (ri->extra && ri->extra->suppress) )
paul718e3742002-12-13 20:15:29 +00001026 {
Paul Jakma7c7fa1b2006-02-18 10:52:09 +00001027 struct bgp_info info;
Paul Jakma9eda90c2007-08-30 13:36:17 +00001028 struct attr dummy_attr = { 0 };
Paul Jakma7c7fa1b2006-02-18 10:52:09 +00001029
paul718e3742002-12-13 20:15:29 +00001030 info.peer = peer;
1031 info.attr = attr;
1032
1033 /* The route reflector is not allowed to modify the attributes
1034 of the reflected IBGP routes. */
1035 if (peer_sort (from) == BGP_PEER_IBGP
1036 && peer_sort (peer) == BGP_PEER_IBGP)
1037 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001038 bgp_attr_dup (&dummy_attr, attr);
Paul Jakma9eda90c2007-08-30 13:36:17 +00001039 info.attr = &dummy_attr;
paul718e3742002-12-13 20:15:29 +00001040 }
paulac41b2a2003-08-12 05:32:27 +00001041
1042 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1043
Paul Jakmafb982c22007-05-04 20:15:47 +00001044 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00001045 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1046 else
1047 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1048
paulac41b2a2003-08-12 05:32:27 +00001049 peer->rmap_type = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00001050
Paul Jakma9eda90c2007-08-30 13:36:17 +00001051 if (dummy_attr.extra)
1052 bgp_attr_extra_free (&dummy_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001053
paul718e3742002-12-13 20:15:29 +00001054 if (ret == RMAP_DENYMATCH)
1055 {
1056 bgp_attr_flush (attr);
1057 return 0;
1058 }
1059 }
1060 return 1;
1061}
1062
paul94f2b392005-06-28 12:44:16 +00001063static int
paulfee0f4c2004-09-13 05:12:46 +00001064bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1065 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001066{
paulfee0f4c2004-09-13 05:12:46 +00001067 int ret;
1068 char buf[SU_ADDRSTRLEN];
1069 struct bgp_filter *filter;
1070 struct bgp_info info;
1071 struct peer *from;
1072 struct bgp *bgp;
1073
1074 from = ri->peer;
1075 filter = &rsclient->filter[afi][safi];
1076 bgp = rsclient->bgp;
1077
Paul Jakma750e8142008-07-22 21:11:48 +00001078 if (DISABLE_BGP_ANNOUNCE)
1079 return 0;
paulfee0f4c2004-09-13 05:12:46 +00001080
1081 /* Do not send back route to sender. */
1082 if (from == rsclient)
1083 return 0;
1084
1085 /* Aggregate-address suppress check. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001086 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001087 if (! UNSUPPRESS_MAP_NAME (filter))
1088 return 0;
1089
1090 /* Default route check. */
1091 if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1092 PEER_STATUS_DEFAULT_ORIGINATE))
1093 {
1094 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1095 return 0;
1096#ifdef HAVE_IPV6
1097 else if (p->family == AF_INET6 && p->prefixlen == 0)
1098 return 0;
1099#endif /* HAVE_IPV6 */
1100 }
1101
1102 /* If the attribute has originator-id and it is same as remote
1103 peer's id. */
1104 if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
1105 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001106 if (IPV4_ADDR_SAME (&rsclient->remote_id,
1107 &ri->attr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001108 {
1109 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001110 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001111 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1112 rsclient->host,
1113 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1114 p->prefixlen);
1115 return 0;
1116 }
1117 }
1118
1119 /* ORF prefix-list filter check */
1120 if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1121 && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1122 || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1123 if (rsclient->orf_plist[afi][safi])
1124 {
1125 if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1126 return 0;
1127 }
1128
1129 /* Output filter check. */
1130 if (bgp_output_filter (rsclient, p, ri->attr, afi, safi) == FILTER_DENY)
1131 {
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 is filtered",
1135 rsclient->host,
1136 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1137 p->prefixlen);
1138 return 0;
1139 }
1140
1141#ifdef BGP_SEND_ASPATH_CHECK
1142 /* AS path loop check. */
1143 if (aspath_loop_check (ri->attr->aspath, rsclient->as))
1144 {
1145 if (BGP_DEBUG (filter, FILTER))
ajsd2c1f162004-12-08 21:10:20 +00001146 zlog (rsclient->log, LOG_DEBUG,
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04001147 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
paulfee0f4c2004-09-13 05:12:46 +00001148 rsclient->host, rsclient->as);
1149 return 0;
1150 }
1151#endif /* BGP_SEND_ASPATH_CHECK */
1152
1153 /* For modify attribute, copy it to temporary structure. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001154 bgp_attr_dup (attr, ri->attr);
paulfee0f4c2004-09-13 05:12:46 +00001155
1156 /* next-hop-set */
1157 if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1158#ifdef HAVE_IPV6
1159 || (p->family == AF_INET6 &&
Paul Jakmafb982c22007-05-04 20:15:47 +00001160 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
paulfee0f4c2004-09-13 05:12:46 +00001161#endif /* HAVE_IPV6 */
1162 )
1163 {
1164 /* Set IPv4 nexthop. */
1165 if (p->family == AF_INET)
1166 {
1167 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001168 memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
paulfee0f4c2004-09-13 05:12:46 +00001169 IPV4_MAX_BYTELEN);
1170 else
1171 memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1172 }
1173#ifdef HAVE_IPV6
1174 /* Set IPv6 nexthop. */
1175 if (p->family == AF_INET6)
1176 {
1177 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001178 memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
paulfee0f4c2004-09-13 05:12:46 +00001179 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001180 attr->extra->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001181 }
1182#endif /* HAVE_IPV6 */
1183 }
1184
1185#ifdef HAVE_IPV6
1186 if (p->family == AF_INET6)
1187 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001188 struct attr_extra *attre = attr->extra;
1189
1190 assert (attr->extra);
1191
paulfee0f4c2004-09-13 05:12:46 +00001192 /* Left nexthop_local unchanged if so configured. */
1193 if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1194 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1195 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001196 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1197 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001198 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001199 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001200 }
1201
1202 /* Default nexthop_local treatment for RS-Clients */
1203 else
1204 {
1205 /* Announcer and RS-Client are both in the same network */
1206 if (rsclient->shared_network && from->shared_network &&
1207 (rsclient->ifindex == from->ifindex))
1208 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001209 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1210 attre->mp_nexthop_len=32;
paulfee0f4c2004-09-13 05:12:46 +00001211 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001212 attre->mp_nexthop_len=16;
paulfee0f4c2004-09-13 05:12:46 +00001213 }
1214
1215 /* Set link-local address for shared network peer. */
1216 else if (rsclient->shared_network
1217 && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1218 {
Paul Jakmafb982c22007-05-04 20:15:47 +00001219 memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
paulfee0f4c2004-09-13 05:12:46 +00001220 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00001221 attre->mp_nexthop_len = 32;
paulfee0f4c2004-09-13 05:12:46 +00001222 }
1223
1224 else
Paul Jakmafb982c22007-05-04 20:15:47 +00001225 attre->mp_nexthop_len = 16;
paulfee0f4c2004-09-13 05:12:46 +00001226 }
1227
1228 }
1229#endif /* HAVE_IPV6 */
1230
1231
1232 /* If this is EBGP peer and remove-private-AS is set. */
1233 if (peer_sort (rsclient) == BGP_PEER_EBGP
1234 && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1235 && aspath_private_as_check (attr->aspath))
1236 attr->aspath = aspath_empty_get ();
1237
1238 /* Route map & unsuppress-map apply. */
Paul Jakmafb982c22007-05-04 20:15:47 +00001239 if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
paulfee0f4c2004-09-13 05:12:46 +00001240 {
1241 info.peer = rsclient;
1242 info.attr = attr;
1243
1244 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1245
Paul Jakmafb982c22007-05-04 20:15:47 +00001246 if (ri->extra && ri->extra->suppress)
paulfee0f4c2004-09-13 05:12:46 +00001247 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1248 else
1249 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1250
1251 rsclient->rmap_type = 0;
1252
1253 if (ret == RMAP_DENYMATCH)
1254 {
1255 bgp_attr_flush (attr);
1256 return 0;
1257 }
1258 }
1259
1260 return 1;
1261}
1262
1263struct bgp_info_pair
1264{
1265 struct bgp_info *old;
1266 struct bgp_info *new;
1267};
1268
paul94f2b392005-06-28 12:44:16 +00001269static void
paulfee0f4c2004-09-13 05:12:46 +00001270bgp_best_selection (struct bgp *bgp, struct bgp_node *rn, struct bgp_info_pair *result)
1271{
paul718e3742002-12-13 20:15:29 +00001272 struct bgp_info *new_select;
1273 struct bgp_info *old_select;
paulfee0f4c2004-09-13 05:12:46 +00001274 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00001275 struct bgp_info *ri1;
1276 struct bgp_info *ri2;
paulb40d9392005-08-22 22:34:41 +00001277 struct bgp_info *nextri = NULL;
1278
paul718e3742002-12-13 20:15:29 +00001279 /* bgp deterministic-med */
1280 new_select = NULL;
1281 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1282 for (ri1 = rn->info; ri1; ri1 = ri1->next)
1283 {
1284 if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1285 continue;
1286 if (BGP_INFO_HOLDDOWN (ri1))
1287 continue;
1288
1289 new_select = ri1;
1290 if (ri1->next)
1291 for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1292 {
1293 if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1294 continue;
1295 if (BGP_INFO_HOLDDOWN (ri2))
1296 continue;
1297
1298 if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1299 || aspath_cmp_left_confed (ri1->attr->aspath,
1300 ri2->attr->aspath))
1301 {
1302 if (bgp_info_cmp (bgp, ri2, new_select))
1303 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001304 bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001305 new_select = ri2;
1306 }
1307
Paul Jakma1a392d42006-09-07 00:24:49 +00001308 bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001309 }
1310 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001311 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1312 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001313 }
1314
1315 /* Check old selected route and new selected route. */
1316 old_select = NULL;
1317 new_select = NULL;
paulb40d9392005-08-22 22:34:41 +00001318 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
paul718e3742002-12-13 20:15:29 +00001319 {
1320 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1321 old_select = ri;
1322
1323 if (BGP_INFO_HOLDDOWN (ri))
paulb40d9392005-08-22 22:34:41 +00001324 {
1325 /* reap REMOVED routes, if needs be
1326 * selected route must stay for a while longer though
1327 */
1328 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1329 && (ri != old_select))
1330 bgp_info_reap (rn, ri);
1331
1332 continue;
1333 }
paul718e3742002-12-13 20:15:29 +00001334
1335 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1336 && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1337 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001338 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
paul718e3742002-12-13 20:15:29 +00001339 continue;
1340 }
Paul Jakma1a392d42006-09-07 00:24:49 +00001341 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1342 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
paul718e3742002-12-13 20:15:29 +00001343
1344 if (bgp_info_cmp (bgp, ri, new_select))
1345 new_select = ri;
1346 }
paulb40d9392005-08-22 22:34:41 +00001347
paulfee0f4c2004-09-13 05:12:46 +00001348 result->old = old_select;
1349 result->new = new_select;
1350
1351 return;
1352}
1353
paul94f2b392005-06-28 12:44:16 +00001354static int
paulfee0f4c2004-09-13 05:12:46 +00001355bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
Paul Jakma9eda90c2007-08-30 13:36:17 +00001356 struct bgp_node *rn, afi_t afi, safi_t safi)
1357{
paulfee0f4c2004-09-13 05:12:46 +00001358 struct prefix *p;
Paul Jakma9eda90c2007-08-30 13:36:17 +00001359 struct attr attr = { 0 };
paulfee0f4c2004-09-13 05:12:46 +00001360
1361 p = &rn->p;
1362
Paul Jakma9eda90c2007-08-30 13:36:17 +00001363 /* Announce route to Established peer. */
1364 if (peer->status != Established)
paulfee0f4c2004-09-13 05:12:46 +00001365 return 0;
1366
Paul Jakma9eda90c2007-08-30 13:36:17 +00001367 /* Address family configuration check. */
1368 if (! peer->afc_nego[afi][safi])
paulfee0f4c2004-09-13 05:12:46 +00001369 return 0;
1370
Paul Jakma9eda90c2007-08-30 13:36:17 +00001371 /* First update is deferred until ORF or ROUTE-REFRESH is received */
paulfee0f4c2004-09-13 05:12:46 +00001372 if (CHECK_FLAG (peer->af_sflags[afi][safi],
1373 PEER_STATUS_ORF_WAIT_REFRESH))
1374 return 0;
1375
1376 switch (rn->table->type)
1377 {
1378 case BGP_TABLE_MAIN:
1379 /* Announcement to peer->conf. If the route is filtered,
1380 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001381 if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1382 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
paulfee0f4c2004-09-13 05:12:46 +00001383 else
1384 bgp_adj_out_unset (rn, peer, p, afi, safi);
1385 break;
1386 case BGP_TABLE_RSCLIENT:
1387 /* Announcement to peer->conf. If the route is filtered,
1388 withdraw it. */
Paul Jakma9eda90c2007-08-30 13:36:17 +00001389 if (selected &&
1390 bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1391 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1392 else
1393 bgp_adj_out_unset (rn, peer, p, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001394 break;
1395 }
Paul Jakma9eda90c2007-08-30 13:36:17 +00001396
1397 bgp_attr_extra_free (&attr);
1398
paulfee0f4c2004-09-13 05:12:46 +00001399 return 0;
paul200df112005-06-01 11:17:05 +00001400}
paulfee0f4c2004-09-13 05:12:46 +00001401
paul200df112005-06-01 11:17:05 +00001402struct bgp_process_queue
paulfee0f4c2004-09-13 05:12:46 +00001403{
paul200df112005-06-01 11:17:05 +00001404 struct bgp *bgp;
1405 struct bgp_node *rn;
1406 afi_t afi;
1407 safi_t safi;
1408};
1409
1410static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001411bgp_process_rsclient (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001412{
paul0fb58d52005-11-14 14:31:49 +00001413 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001414 struct bgp *bgp = pq->bgp;
1415 struct bgp_node *rn = pq->rn;
1416 afi_t afi = pq->afi;
1417 safi_t safi = pq->safi;
paulfee0f4c2004-09-13 05:12:46 +00001418 struct bgp_info *new_select;
1419 struct bgp_info *old_select;
1420 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001421 struct listnode *node, *nnode;
paul200df112005-06-01 11:17:05 +00001422 struct peer *rsclient = rn->table->owner;
1423
paulfee0f4c2004-09-13 05:12:46 +00001424 /* Best path selection. */
1425 bgp_best_selection (bgp, rn, &old_and_new);
1426 new_select = old_and_new.new;
1427 old_select = old_and_new.old;
1428
paul200df112005-06-01 11:17:05 +00001429 if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1430 {
Chris Caputo228da422009-07-18 05:44:03 +00001431 if (rsclient->group)
1432 for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1433 {
1434 /* Nothing to do. */
1435 if (old_select && old_select == new_select)
1436 if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1437 continue;
paulfee0f4c2004-09-13 05:12:46 +00001438
Chris Caputo228da422009-07-18 05:44:03 +00001439 if (old_select)
1440 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1441 if (new_select)
1442 {
1443 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1444 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1445 }
paulfee0f4c2004-09-13 05:12:46 +00001446
Chris Caputo228da422009-07-18 05:44:03 +00001447 bgp_process_announce_selected (rsclient, new_select, rn,
1448 afi, safi);
1449 }
paul200df112005-06-01 11:17:05 +00001450 }
1451 else
1452 {
hassob7395792005-08-26 12:58:38 +00001453 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001454 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hassob7395792005-08-26 12:58:38 +00001455 if (new_select)
1456 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001457 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1458 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
hassob7395792005-08-26 12:58:38 +00001459 }
Paul Jakma9eda90c2007-08-30 13:36:17 +00001460 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
paul200df112005-06-01 11:17:05 +00001461 }
paulfee0f4c2004-09-13 05:12:46 +00001462
paulb40d9392005-08-22 22:34:41 +00001463 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1464 bgp_info_reap (rn, old_select);
1465
paul200df112005-06-01 11:17:05 +00001466 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1467 return WQ_SUCCESS;
paulfee0f4c2004-09-13 05:12:46 +00001468}
1469
paul200df112005-06-01 11:17:05 +00001470static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00001471bgp_process_main (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001472{
paul0fb58d52005-11-14 14:31:49 +00001473 struct bgp_process_queue *pq = data;
paul200df112005-06-01 11:17:05 +00001474 struct bgp *bgp = pq->bgp;
1475 struct bgp_node *rn = pq->rn;
1476 afi_t afi = pq->afi;
1477 safi_t safi = pq->safi;
1478 struct prefix *p = &rn->p;
paulfee0f4c2004-09-13 05:12:46 +00001479 struct bgp_info *new_select;
1480 struct bgp_info *old_select;
1481 struct bgp_info_pair old_and_new;
paul1eb8ef22005-04-07 07:30:20 +00001482 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00001483 struct peer *peer;
Paul Jakmafb982c22007-05-04 20:15:47 +00001484
paulfee0f4c2004-09-13 05:12:46 +00001485 /* Best path selection. */
1486 bgp_best_selection (bgp, rn, &old_and_new);
1487 old_select = old_and_new.old;
1488 new_select = old_and_new.new;
1489
1490 /* Nothing to do. */
1491 if (old_select && old_select == new_select)
1492 {
1493 if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
paul200df112005-06-01 11:17:05 +00001494 {
1495 if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
1496 bgp_zebra_announce (p, old_select, bgp);
1497
1498 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1499 return WQ_SUCCESS;
1500 }
paulfee0f4c2004-09-13 05:12:46 +00001501 }
paul718e3742002-12-13 20:15:29 +00001502
hasso338b3422005-02-23 14:27:24 +00001503 if (old_select)
Paul Jakma1a392d42006-09-07 00:24:49 +00001504 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
hasso338b3422005-02-23 14:27:24 +00001505 if (new_select)
1506 {
Paul Jakma1a392d42006-09-07 00:24:49 +00001507 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1508 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
hasso338b3422005-02-23 14:27:24 +00001509 }
1510
1511
paul718e3742002-12-13 20:15:29 +00001512 /* Check each BGP peer. */
paul1eb8ef22005-04-07 07:30:20 +00001513 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00001514 {
Paul Jakma9eda90c2007-08-30 13:36:17 +00001515 bgp_process_announce_selected (peer, new_select, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001516 }
1517
1518 /* FIB update. */
1519 if (safi == SAFI_UNICAST && ! bgp->name &&
1520 ! bgp_option_check (BGP_OPT_NO_FIB))
1521 {
1522 if (new_select
1523 && new_select->type == ZEBRA_ROUTE_BGP
1524 && new_select->sub_type == BGP_ROUTE_NORMAL)
1525 bgp_zebra_announce (p, new_select, bgp);
1526 else
1527 {
1528 /* Withdraw the route from the kernel. */
1529 if (old_select
1530 && old_select->type == ZEBRA_ROUTE_BGP
1531 && old_select->sub_type == BGP_ROUTE_NORMAL)
1532 bgp_zebra_withdraw (p, old_select);
1533 }
1534 }
paulb40d9392005-08-22 22:34:41 +00001535
1536 /* Reap old select bgp_info, it it has been removed */
1537 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1538 bgp_info_reap (rn, old_select);
1539
paul200df112005-06-01 11:17:05 +00001540 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1541 return WQ_SUCCESS;
paul718e3742002-12-13 20:15:29 +00001542}
1543
paul200df112005-06-01 11:17:05 +00001544static void
paul0fb58d52005-11-14 14:31:49 +00001545bgp_processq_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00001546{
paul0fb58d52005-11-14 14:31:49 +00001547 struct bgp_process_queue *pq = data;
Chris Caputo228da422009-07-18 05:44:03 +00001548 struct bgp_table *table = pq->rn->table;
paul0fb58d52005-11-14 14:31:49 +00001549
Chris Caputo228da422009-07-18 05:44:03 +00001550 bgp_unlock (pq->bgp);
paul200df112005-06-01 11:17:05 +00001551 bgp_unlock_node (pq->rn);
Chris Caputo228da422009-07-18 05:44:03 +00001552 bgp_table_unlock (table);
paul200df112005-06-01 11:17:05 +00001553 XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1554}
1555
1556static void
1557bgp_process_queue_init (void)
1558{
1559 bm->process_main_queue
1560 = work_queue_new (bm->master, "process_main_queue");
1561 bm->process_rsclient_queue
1562 = work_queue_new (bm->master, "process_rsclient_queue");
1563
1564 if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1565 {
1566 zlog_err ("%s: Failed to allocate work queue", __func__);
1567 exit (1);
1568 }
1569
1570 bm->process_main_queue->spec.workfunc = &bgp_process_main;
paul200df112005-06-01 11:17:05 +00001571 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
Paul Jakma838bbde2010-01-08 14:05:32 +00001572 bm->process_main_queue->spec.max_retries = 0;
1573 bm->process_main_queue->spec.hold = 50;
1574
1575 memcpy (bm->process_rsclient_queue, bm->process_main_queue,
1576 sizeof (struct work_queue *));
1577 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
paul200df112005-06-01 11:17:05 +00001578}
1579
1580void
paulfee0f4c2004-09-13 05:12:46 +00001581bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1582{
paul200df112005-06-01 11:17:05 +00001583 struct bgp_process_queue *pqnode;
1584
1585 /* already scheduled for processing? */
1586 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1587 return;
1588
1589 if ( (bm->process_main_queue == NULL) ||
1590 (bm->process_rsclient_queue == NULL) )
1591 bgp_process_queue_init ();
1592
1593 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1594 sizeof (struct bgp_process_queue));
1595 if (!pqnode)
1596 return;
Chris Caputo228da422009-07-18 05:44:03 +00001597
1598 /* all unlocked in bgp_processq_del */
1599 bgp_table_lock (rn->table);
1600 pqnode->rn = bgp_lock_node (rn);
paul200df112005-06-01 11:17:05 +00001601 pqnode->bgp = bgp;
Chris Caputo228da422009-07-18 05:44:03 +00001602 bgp_lock (bgp);
paul200df112005-06-01 11:17:05 +00001603 pqnode->afi = afi;
1604 pqnode->safi = safi;
1605
paulfee0f4c2004-09-13 05:12:46 +00001606 switch (rn->table->type)
1607 {
paul200df112005-06-01 11:17:05 +00001608 case BGP_TABLE_MAIN:
1609 work_queue_add (bm->process_main_queue, pqnode);
1610 break;
1611 case BGP_TABLE_RSCLIENT:
1612 work_queue_add (bm->process_rsclient_queue, pqnode);
1613 break;
paulfee0f4c2004-09-13 05:12:46 +00001614 }
paul200df112005-06-01 11:17:05 +00001615
1616 return;
paulfee0f4c2004-09-13 05:12:46 +00001617}
hasso0a486e52005-02-01 20:57:17 +00001618
paul94f2b392005-06-28 12:44:16 +00001619static int
hasso0a486e52005-02-01 20:57:17 +00001620bgp_maximum_prefix_restart_timer (struct thread *thread)
1621{
1622 struct peer *peer;
1623
1624 peer = THREAD_ARG (thread);
1625 peer->t_pmax_restart = NULL;
1626
1627 if (BGP_DEBUG (events, EVENTS))
1628 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1629 peer->host);
1630
1631 peer_clear (peer);
1632
1633 return 0;
1634}
1635
paulfee0f4c2004-09-13 05:12:46 +00001636int
paul5228ad22004-06-04 17:58:18 +00001637bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1638 safi_t safi, int always)
paul718e3742002-12-13 20:15:29 +00001639{
hassoe0701b72004-05-20 09:19:34 +00001640 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1641 return 0;
1642
1643 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
paul718e3742002-12-13 20:15:29 +00001644 {
hassoe0701b72004-05-20 09:19:34 +00001645 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1646 && ! always)
1647 return 0;
paul718e3742002-12-13 20:15:29 +00001648
hassoe0701b72004-05-20 09:19:34 +00001649 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001650 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1651 "limit %ld", afi_safi_print (afi, safi), peer->host,
1652 peer->pcount[afi][safi], peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001653 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
paul718e3742002-12-13 20:15:29 +00001654
hassoe0701b72004-05-20 09:19:34 +00001655 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1656 return 0;
paul718e3742002-12-13 20:15:29 +00001657
hassoe0701b72004-05-20 09:19:34 +00001658 {
paul5228ad22004-06-04 17:58:18 +00001659 u_int8_t ndata[7];
hassoe0701b72004-05-20 09:19:34 +00001660
1661 if (safi == SAFI_MPLS_VPN)
1662 safi = BGP_SAFI_VPNV4;
paul5228ad22004-06-04 17:58:18 +00001663
1664 ndata[0] = (afi >> 8);
1665 ndata[1] = afi;
1666 ndata[2] = safi;
1667 ndata[3] = (peer->pmax[afi][safi] >> 24);
1668 ndata[4] = (peer->pmax[afi][safi] >> 16);
1669 ndata[5] = (peer->pmax[afi][safi] >> 8);
1670 ndata[6] = (peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001671
1672 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1673 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1674 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1675 }
hasso0a486e52005-02-01 20:57:17 +00001676
1677 /* restart timer start */
1678 if (peer->pmax_restart[afi][safi])
1679 {
1680 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1681
1682 if (BGP_DEBUG (events, EVENTS))
1683 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1684 peer->host, peer->v_pmax_restart);
1685
1686 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1687 peer->v_pmax_restart);
1688 }
1689
hassoe0701b72004-05-20 09:19:34 +00001690 return 1;
paul718e3742002-12-13 20:15:29 +00001691 }
hassoe0701b72004-05-20 09:19:34 +00001692 else
1693 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1694
1695 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1696 {
1697 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1698 && ! always)
1699 return 0;
1700
1701 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001702 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1703 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1704 peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001705 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1706 }
1707 else
1708 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
paul718e3742002-12-13 20:15:29 +00001709 return 0;
1710}
1711
paulb40d9392005-08-22 22:34:41 +00001712/* Unconditionally remove the route from the RIB, without taking
1713 * damping into consideration (eg, because the session went down)
1714 */
paul94f2b392005-06-28 12:44:16 +00001715static void
paul718e3742002-12-13 20:15:29 +00001716bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1717 afi_t afi, safi_t safi)
1718{
paul902212c2006-02-05 17:51:19 +00001719 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1720
1721 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1722 bgp_info_delete (rn, ri); /* keep historical info */
1723
paulb40d9392005-08-22 22:34:41 +00001724 bgp_process (peer->bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001725}
1726
paul94f2b392005-06-28 12:44:16 +00001727static void
paul718e3742002-12-13 20:15:29 +00001728bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
paulb40d9392005-08-22 22:34:41 +00001729 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001730{
paul718e3742002-12-13 20:15:29 +00001731 int status = BGP_DAMP_NONE;
1732
paulb40d9392005-08-22 22:34:41 +00001733 /* apply dampening, if result is suppressed, we'll be retaining
1734 * the bgp_info in the RIB for historical reference.
1735 */
1736 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1737 && peer_sort (peer) == BGP_PEER_EBGP)
1738 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1739 == BGP_DAMP_SUPPRESSED)
paul902212c2006-02-05 17:51:19 +00001740 {
paul902212c2006-02-05 17:51:19 +00001741 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1742 return;
1743 }
1744
1745 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00001746}
1747
paul94f2b392005-06-28 12:44:16 +00001748static void
paulfee0f4c2004-09-13 05:12:46 +00001749bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1750 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1751 int sub_type, struct prefix_rd *prd, u_char *tag)
1752{
1753 struct bgp_node *rn;
1754 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00001755 struct attr new_attr = { 0 };
paulfee0f4c2004-09-13 05:12:46 +00001756 struct attr *attr_new;
1757 struct attr *attr_new2;
1758 struct bgp_info *ri;
1759 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001760 const char *reason;
paulfee0f4c2004-09-13 05:12:46 +00001761 char buf[SU_ADDRSTRLEN];
1762
1763 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1764 if (peer == rsclient)
1765 return;
1766
1767 bgp = peer->bgp;
1768 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1769
1770 /* Check previously received route. */
1771 for (ri = rn->info; ri; ri = ri->next)
1772 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1773 break;
1774
1775 /* AS path loop check. */
1776 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1777 {
1778 reason = "as-path contains our own AS;";
1779 goto filtered;
1780 }
1781
1782 /* Route reflector originator ID check. */
1783 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00001784 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001785 {
1786 reason = "originator is us;";
1787 goto filtered;
1788 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001789
1790 bgp_attr_dup (&new_attr, attr);
paulfee0f4c2004-09-13 05:12:46 +00001791
1792 /* Apply export policy. */
1793 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1794 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1795 {
1796 reason = "export-policy;";
1797 goto filtered;
1798 }
1799
1800 attr_new2 = bgp_attr_intern (&new_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001801
paulfee0f4c2004-09-13 05:12:46 +00001802 /* Apply import policy. */
1803 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1804 {
1805 bgp_attr_unintern (attr_new2);
1806
1807 reason = "import-policy;";
1808 goto filtered;
1809 }
1810
1811 attr_new = bgp_attr_intern (&new_attr);
1812 bgp_attr_unintern (attr_new2);
1813
1814 /* IPv4 unicast next hop check. */
1815 if (afi == AFI_IP && safi == SAFI_UNICAST)
1816 {
1817 /* Next hop must not be 0.0.0.0 nor Class E address. */
1818 if (new_attr.nexthop.s_addr == 0
1819 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
1820 {
1821 bgp_attr_unintern (attr_new);
1822
1823 reason = "martian next-hop;";
1824 goto filtered;
1825 }
1826 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001827
1828 /* new_attr isn't passed to any functions after here */
1829 bgp_attr_extra_free (&new_attr);
1830
paulfee0f4c2004-09-13 05:12:46 +00001831 /* If the update is implicit withdraw. */
1832 if (ri)
1833 {
Stephen Hemminger65957882010-01-15 16:22:10 +03001834 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001835
1836 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00001837 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1838 && attrhash_cmp (ri->attr, attr_new))
paulfee0f4c2004-09-13 05:12:46 +00001839 {
1840
Paul Jakma1a392d42006-09-07 00:24:49 +00001841 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001842
1843 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001844 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001845 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1846 peer->host,
1847 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1848 p->prefixlen, rsclient->host);
1849
Chris Caputo228da422009-07-18 05:44:03 +00001850 bgp_unlock_node (rn);
1851 bgp_attr_unintern (attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001852
Chris Caputo228da422009-07-18 05:44:03 +00001853 return;
paulfee0f4c2004-09-13 05:12:46 +00001854 }
1855
Paul Jakma16d2e242007-04-10 19:32:10 +00001856 /* Withdraw/Announce before we fully processed the withdraw */
1857 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1858 bgp_info_restore (rn, ri);
1859
paulfee0f4c2004-09-13 05:12:46 +00001860 /* Received Logging. */
1861 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001862 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001863 peer->host,
1864 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1865 p->prefixlen, rsclient->host);
1866
1867 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00001868 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001869
1870 /* Update to new attribute. */
1871 bgp_attr_unintern (ri->attr);
1872 ri->attr = attr_new;
1873
1874 /* Update MPLS tag. */
1875 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001876 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001877
Paul Jakma1a392d42006-09-07 00:24:49 +00001878 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001879
1880 /* Process change. */
1881 bgp_process (bgp, rn, afi, safi);
1882 bgp_unlock_node (rn);
1883
1884 return;
1885 }
1886
1887 /* Received Logging. */
1888 if (BGP_DEBUG (update, UPDATE_IN))
1889 {
ajsd2c1f162004-12-08 21:10:20 +00001890 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001891 peer->host,
1892 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1893 p->prefixlen, rsclient->host);
1894 }
1895
1896 /* Make new BGP info. */
1897 new = bgp_info_new ();
1898 new->type = type;
1899 new->sub_type = sub_type;
1900 new->peer = peer;
1901 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03001902 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001903
1904 /* Update MPLS tag. */
1905 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001906 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001907
Paul Jakma1a392d42006-09-07 00:24:49 +00001908 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001909
1910 /* Register new BGP information. */
1911 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00001912
1913 /* route_node_get lock */
1914 bgp_unlock_node (rn);
1915
paulfee0f4c2004-09-13 05:12:46 +00001916 /* Process change. */
1917 bgp_process (bgp, rn, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00001918
1919 bgp_attr_extra_free (&new_attr);
1920
paulfee0f4c2004-09-13 05:12:46 +00001921 return;
1922
1923 filtered:
1924
1925 /* This BGP update is filtered. Log the reason then update BGP entry. */
1926 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001927 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001928 "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
1929 peer->host,
1930 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1931 p->prefixlen, rsclient->host, reason);
1932
1933 if (ri)
paulb40d9392005-08-22 22:34:41 +00001934 bgp_rib_remove (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001935
1936 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00001937
1938 if (new_attr.extra)
1939 bgp_attr_extra_free (&new_attr);
1940
paulfee0f4c2004-09-13 05:12:46 +00001941 return;
1942}
1943
paul94f2b392005-06-28 12:44:16 +00001944static void
paulfee0f4c2004-09-13 05:12:46 +00001945bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1946 struct peer *peer, struct prefix *p, int type, int sub_type,
1947 struct prefix_rd *prd, u_char *tag)
Chris Caputo228da422009-07-18 05:44:03 +00001948{
paulfee0f4c2004-09-13 05:12:46 +00001949 struct bgp_node *rn;
1950 struct bgp_info *ri;
1951 char buf[SU_ADDRSTRLEN];
1952
1953 if (rsclient == peer)
Chris Caputo228da422009-07-18 05:44:03 +00001954 return;
paulfee0f4c2004-09-13 05:12:46 +00001955
1956 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1957
1958 /* Lookup withdrawn route. */
1959 for (ri = rn->info; ri; ri = ri->next)
1960 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1961 break;
1962
1963 /* Withdraw specified route from routing table. */
1964 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00001965 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001966 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001967 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001968 "%s Can't find the route %s/%d", peer->host,
1969 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1970 p->prefixlen);
1971
1972 /* Unlock bgp_node_get() lock. */
Chris Caputo228da422009-07-18 05:44:03 +00001973 bgp_unlock_node (rn);
1974}
paulfee0f4c2004-09-13 05:12:46 +00001975
paul94f2b392005-06-28 12:44:16 +00001976static int
paulfee0f4c2004-09-13 05:12:46 +00001977bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
paul718e3742002-12-13 20:15:29 +00001978 afi_t afi, safi_t safi, int type, int sub_type,
1979 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
1980{
1981 int ret;
1982 int aspath_loop_count = 0;
1983 struct bgp_node *rn;
1984 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00001985 struct attr new_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00001986 struct attr *attr_new;
1987 struct bgp_info *ri;
1988 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001989 const char *reason;
paul718e3742002-12-13 20:15:29 +00001990 char buf[SU_ADDRSTRLEN];
1991
1992 bgp = peer->bgp;
paulfee0f4c2004-09-13 05:12:46 +00001993 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
Paul Jakmafb982c22007-05-04 20:15:47 +00001994
paul718e3742002-12-13 20:15:29 +00001995 /* When peer's soft reconfiguration enabled. Record input packet in
1996 Adj-RIBs-In. */
1997 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
1998 && peer != bgp->peer_self && ! soft_reconfig)
1999 bgp_adj_in_set (rn, peer, attr);
2000
2001 /* Check previously received route. */
2002 for (ri = rn->info; ri; ri = ri->next)
2003 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2004 break;
2005
2006 /* AS path local-as loop check. */
2007 if (peer->change_local_as)
2008 {
2009 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2010 aspath_loop_count = 1;
2011
2012 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2013 {
2014 reason = "as-path contains our own AS;";
2015 goto filtered;
2016 }
2017 }
2018
2019 /* AS path loop check. */
2020 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2021 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2022 && aspath_loop_check(attr->aspath, bgp->confed_id)
2023 > peer->allowas_in[afi][safi]))
2024 {
2025 reason = "as-path contains our own AS;";
2026 goto filtered;
2027 }
2028
2029 /* Route reflector originator ID check. */
2030 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00002031 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +00002032 {
2033 reason = "originator is us;";
2034 goto filtered;
2035 }
2036
2037 /* Route reflector cluster ID check. */
2038 if (bgp_cluster_filter (peer, attr))
2039 {
2040 reason = "reflected from the same cluster;";
2041 goto filtered;
2042 }
2043
2044 /* Apply incoming filter. */
2045 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2046 {
2047 reason = "filter;";
2048 goto filtered;
2049 }
2050
2051 /* Apply incoming route-map. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002052 bgp_attr_dup (&new_attr, attr);
paul718e3742002-12-13 20:15:29 +00002053
2054 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2055 {
2056 reason = "route-map;";
2057 goto filtered;
2058 }
2059
2060 /* IPv4 unicast next hop check. */
2061 if (afi == AFI_IP && safi == SAFI_UNICAST)
2062 {
2063 /* If the peer is EBGP and nexthop is not on connected route,
2064 discard it. */
2065 if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
2066 && ! bgp_nexthop_check_ebgp (afi, &new_attr)
hasso6ffd2072005-02-02 14:50:11 +00002067 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
paul718e3742002-12-13 20:15:29 +00002068 {
2069 reason = "non-connected next-hop;";
2070 goto filtered;
2071 }
2072
2073 /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
2074 must not be my own address. */
2075 if (bgp_nexthop_self (afi, &new_attr)
2076 || new_attr.nexthop.s_addr == 0
2077 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
2078 {
2079 reason = "martian next-hop;";
2080 goto filtered;
2081 }
2082 }
2083
2084 attr_new = bgp_attr_intern (&new_attr);
2085
2086 /* If the update is implicit withdraw. */
2087 if (ri)
2088 {
Stephen Hemminger65957882010-01-15 16:22:10 +03002089 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002090
2091 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00002092 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2093 && attrhash_cmp (ri->attr, attr_new))
paul718e3742002-12-13 20:15:29 +00002094 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002095 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00002096
2097 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2098 && peer_sort (peer) == BGP_PEER_EBGP
2099 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2100 {
2101 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002102 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002103 peer->host,
2104 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2105 p->prefixlen);
2106
paul902212c2006-02-05 17:51:19 +00002107 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2108 {
2109 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2110 bgp_process (bgp, rn, afi, safi);
2111 }
paul718e3742002-12-13 20:15:29 +00002112 }
Paul Jakma16d2e242007-04-10 19:32:10 +00002113 else /* Duplicate - odd */
paul718e3742002-12-13 20:15:29 +00002114 {
2115 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002116 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002117 "%s rcvd %s/%d...duplicate ignored",
2118 peer->host,
2119 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2120 p->prefixlen);
hasso93406d82005-02-02 14:40:33 +00002121
2122 /* graceful restart STALE flag unset. */
2123 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2124 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002125 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
paul902212c2006-02-05 17:51:19 +00002126 bgp_process (bgp, rn, afi, safi);
hasso93406d82005-02-02 14:40:33 +00002127 }
paul718e3742002-12-13 20:15:29 +00002128 }
2129
2130 bgp_unlock_node (rn);
2131 bgp_attr_unintern (attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00002132 bgp_attr_extra_free (&new_attr);
2133
paul718e3742002-12-13 20:15:29 +00002134 return 0;
2135 }
2136
Paul Jakma16d2e242007-04-10 19:32:10 +00002137 /* Withdraw/Announce before we fully processed the withdraw */
2138 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2139 {
2140 if (BGP_DEBUG (update, UPDATE_IN))
2141 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2142 peer->host,
2143 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2144 p->prefixlen);
2145 bgp_info_restore (rn, ri);
2146 }
2147
paul718e3742002-12-13 20:15:29 +00002148 /* Received Logging. */
2149 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002150 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002151 peer->host,
2152 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2153 p->prefixlen);
2154
hasso93406d82005-02-02 14:40:33 +00002155 /* graceful restart STALE flag unset. */
2156 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma1a392d42006-09-07 00:24:49 +00002157 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
hasso93406d82005-02-02 14:40:33 +00002158
paul718e3742002-12-13 20:15:29 +00002159 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00002160 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul902212c2006-02-05 17:51:19 +00002161
2162 /* implicit withdraw, decrement aggregate and pcount here.
2163 * only if update is accepted, they'll increment below.
2164 */
paul902212c2006-02-05 17:51:19 +00002165 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2166
paul718e3742002-12-13 20:15:29 +00002167 /* Update bgp route dampening information. */
2168 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2169 && peer_sort (peer) == BGP_PEER_EBGP)
2170 {
2171 /* This is implicit withdraw so we should update dampening
2172 information. */
2173 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2174 bgp_damp_withdraw (ri, rn, afi, safi, 1);
paul718e3742002-12-13 20:15:29 +00002175 }
2176
paul718e3742002-12-13 20:15:29 +00002177 /* Update to new attribute. */
2178 bgp_attr_unintern (ri->attr);
2179 ri->attr = attr_new;
2180
2181 /* Update MPLS tag. */
2182 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002183 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002184
2185 /* Update bgp route dampening information. */
2186 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2187 && peer_sort (peer) == BGP_PEER_EBGP)
2188 {
2189 /* Now we do normal update dampening. */
2190 ret = bgp_damp_update (ri, rn, afi, safi);
2191 if (ret == BGP_DAMP_SUPPRESSED)
2192 {
2193 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002194 bgp_attr_extra_free (&new_attr);
paul718e3742002-12-13 20:15:29 +00002195 return 0;
2196 }
2197 }
2198
2199 /* Nexthop reachability check. */
2200 if ((afi == AFI_IP || afi == AFI_IP6)
2201 && safi == SAFI_UNICAST
2202 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002203 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002204 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002205 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002206 {
2207 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002208 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002209 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002210 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002211 }
2212 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002213 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002214
2215 /* Process change. */
2216 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2217
2218 bgp_process (bgp, rn, afi, safi);
2219 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002220 bgp_attr_extra_free (&new_attr);
2221
paul718e3742002-12-13 20:15:29 +00002222 return 0;
2223 }
2224
2225 /* Received Logging. */
2226 if (BGP_DEBUG (update, UPDATE_IN))
2227 {
ajsd2c1f162004-12-08 21:10:20 +00002228 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002229 peer->host,
2230 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2231 p->prefixlen);
2232 }
2233
paul718e3742002-12-13 20:15:29 +00002234 /* Make new BGP info. */
2235 new = bgp_info_new ();
2236 new->type = type;
2237 new->sub_type = sub_type;
2238 new->peer = peer;
2239 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03002240 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002241
2242 /* Update MPLS tag. */
2243 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002244 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002245
2246 /* Nexthop reachability check. */
2247 if ((afi == AFI_IP || afi == AFI_IP6)
2248 && safi == SAFI_UNICAST
2249 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002250 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002251 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002252 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002253 {
2254 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002255 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002256 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002257 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002258 }
2259 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002260 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002261
paul902212c2006-02-05 17:51:19 +00002262 /* Increment prefix */
paul718e3742002-12-13 20:15:29 +00002263 bgp_aggregate_increment (bgp, p, new, afi, safi);
2264
2265 /* Register new BGP information. */
2266 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00002267
2268 /* route_node_get lock */
2269 bgp_unlock_node (rn);
2270
Paul Jakmafb982c22007-05-04 20:15:47 +00002271 bgp_attr_extra_free (&new_attr);
2272
paul718e3742002-12-13 20:15:29 +00002273 /* If maximum prefix count is configured and current prefix
2274 count exeed it. */
hassoe0701b72004-05-20 09:19:34 +00002275 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2276 return -1;
paul718e3742002-12-13 20:15:29 +00002277
2278 /* Process change. */
2279 bgp_process (bgp, rn, afi, safi);
2280
2281 return 0;
2282
2283 /* This BGP update is filtered. Log the reason then update BGP
2284 entry. */
2285 filtered:
2286 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002287 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002288 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2289 peer->host,
2290 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2291 p->prefixlen, reason);
2292
2293 if (ri)
paulb40d9392005-08-22 22:34:41 +00002294 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002295
2296 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002297
2298 bgp_attr_extra_free (&new_attr);
2299
paul718e3742002-12-13 20:15:29 +00002300 return 0;
2301}
2302
2303int
paulfee0f4c2004-09-13 05:12:46 +00002304bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2305 afi_t afi, safi_t safi, int type, int sub_type,
2306 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2307{
2308 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002309 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00002310 struct bgp *bgp;
2311 int ret;
2312
2313 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2314 soft_reconfig);
2315
2316 bgp = peer->bgp;
2317
2318 /* Process the update for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002319 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002320 {
2321 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2322 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2323 sub_type, prd, tag);
2324 }
2325
2326 return ret;
2327}
2328
2329int
paul718e3742002-12-13 20:15:29 +00002330bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
paul94f2b392005-06-28 12:44:16 +00002331 afi_t afi, safi_t safi, int type, int sub_type,
2332 struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00002333{
2334 struct bgp *bgp;
2335 char buf[SU_ADDRSTRLEN];
2336 struct bgp_node *rn;
2337 struct bgp_info *ri;
paulfee0f4c2004-09-13 05:12:46 +00002338 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002339 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002340
2341 bgp = peer->bgp;
2342
paulfee0f4c2004-09-13 05:12:46 +00002343 /* Process the withdraw for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002344 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002345 {
2346 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2347 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2348 }
2349
paul718e3742002-12-13 20:15:29 +00002350 /* Logging. */
2351 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002352 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
paul718e3742002-12-13 20:15:29 +00002353 peer->host,
2354 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2355 p->prefixlen);
2356
2357 /* Lookup node. */
paulfee0f4c2004-09-13 05:12:46 +00002358 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00002359
2360 /* If peer is soft reconfiguration enabled. Record input packet for
2361 further calculation. */
2362 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2363 && peer != bgp->peer_self)
2364 bgp_adj_in_unset (rn, peer);
2365
2366 /* Lookup withdrawn route. */
2367 for (ri = rn->info; ri; ri = ri->next)
2368 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2369 break;
2370
2371 /* Withdraw specified route from routing table. */
2372 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002373 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002374 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002375 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002376 "%s Can't find the route %s/%d", peer->host,
2377 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2378 p->prefixlen);
2379
2380 /* Unlock bgp_node_get() lock. */
2381 bgp_unlock_node (rn);
2382
2383 return 0;
2384}
2385
2386void
2387bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2388{
2389 struct bgp *bgp;
Chris Caputo228da422009-07-18 05:44:03 +00002390 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002391 struct aspath *aspath = { 0 };
paul718e3742002-12-13 20:15:29 +00002392 struct prefix p;
2393 struct bgp_info binfo;
2394 struct peer *from;
2395 int ret = RMAP_DENYMATCH;
Paul Jakmafb982c22007-05-04 20:15:47 +00002396
Paul Jakmab2497022007-06-14 11:17:58 +00002397 if (!(afi == AFI_IP || afi == AFI_IP6))
Paul Jakmafb982c22007-05-04 20:15:47 +00002398 return;
2399
paul718e3742002-12-13 20:15:29 +00002400 bgp = peer->bgp;
2401 from = bgp->peer_self;
Paul Jakmafb982c22007-05-04 20:15:47 +00002402
paul718e3742002-12-13 20:15:29 +00002403 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2404 aspath = attr.aspath;
2405 attr.local_pref = bgp->default_local_pref;
2406 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2407
2408 if (afi == AFI_IP)
2409 str2prefix ("0.0.0.0/0", &p);
2410#ifdef HAVE_IPV6
2411 else if (afi == AFI_IP6)
2412 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002413 struct attr_extra *ae;
2414 attr.extra = NULL;
2415
2416 ae = bgp_attr_extra_get (&attr);
2417 attr.extra = ae;
2418
paul718e3742002-12-13 20:15:29 +00002419 str2prefix ("::/0", &p);
2420
2421 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002422 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +00002423 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002424 ae->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00002425
2426 /* If the peer is on shared nextwork and we have link-local
2427 nexthop set it. */
2428 if (peer->shared_network
2429 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2430 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002431 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00002432 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002433 ae->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00002434 }
2435 }
2436#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00002437
2438 if (peer->default_rmap[afi][safi].name)
2439 {
2440 binfo.peer = bgp->peer_self;
2441 binfo.attr = &attr;
2442
paulfee0f4c2004-09-13 05:12:46 +00002443 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2444
paul718e3742002-12-13 20:15:29 +00002445 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2446 RMAP_BGP, &binfo);
2447
paulfee0f4c2004-09-13 05:12:46 +00002448 bgp->peer_self->rmap_type = 0;
2449
paul718e3742002-12-13 20:15:29 +00002450 if (ret == RMAP_DENYMATCH)
2451 {
2452 bgp_attr_flush (&attr);
2453 withdraw = 1;
2454 }
2455 }
2456
2457 if (withdraw)
2458 {
2459 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2460 bgp_default_withdraw_send (peer, afi, safi);
2461 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2462 }
2463 else
2464 {
2465 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2466 bgp_default_update_send (peer, &attr, afi, safi, from);
2467 }
Paul Jakmafb982c22007-05-04 20:15:47 +00002468
2469 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00002470 aspath_unintern (aspath);
2471}
2472
2473static void
2474bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
paulfee0f4c2004-09-13 05:12:46 +00002475 struct bgp_table *table, int rsclient)
paul718e3742002-12-13 20:15:29 +00002476{
2477 struct bgp_node *rn;
2478 struct bgp_info *ri;
Chris Caputo228da422009-07-18 05:44:03 +00002479 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002480
paul718e3742002-12-13 20:15:29 +00002481 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002482 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
paul718e3742002-12-13 20:15:29 +00002483
2484 if (safi != SAFI_MPLS_VPN
2485 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2486 bgp_default_originate (peer, afi, safi, 0);
2487
2488 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2489 for (ri = rn->info; ri; ri = ri->next)
2490 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2491 {
paulfee0f4c2004-09-13 05:12:46 +00002492 if ( (rsclient) ?
2493 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2494 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
paul718e3742002-12-13 20:15:29 +00002495 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2496 else
2497 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00002498
2499 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00002500 }
2501}
2502
2503void
2504bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2505{
2506 struct bgp_node *rn;
2507 struct bgp_table *table;
2508
2509 if (peer->status != Established)
2510 return;
2511
2512 if (! peer->afc_nego[afi][safi])
2513 return;
2514
2515 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2516 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2517 return;
2518
2519 if (safi != SAFI_MPLS_VPN)
paulfee0f4c2004-09-13 05:12:46 +00002520 bgp_announce_table (peer, afi, safi, NULL, 0);
paul718e3742002-12-13 20:15:29 +00002521 else
2522 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2523 rn = bgp_route_next(rn))
2524 if ((table = (rn->info)) != NULL)
paulfee0f4c2004-09-13 05:12:46 +00002525 bgp_announce_table (peer, afi, safi, table, 0);
2526
2527 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2528 bgp_announce_table (peer, afi, safi, NULL, 1);
paul718e3742002-12-13 20:15:29 +00002529}
2530
2531void
2532bgp_announce_route_all (struct peer *peer)
2533{
2534 afi_t afi;
2535 safi_t safi;
2536
2537 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2538 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2539 bgp_announce_route (peer, afi, safi);
2540}
2541
2542static void
paulfee0f4c2004-09-13 05:12:46 +00002543bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2544 safi_t safi, struct bgp_table *table)
2545{
2546 struct bgp_node *rn;
2547 struct bgp_adj_in *ain;
2548
2549 if (! table)
2550 table = rsclient->bgp->rib[afi][safi];
2551
2552 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2553 for (ain = rn->adj_in; ain; ain = ain->next)
2554 {
2555 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2556 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2557 }
2558}
2559
2560void
2561bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2562{
2563 struct bgp_table *table;
2564 struct bgp_node *rn;
2565
2566 if (safi != SAFI_MPLS_VPN)
2567 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2568
2569 else
2570 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2571 rn = bgp_route_next (rn))
2572 if ((table = rn->info) != NULL)
2573 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2574}
2575
2576static void
paul718e3742002-12-13 20:15:29 +00002577bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2578 struct bgp_table *table)
2579{
2580 int ret;
2581 struct bgp_node *rn;
2582 struct bgp_adj_in *ain;
2583
2584 if (! table)
2585 table = peer->bgp->rib[afi][safi];
2586
2587 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2588 for (ain = rn->adj_in; ain; ain = ain->next)
2589 {
2590 if (ain->peer == peer)
2591 {
2592 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2593 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2594 NULL, NULL, 1);
2595 if (ret < 0)
2596 {
2597 bgp_unlock_node (rn);
2598 return;
2599 }
2600 continue;
2601 }
2602 }
2603}
2604
2605void
2606bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2607{
2608 struct bgp_node *rn;
2609 struct bgp_table *table;
2610
2611 if (peer->status != Established)
2612 return;
2613
2614 if (safi != SAFI_MPLS_VPN)
2615 bgp_soft_reconfig_table (peer, afi, safi, NULL);
2616 else
2617 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2618 rn = bgp_route_next (rn))
2619 if ((table = rn->info) != NULL)
2620 bgp_soft_reconfig_table (peer, afi, safi, table);
2621}
2622
Chris Caputo228da422009-07-18 05:44:03 +00002623
2624struct bgp_clear_node_queue
2625{
2626 struct bgp_node *rn;
2627 enum bgp_clear_route_type purpose;
2628};
2629
paul200df112005-06-01 11:17:05 +00002630static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00002631bgp_clear_route_node (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002632{
Chris Caputo228da422009-07-18 05:44:03 +00002633 struct bgp_clear_node_queue *cnq = data;
2634 struct bgp_node *rn = cnq->rn;
Paul Jakma64e580a2006-02-21 01:09:01 +00002635 struct peer *peer = wq->spec.data;
paul200df112005-06-01 11:17:05 +00002636 struct bgp_info *ri;
Paul Jakma64e580a2006-02-21 01:09:01 +00002637 afi_t afi = rn->table->afi;
2638 safi_t safi = rn->table->safi;
paul200df112005-06-01 11:17:05 +00002639
Paul Jakma64e580a2006-02-21 01:09:01 +00002640 assert (rn && peer);
paul200df112005-06-01 11:17:05 +00002641
Paul Jakma64e580a2006-02-21 01:09:01 +00002642 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002643 if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
paul200df112005-06-01 11:17:05 +00002644 {
2645 /* graceful restart STALE flag set. */
Paul Jakma64e580a2006-02-21 01:09:01 +00002646 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2647 && peer->nsf[afi][safi]
paul200df112005-06-01 11:17:05 +00002648 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
Paul Jakma1a392d42006-09-07 00:24:49 +00002649 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2650 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
paul200df112005-06-01 11:17:05 +00002651 else
Paul Jakma64e580a2006-02-21 01:09:01 +00002652 bgp_rib_remove (rn, ri, peer, afi, safi);
paul200df112005-06-01 11:17:05 +00002653 break;
2654 }
paul200df112005-06-01 11:17:05 +00002655 return WQ_SUCCESS;
2656}
2657
2658static void
paul0fb58d52005-11-14 14:31:49 +00002659bgp_clear_node_queue_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002660{
Chris Caputo228da422009-07-18 05:44:03 +00002661 struct bgp_clear_node_queue *cnq = data;
2662 struct bgp_node *rn = cnq->rn;
2663 struct bgp_table *table = rn->table;
Paul Jakma64e580a2006-02-21 01:09:01 +00002664
2665 bgp_unlock_node (rn);
Chris Caputo228da422009-07-18 05:44:03 +00002666 bgp_table_unlock (table);
2667 XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
paul200df112005-06-01 11:17:05 +00002668}
2669
2670static void
paul94f2b392005-06-28 12:44:16 +00002671bgp_clear_node_complete (struct work_queue *wq)
paul200df112005-06-01 11:17:05 +00002672{
Paul Jakma64e580a2006-02-21 01:09:01 +00002673 struct peer *peer = wq->spec.data;
2674
Paul Jakma3e0c78e2006-03-06 18:06:53 +00002675 /* Tickle FSM to start moving again */
Paul Jakmaca058a32006-09-14 02:58:49 +00002676 BGP_EVENT_ADD (peer, Clearing_Completed);
Chris Caputo228da422009-07-18 05:44:03 +00002677
2678 peer_unlock (peer); /* bgp_clear_route */
paul200df112005-06-01 11:17:05 +00002679}
2680
2681static void
Paul Jakma64e580a2006-02-21 01:09:01 +00002682bgp_clear_node_queue_init (struct peer *peer)
paul200df112005-06-01 11:17:05 +00002683{
Paul Jakmaa2943652009-07-21 14:02:04 +01002684 char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
Paul Jakma64e580a2006-02-21 01:09:01 +00002685
Paul Jakmaa2943652009-07-21 14:02:04 +01002686 snprintf (wname, sizeof(wname), "clear %s", peer->host);
Paul Jakma64e580a2006-02-21 01:09:01 +00002687#undef CLEAR_QUEUE_NAME_LEN
2688
2689 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
paul200df112005-06-01 11:17:05 +00002690 {
2691 zlog_err ("%s: Failed to allocate work queue", __func__);
2692 exit (1);
2693 }
Paul Jakma64e580a2006-02-21 01:09:01 +00002694 peer->clear_node_queue->spec.hold = 10;
2695 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2696 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2697 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2698 peer->clear_node_queue->spec.max_retries = 0;
2699
2700 /* we only 'lock' this peer reference when the queue is actually active */
2701 peer->clear_node_queue->spec.data = peer;
paul200df112005-06-01 11:17:05 +00002702}
2703
paul718e3742002-12-13 20:15:29 +00002704static void
2705bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
Chris Caputo228da422009-07-18 05:44:03 +00002706 struct bgp_table *table, struct peer *rsclient,
2707 enum bgp_clear_route_type purpose)
paul718e3742002-12-13 20:15:29 +00002708{
2709 struct bgp_node *rn;
paul200df112005-06-01 11:17:05 +00002710
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002711
paul718e3742002-12-13 20:15:29 +00002712 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002713 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
Paul Jakma64e580a2006-02-21 01:09:01 +00002714
hasso6cf159b2005-03-21 10:28:14 +00002715 /* If still no table => afi/safi isn't configured at all or smth. */
2716 if (! table)
2717 return;
Paul Jakma65ca75e2006-05-04 08:08:15 +00002718
2719 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2720 {
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002721 struct bgp_info *ri;
2722 struct bgp_adj_in *ain;
2723 struct bgp_adj_out *aout;
2724
Paul Jakma65ca75e2006-05-04 08:08:15 +00002725 if (rn->info == NULL)
2726 continue;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002727
2728 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2729 * queued for every clearing peer, regardless of whether it is
2730 * relevant to the peer at hand.
2731 *
2732 * Overview: There are 3 different indices which need to be
2733 * scrubbed, potentially, when a peer is removed:
2734 *
2735 * 1 peer's routes visible via the RIB (ie accepted routes)
2736 * 2 peer's routes visible by the (optional) peer's adj-in index
2737 * 3 other routes visible by the peer's adj-out index
2738 *
2739 * 3 there is no hurry in scrubbing, once the struct peer is
2740 * removed from bgp->peer, we could just GC such deleted peer's
2741 * adj-outs at our leisure.
2742 *
2743 * 1 and 2 must be 'scrubbed' in some way, at least made
2744 * invisible via RIB index before peer session is allowed to be
2745 * brought back up. So one needs to know when such a 'search' is
2746 * complete.
2747 *
2748 * Ideally:
2749 *
2750 * - there'd be a single global queue or a single RIB walker
2751 * - rather than tracking which route_nodes still need to be
2752 * examined on a peer basis, we'd track which peers still
2753 * aren't cleared
2754 *
2755 * Given that our per-peer prefix-counts now should be reliable,
2756 * this may actually be achievable. It doesn't seem to be a huge
2757 * problem at this time,
2758 */
2759 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002760 if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002761 {
Chris Caputo228da422009-07-18 05:44:03 +00002762 struct bgp_clear_node_queue *cnq;
2763
2764 /* both unlocked in bgp_clear_node_queue_del */
2765 bgp_table_lock (rn->table);
2766 bgp_lock_node (rn);
2767 cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2768 sizeof (struct bgp_clear_node_queue));
2769 cnq->rn = rn;
2770 cnq->purpose = purpose;
2771 work_queue_add (peer->clear_node_queue, cnq);
2772 break;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002773 }
2774
2775 for (ain = rn->adj_in; ain; ain = ain->next)
Chris Caputo228da422009-07-18 05:44:03 +00002776 if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002777 {
2778 bgp_adj_in_remove (rn, ain);
2779 bgp_unlock_node (rn);
2780 break;
2781 }
2782 for (aout = rn->adj_out; aout; aout = aout->next)
Chris Caputo228da422009-07-18 05:44:03 +00002783 if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002784 {
2785 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2786 bgp_unlock_node (rn);
2787 break;
2788 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002789 }
2790 return;
2791}
2792
2793void
Chris Caputo228da422009-07-18 05:44:03 +00002794bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2795 enum bgp_clear_route_type purpose)
Paul Jakma65ca75e2006-05-04 08:08:15 +00002796{
2797 struct bgp_node *rn;
2798 struct bgp_table *table;
2799 struct peer *rsclient;
2800 struct listnode *node, *nnode;
hasso6cf159b2005-03-21 10:28:14 +00002801
Paul Jakma64e580a2006-02-21 01:09:01 +00002802 if (peer->clear_node_queue == NULL)
2803 bgp_clear_node_queue_init (peer);
paul200df112005-06-01 11:17:05 +00002804
Paul Jakmaca058a32006-09-14 02:58:49 +00002805 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2806 * Idle until it receives a Clearing_Completed event. This protects
2807 * against peers which flap faster than we can we clear, which could
2808 * lead to:
Paul Jakma64e580a2006-02-21 01:09:01 +00002809 *
2810 * a) race with routes from the new session being installed before
2811 * clear_route_node visits the node (to delete the route of that
2812 * peer)
2813 * b) resource exhaustion, clear_route_node likely leads to an entry
2814 * on the process_main queue. Fast-flapping could cause that queue
2815 * to grow and grow.
paul200df112005-06-01 11:17:05 +00002816 */
Paul Jakmaca058a32006-09-14 02:58:49 +00002817 if (!peer->clear_node_queue->thread)
2818 peer_lock (peer); /* bgp_clear_node_complete */
paulfee0f4c2004-09-13 05:12:46 +00002819
Chris Caputo228da422009-07-18 05:44:03 +00002820 switch (purpose)
paulfee0f4c2004-09-13 05:12:46 +00002821 {
Chris Caputo228da422009-07-18 05:44:03 +00002822 case BGP_CLEAR_ROUTE_NORMAL:
2823 if (safi != SAFI_MPLS_VPN)
2824 bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2825 else
2826 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2827 rn = bgp_route_next (rn))
2828 if ((table = rn->info) != NULL)
2829 bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2830
2831 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2832 if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2833 PEER_FLAG_RSERVER_CLIENT))
2834 bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2835 break;
2836
2837 case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2838 bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2839 break;
2840
2841 default:
2842 assert (0);
2843 break;
paulfee0f4c2004-09-13 05:12:46 +00002844 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002845
Paul Jakmaca058a32006-09-14 02:58:49 +00002846 /* If no routes were cleared, nothing was added to workqueue, the
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002847 * completion function won't be run by workqueue code - call it here.
2848 * XXX: Actually, this assumption doesn't hold, see
2849 * bgp_clear_route_table(), we queue all non-empty nodes.
Paul Jakmaca058a32006-09-14 02:58:49 +00002850 *
2851 * Additionally, there is a presumption in FSM that clearing is only
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002852 * really needed if peer state is Established - peers in
2853 * pre-Established states shouldn't have any route-update state
2854 * associated with them (in or out).
Paul Jakmaca058a32006-09-14 02:58:49 +00002855 *
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002856 * We still can get here in pre-Established though, through
2857 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2858 * check to ensure the assumption above holds.
Paul Jakmaca058a32006-09-14 02:58:49 +00002859 *
2860 * At some future point, this check could be move to the top of the
2861 * function, and do a quick early-return when state is
2862 * pre-Established, avoiding above list and table scans. Once we're
2863 * sure it is safe..
Paul Jakma65ca75e2006-05-04 08:08:15 +00002864 */
2865 if (!peer->clear_node_queue->thread)
2866 bgp_clear_node_complete (peer->clear_node_queue);
paul718e3742002-12-13 20:15:29 +00002867}
2868
2869void
2870bgp_clear_route_all (struct peer *peer)
2871{
2872 afi_t afi;
2873 safi_t safi;
2874
2875 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2876 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
Chris Caputo228da422009-07-18 05:44:03 +00002877 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
paul718e3742002-12-13 20:15:29 +00002878}
2879
2880void
2881bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2882{
2883 struct bgp_table *table;
2884 struct bgp_node *rn;
2885 struct bgp_adj_in *ain;
2886
2887 table = peer->bgp->rib[afi][safi];
2888
2889 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2890 for (ain = rn->adj_in; ain ; ain = ain->next)
2891 if (ain->peer == peer)
2892 {
2893 bgp_adj_in_remove (rn, ain);
2894 bgp_unlock_node (rn);
2895 break;
2896 }
2897}
hasso93406d82005-02-02 14:40:33 +00002898
2899void
2900bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2901{
2902 struct bgp_node *rn;
2903 struct bgp_info *ri;
2904 struct bgp_table *table;
2905
2906 table = peer->bgp->rib[afi][safi];
2907
2908 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2909 {
2910 for (ri = rn->info; ri; ri = ri->next)
2911 if (ri->peer == peer)
2912 {
2913 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2914 bgp_rib_remove (rn, ri, peer, afi, safi);
2915 break;
2916 }
2917 }
2918}
paul718e3742002-12-13 20:15:29 +00002919
2920/* Delete all kernel routes. */
2921void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08002922bgp_cleanup_routes (void)
paul718e3742002-12-13 20:15:29 +00002923{
2924 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00002925 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002926 struct bgp_node *rn;
2927 struct bgp_table *table;
2928 struct bgp_info *ri;
2929
paul1eb8ef22005-04-07 07:30:20 +00002930 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00002931 {
2932 table = bgp->rib[AFI_IP][SAFI_UNICAST];
2933
2934 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2935 for (ri = rn->info; ri; ri = ri->next)
2936 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2937 && ri->type == ZEBRA_ROUTE_BGP
2938 && ri->sub_type == BGP_ROUTE_NORMAL)
2939 bgp_zebra_withdraw (&rn->p, ri);
2940
2941 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
2942
2943 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2944 for (ri = rn->info; ri; ri = ri->next)
2945 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2946 && ri->type == ZEBRA_ROUTE_BGP
2947 && ri->sub_type == BGP_ROUTE_NORMAL)
2948 bgp_zebra_withdraw (&rn->p, ri);
2949 }
2950}
2951
2952void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08002953bgp_reset (void)
paul718e3742002-12-13 20:15:29 +00002954{
2955 vty_reset ();
2956 bgp_zclient_reset ();
2957 access_list_reset ();
2958 prefix_list_reset ();
2959}
2960
2961/* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
2962 value. */
2963int
2964bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
2965{
2966 u_char *pnt;
2967 u_char *lim;
2968 struct prefix p;
2969 int psize;
2970 int ret;
2971
2972 /* Check peer status. */
2973 if (peer->status != Established)
2974 return 0;
2975
2976 pnt = packet->nlri;
2977 lim = pnt + packet->length;
2978
2979 for (; pnt < lim; pnt += psize)
2980 {
2981 /* Clear prefix structure. */
2982 memset (&p, 0, sizeof (struct prefix));
2983
2984 /* Fetch prefix length. */
2985 p.prefixlen = *pnt++;
2986 p.family = afi2family (packet->afi);
2987
2988 /* Already checked in nlri_sanity_check(). We do double check
2989 here. */
2990 if ((packet->afi == AFI_IP && p.prefixlen > 32)
2991 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
2992 return -1;
2993
2994 /* Packet size overflow check. */
2995 psize = PSIZE (p.prefixlen);
2996
2997 /* When packet overflow occur return immediately. */
2998 if (pnt + psize > lim)
2999 return -1;
3000
3001 /* Fetch prefix from NLRI packet. */
3002 memcpy (&p.u.prefix, pnt, psize);
3003
3004 /* Check address. */
3005 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3006 {
3007 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3008 {
paulf5ba3872004-07-09 12:11:31 +00003009 /*
3010 * From draft-ietf-idr-bgp4-22, Section 6.3:
3011 * If a BGP router receives an UPDATE message with a
3012 * semantically incorrect NLRI field, in which a prefix is
3013 * semantically incorrect (eg. an unexpected multicast IP
3014 * address), it should ignore the prefix.
3015 */
paul718e3742002-12-13 20:15:29 +00003016 zlog (peer->log, LOG_ERR,
3017 "IPv4 unicast NLRI is multicast address %s",
3018 inet_ntoa (p.u.prefix4));
paulf5ba3872004-07-09 12:11:31 +00003019
paul718e3742002-12-13 20:15:29 +00003020 return -1;
3021 }
3022 }
3023
3024#ifdef HAVE_IPV6
3025 /* Check address. */
3026 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3027 {
3028 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3029 {
3030 char buf[BUFSIZ];
3031
3032 zlog (peer->log, LOG_WARNING,
3033 "IPv6 link-local NLRI received %s ignore this NLRI",
3034 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3035
3036 continue;
3037 }
3038 }
3039#endif /* HAVE_IPV6 */
3040
3041 /* Normal process. */
3042 if (attr)
3043 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3044 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3045 else
3046 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3047 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3048
3049 /* Address family configuration mismatch or maximum-prefix count
3050 overflow. */
3051 if (ret < 0)
3052 return -1;
3053 }
3054
3055 /* Packet length consistency check. */
3056 if (pnt != lim)
3057 return -1;
3058
3059 return 0;
3060}
3061
3062/* NLRI encode syntax check routine. */
3063int
3064bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3065 bgp_size_t length)
3066{
3067 u_char *end;
3068 u_char prefixlen;
3069 int psize;
3070
3071 end = pnt + length;
3072
3073 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3074 syntactic validity. If the field is syntactically incorrect,
3075 then the Error Subcode is set to Invalid Network Field. */
3076
3077 while (pnt < end)
3078 {
3079 prefixlen = *pnt++;
3080
3081 /* Prefix length check. */
3082 if ((afi == AFI_IP && prefixlen > 32)
3083 || (afi == AFI_IP6 && prefixlen > 128))
3084 {
3085 plog_err (peer->log,
3086 "%s [Error] Update packet error (wrong prefix length %d)",
3087 peer->host, prefixlen);
3088 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3089 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3090 return -1;
3091 }
3092
3093 /* Packet size overflow check. */
3094 psize = PSIZE (prefixlen);
3095
3096 if (pnt + psize > end)
3097 {
3098 plog_err (peer->log,
3099 "%s [Error] Update packet error"
3100 " (prefix data overflow prefix size is %d)",
3101 peer->host, psize);
3102 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3103 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3104 return -1;
3105 }
3106
3107 pnt += psize;
3108 }
3109
3110 /* Packet length consistency check. */
3111 if (pnt != end)
3112 {
3113 plog_err (peer->log,
3114 "%s [Error] Update packet error"
3115 " (prefix length mismatch with total length)",
3116 peer->host);
3117 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3118 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3119 return -1;
3120 }
3121 return 0;
3122}
3123
paul94f2b392005-06-28 12:44:16 +00003124static struct bgp_static *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003125bgp_static_new (void)
paul718e3742002-12-13 20:15:29 +00003126{
Stephen Hemminger393deb92008-08-18 14:13:29 -07003127 return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
paul718e3742002-12-13 20:15:29 +00003128}
3129
paul94f2b392005-06-28 12:44:16 +00003130static void
paul718e3742002-12-13 20:15:29 +00003131bgp_static_free (struct bgp_static *bgp_static)
3132{
3133 if (bgp_static->rmap.name)
3134 free (bgp_static->rmap.name);
3135 XFREE (MTYPE_BGP_STATIC, bgp_static);
3136}
3137
paul94f2b392005-06-28 12:44:16 +00003138static void
paulfee0f4c2004-09-13 05:12:46 +00003139bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3140 struct prefix *p, afi_t afi, safi_t safi)
3141{
3142 struct bgp_node *rn;
3143 struct bgp_info *ri;
3144
3145 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3146
3147 /* Check selected route and self inserted route. */
3148 for (ri = rn->info; ri; ri = ri->next)
3149 if (ri->peer == bgp->peer_self
3150 && ri->type == ZEBRA_ROUTE_BGP
3151 && ri->sub_type == BGP_ROUTE_STATIC)
3152 break;
3153
3154 /* Withdraw static BGP route from routing table. */
3155 if (ri)
3156 {
paulfee0f4c2004-09-13 05:12:46 +00003157 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003158 bgp_process (bgp, rn, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003159 }
3160
3161 /* Unlock bgp_node_lookup. */
3162 bgp_unlock_node (rn);
3163}
3164
paul94f2b392005-06-28 12:44:16 +00003165static void
paulfee0f4c2004-09-13 05:12:46 +00003166bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
Paul Jakmafb982c22007-05-04 20:15:47 +00003167 struct bgp_static *bgp_static,
3168 afi_t afi, safi_t safi)
paulfee0f4c2004-09-13 05:12:46 +00003169{
3170 struct bgp_node *rn;
3171 struct bgp_info *ri;
3172 struct bgp_info *new;
3173 struct bgp_info info;
paulfee0f4c2004-09-13 05:12:46 +00003174 struct attr *attr_new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003175 struct attr attr = {0 };
3176 struct attr new_attr = { .extra = 0 };
paulfee0f4c2004-09-13 05:12:46 +00003177 struct bgp *bgp;
3178 int ret;
3179 char buf[SU_ADDRSTRLEN];
3180
3181 bgp = rsclient->bgp;
3182
Paul Jakma06e110f2006-05-12 23:29:22 +00003183 assert (bgp_static);
3184 if (!bgp_static)
3185 return;
3186
paulfee0f4c2004-09-13 05:12:46 +00003187 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3188
3189 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakma06e110f2006-05-12 23:29:22 +00003190
3191 attr.nexthop = bgp_static->igpnexthop;
3192 attr.med = bgp_static->igpmetric;
3193 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
Paul Jakma41367172007-08-06 15:24:51 +00003194
Paul Jakma41367172007-08-06 15:24:51 +00003195 if (bgp_static->atomic)
3196 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3197
paulfee0f4c2004-09-13 05:12:46 +00003198 /* Apply network route-map for export to this rsclient. */
3199 if (bgp_static->rmap.name)
3200 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003201 struct attr attr_tmp = attr;
paulfee0f4c2004-09-13 05:12:46 +00003202 info.peer = rsclient;
Paul Jakmafb982c22007-05-04 20:15:47 +00003203 info.attr = &attr_tmp;
3204
paulfee0f4c2004-09-13 05:12:46 +00003205 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3206 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3207
3208 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3209
3210 rsclient->rmap_type = 0;
3211
3212 if (ret == RMAP_DENYMATCH)
3213 {
3214 /* Free uninterned attribute. */
Paul Jakmafb982c22007-05-04 20:15:47 +00003215 bgp_attr_flush (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003216
3217 /* Unintern original. */
3218 aspath_unintern (attr.aspath);
3219 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00003220 bgp_attr_extra_free (&attr);
3221
paulfee0f4c2004-09-13 05:12:46 +00003222 return;
3223 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003224 attr_new = bgp_attr_intern (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003225 }
3226 else
3227 attr_new = bgp_attr_intern (&attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00003228
Stephen Hemminger7badc262010-08-05 10:26:31 -07003229 bgp_attr_dup(&new_attr, attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00003230
paulfee0f4c2004-09-13 05:12:46 +00003231 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3232
Paul Jakmafb982c22007-05-04 20:15:47 +00003233 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3234 == RMAP_DENY)
3235 {
paulfee0f4c2004-09-13 05:12:46 +00003236 /* This BGP update is filtered. Log the reason then update BGP entry. */
3237 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00003238 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00003239 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3240 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3241 p->prefixlen, rsclient->host);
3242
3243 bgp->peer_self->rmap_type = 0;
3244
3245 bgp_attr_unintern (attr_new);
3246 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003247 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003248
3249 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3250
3251 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003252 }
paulfee0f4c2004-09-13 05:12:46 +00003253
3254 bgp->peer_self->rmap_type = 0;
3255
3256 bgp_attr_unintern (attr_new);
3257 attr_new = bgp_attr_intern (&new_attr);
Stephen Hemminger7badc262010-08-05 10:26:31 -07003258 bgp_attr_extra_free (&new_attr);
paulfee0f4c2004-09-13 05:12:46 +00003259
3260 for (ri = rn->info; ri; ri = ri->next)
3261 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3262 && ri->sub_type == BGP_ROUTE_STATIC)
3263 break;
3264
3265 if (ri)
3266 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003267 if (attrhash_cmp (ri->attr, attr_new) &&
3268 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paulfee0f4c2004-09-13 05:12:46 +00003269 {
3270 bgp_unlock_node (rn);
3271 bgp_attr_unintern (attr_new);
3272 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003273 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003274 return;
3275 }
3276 else
3277 {
3278 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003279 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00003280
3281 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003282 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3283 bgp_info_restore(rn, ri);
paulfee0f4c2004-09-13 05:12:46 +00003284 bgp_attr_unintern (ri->attr);
3285 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003286 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003287
3288 /* Process change. */
3289 bgp_process (bgp, rn, afi, safi);
3290 bgp_unlock_node (rn);
3291 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003292 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003293 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003294 }
paulfee0f4c2004-09-13 05:12:46 +00003295 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003296
paulfee0f4c2004-09-13 05:12:46 +00003297 /* Make new BGP info. */
3298 new = bgp_info_new ();
3299 new->type = ZEBRA_ROUTE_BGP;
3300 new->sub_type = BGP_ROUTE_STATIC;
3301 new->peer = bgp->peer_self;
3302 SET_FLAG (new->flags, BGP_INFO_VALID);
3303 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003304 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00003305
3306 /* Register new BGP information. */
3307 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003308
3309 /* route_node_get lock */
3310 bgp_unlock_node (rn);
3311
paulfee0f4c2004-09-13 05:12:46 +00003312 /* Process change. */
3313 bgp_process (bgp, rn, afi, safi);
3314
3315 /* Unintern original. */
3316 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003317 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003318}
3319
paul94f2b392005-06-28 12:44:16 +00003320static void
paulfee0f4c2004-09-13 05:12:46 +00003321bgp_static_update_main (struct bgp *bgp, struct prefix *p,
paul718e3742002-12-13 20:15:29 +00003322 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3323{
3324 struct bgp_node *rn;
3325 struct bgp_info *ri;
3326 struct bgp_info *new;
3327 struct bgp_info info;
Paul Jakmafb982c22007-05-04 20:15:47 +00003328 struct attr attr = { 0 };
paul718e3742002-12-13 20:15:29 +00003329 struct attr *attr_new;
3330 int ret;
3331
Paul Jakmadd8103a2006-05-12 23:27:30 +00003332 assert (bgp_static);
3333 if (!bgp_static)
3334 return;
3335
paulfee0f4c2004-09-13 05:12:46 +00003336 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003337
3338 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakmadd8103a2006-05-12 23:27:30 +00003339
3340 attr.nexthop = bgp_static->igpnexthop;
3341 attr.med = bgp_static->igpmetric;
3342 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
paul718e3742002-12-13 20:15:29 +00003343
Paul Jakma41367172007-08-06 15:24:51 +00003344 if (bgp_static->atomic)
3345 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3346
paul718e3742002-12-13 20:15:29 +00003347 /* Apply route-map. */
3348 if (bgp_static->rmap.name)
3349 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003350 struct attr attr_tmp = attr;
paul718e3742002-12-13 20:15:29 +00003351 info.peer = bgp->peer_self;
paul286e1e72003-08-08 00:24:31 +00003352 info.attr = &attr_tmp;
paul718e3742002-12-13 20:15:29 +00003353
paulfee0f4c2004-09-13 05:12:46 +00003354 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3355
paul718e3742002-12-13 20:15:29 +00003356 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
paul286e1e72003-08-08 00:24:31 +00003357
paulfee0f4c2004-09-13 05:12:46 +00003358 bgp->peer_self->rmap_type = 0;
3359
paul718e3742002-12-13 20:15:29 +00003360 if (ret == RMAP_DENYMATCH)
3361 {
3362 /* Free uninterned attribute. */
paul286e1e72003-08-08 00:24:31 +00003363 bgp_attr_flush (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003364
3365 /* Unintern original. */
3366 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003367 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003368 bgp_static_withdraw (bgp, p, afi, safi);
3369 return;
3370 }
paul286e1e72003-08-08 00:24:31 +00003371 attr_new = bgp_attr_intern (&attr_tmp);
paul718e3742002-12-13 20:15:29 +00003372 }
paul286e1e72003-08-08 00:24:31 +00003373 else
3374 attr_new = bgp_attr_intern (&attr);
paul718e3742002-12-13 20:15:29 +00003375
3376 for (ri = rn->info; ri; ri = ri->next)
3377 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3378 && ri->sub_type == BGP_ROUTE_STATIC)
3379 break;
3380
3381 if (ri)
3382 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003383 if (attrhash_cmp (ri->attr, attr_new) &&
3384 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00003385 {
3386 bgp_unlock_node (rn);
3387 bgp_attr_unintern (attr_new);
3388 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003389 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003390 return;
3391 }
3392 else
3393 {
3394 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00003395 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00003396
3397 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00003398 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3399 bgp_info_restore(rn, ri);
3400 else
3401 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003402 bgp_attr_unintern (ri->attr);
3403 ri->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003404 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003405
3406 /* Process change. */
3407 bgp_aggregate_increment (bgp, p, ri, afi, safi);
3408 bgp_process (bgp, rn, afi, safi);
3409 bgp_unlock_node (rn);
3410 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003411 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003412 return;
3413 }
3414 }
3415
3416 /* Make new BGP info. */
3417 new = bgp_info_new ();
3418 new->type = ZEBRA_ROUTE_BGP;
3419 new->sub_type = BGP_ROUTE_STATIC;
3420 new->peer = bgp->peer_self;
3421 SET_FLAG (new->flags, BGP_INFO_VALID);
3422 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03003423 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00003424
3425 /* Aggregate address increment. */
3426 bgp_aggregate_increment (bgp, p, new, afi, safi);
3427
3428 /* Register new BGP information. */
3429 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00003430
3431 /* route_node_get lock */
3432 bgp_unlock_node (rn);
3433
paul718e3742002-12-13 20:15:29 +00003434 /* Process change. */
3435 bgp_process (bgp, rn, afi, safi);
3436
3437 /* Unintern original. */
3438 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003439 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00003440}
3441
3442void
paulfee0f4c2004-09-13 05:12:46 +00003443bgp_static_update (struct bgp *bgp, struct prefix *p,
3444 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3445{
3446 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00003447 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00003448
3449 bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3450
paul1eb8ef22005-04-07 07:30:20 +00003451 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00003452 {
Paul Jakmada5b30f2006-05-08 14:37:17 +00003453 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3454 bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003455 }
3456}
3457
paul94f2b392005-06-28 12:44:16 +00003458static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003459bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3460 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003461{
3462 struct bgp_node *rn;
3463 struct bgp_info *new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003464
paulfee0f4c2004-09-13 05:12:46 +00003465 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003466
3467 /* Make new BGP info. */
3468 new = bgp_info_new ();
3469 new->type = ZEBRA_ROUTE_BGP;
3470 new->sub_type = BGP_ROUTE_STATIC;
3471 new->peer = bgp->peer_self;
3472 new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3473 SET_FLAG (new->flags, BGP_INFO_VALID);
Stephen Hemminger65957882010-01-15 16:22:10 +03003474 new->uptime = bgp_clock ();
Paul Jakmafb982c22007-05-04 20:15:47 +00003475 new->extra = bgp_info_extra_new();
3476 memcpy (new->extra->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00003477
3478 /* Aggregate address increment. */
paul200df112005-06-01 11:17:05 +00003479 bgp_aggregate_increment (bgp, p, new, afi, safi);
paul718e3742002-12-13 20:15:29 +00003480
3481 /* Register new BGP information. */
paul200df112005-06-01 11:17:05 +00003482 bgp_info_add (rn, new);
paul718e3742002-12-13 20:15:29 +00003483
paul200df112005-06-01 11:17:05 +00003484 /* route_node_get lock */
3485 bgp_unlock_node (rn);
3486
paul718e3742002-12-13 20:15:29 +00003487 /* Process change. */
3488 bgp_process (bgp, rn, afi, safi);
3489}
3490
3491void
3492bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3493 safi_t safi)
3494{
3495 struct bgp_node *rn;
3496 struct bgp_info *ri;
3497
paulfee0f4c2004-09-13 05:12:46 +00003498 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
paul718e3742002-12-13 20:15:29 +00003499
3500 /* Check selected route and self inserted route. */
3501 for (ri = rn->info; ri; ri = ri->next)
3502 if (ri->peer == bgp->peer_self
3503 && ri->type == ZEBRA_ROUTE_BGP
3504 && ri->sub_type == BGP_ROUTE_STATIC)
3505 break;
3506
3507 /* Withdraw static BGP route from routing table. */
3508 if (ri)
3509 {
3510 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003511 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003512 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003513 }
3514
3515 /* Unlock bgp_node_lookup. */
3516 bgp_unlock_node (rn);
3517}
3518
3519void
paulfee0f4c2004-09-13 05:12:46 +00003520bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3521{
3522 struct bgp_static *bgp_static;
3523 struct bgp *bgp;
3524 struct bgp_node *rn;
3525 struct prefix *p;
3526
3527 bgp = rsclient->bgp;
3528
3529 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3530 if ((bgp_static = rn->info) != NULL)
3531 {
3532 p = &rn->p;
3533
3534 bgp_static_update_rsclient (rsclient, p, bgp_static,
3535 afi, safi);
3536 }
3537}
3538
paul94f2b392005-06-28 12:44:16 +00003539static void
Michael Lambert4c9641b2010-07-22 13:20:55 -04003540bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3541 safi_t safi, struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00003542{
3543 struct bgp_node *rn;
3544 struct bgp_info *ri;
3545
paulfee0f4c2004-09-13 05:12:46 +00003546 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00003547
3548 /* Check selected route and self inserted route. */
3549 for (ri = rn->info; ri; ri = ri->next)
3550 if (ri->peer == bgp->peer_self
3551 && ri->type == ZEBRA_ROUTE_BGP
3552 && ri->sub_type == BGP_ROUTE_STATIC)
3553 break;
3554
3555 /* Withdraw static BGP route from routing table. */
3556 if (ri)
3557 {
3558 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
paul718e3742002-12-13 20:15:29 +00003559 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003560 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00003561 }
3562
3563 /* Unlock bgp_node_lookup. */
3564 bgp_unlock_node (rn);
3565}
3566
3567/* Configure static BGP network. When user don't run zebra, static
3568 route should be installed as valid. */
paul94f2b392005-06-28 12:44:16 +00003569static int
paulfd79ac92004-10-13 05:06:08 +00003570bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003571 afi_t afi, safi_t safi, const char *rmap, int backdoor)
paul718e3742002-12-13 20:15:29 +00003572{
3573 int ret;
3574 struct prefix p;
3575 struct bgp_static *bgp_static;
3576 struct bgp_node *rn;
Paul Jakma41367172007-08-06 15:24:51 +00003577 u_char need_update = 0;
paul718e3742002-12-13 20:15:29 +00003578
3579 /* Convert IP prefix string to struct prefix. */
3580 ret = str2prefix (ip_str, &p);
3581 if (! ret)
3582 {
3583 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3584 return CMD_WARNING;
3585 }
3586#ifdef HAVE_IPV6
3587 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3588 {
3589 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3590 VTY_NEWLINE);
3591 return CMD_WARNING;
3592 }
3593#endif /* HAVE_IPV6 */
3594
3595 apply_mask (&p);
3596
3597 /* Set BGP static route configuration. */
3598 rn = bgp_node_get (bgp->route[afi][safi], &p);
3599
3600 if (rn->info)
3601 {
3602 /* Configuration change. */
3603 bgp_static = rn->info;
3604
3605 /* Check previous routes are installed into BGP. */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003606 if (bgp_static->valid && bgp_static->backdoor != backdoor)
3607 need_update = 1;
Paul Jakma41367172007-08-06 15:24:51 +00003608
paul718e3742002-12-13 20:15:29 +00003609 bgp_static->backdoor = backdoor;
Paul Jakma41367172007-08-06 15:24:51 +00003610
paul718e3742002-12-13 20:15:29 +00003611 if (rmap)
3612 {
3613 if (bgp_static->rmap.name)
3614 free (bgp_static->rmap.name);
3615 bgp_static->rmap.name = strdup (rmap);
3616 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3617 }
3618 else
3619 {
3620 if (bgp_static->rmap.name)
3621 free (bgp_static->rmap.name);
3622 bgp_static->rmap.name = NULL;
3623 bgp_static->rmap.map = NULL;
3624 bgp_static->valid = 0;
3625 }
3626 bgp_unlock_node (rn);
3627 }
3628 else
3629 {
3630 /* New configuration. */
3631 bgp_static = bgp_static_new ();
3632 bgp_static->backdoor = backdoor;
3633 bgp_static->valid = 0;
3634 bgp_static->igpmetric = 0;
3635 bgp_static->igpnexthop.s_addr = 0;
Paul Jakma41367172007-08-06 15:24:51 +00003636
paul718e3742002-12-13 20:15:29 +00003637 if (rmap)
3638 {
3639 if (bgp_static->rmap.name)
3640 free (bgp_static->rmap.name);
3641 bgp_static->rmap.name = strdup (rmap);
3642 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3643 }
3644 rn->info = bgp_static;
3645 }
3646
3647 /* If BGP scan is not enabled, we should install this route here. */
3648 if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3649 {
3650 bgp_static->valid = 1;
3651
3652 if (need_update)
3653 bgp_static_withdraw (bgp, &p, afi, safi);
3654
3655 if (! bgp_static->backdoor)
3656 bgp_static_update (bgp, &p, bgp_static, afi, safi);
3657 }
3658
3659 return CMD_SUCCESS;
3660}
3661
3662/* Configure static BGP network. */
paul94f2b392005-06-28 12:44:16 +00003663static int
paulfd79ac92004-10-13 05:06:08 +00003664bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
Michael Lambert4c9641b2010-07-22 13:20:55 -04003665 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00003666{
3667 int ret;
3668 struct prefix p;
3669 struct bgp_static *bgp_static;
3670 struct bgp_node *rn;
3671
3672 /* Convert IP prefix string to struct prefix. */
3673 ret = str2prefix (ip_str, &p);
3674 if (! ret)
3675 {
3676 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3677 return CMD_WARNING;
3678 }
3679#ifdef HAVE_IPV6
3680 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3681 {
3682 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3683 VTY_NEWLINE);
3684 return CMD_WARNING;
3685 }
3686#endif /* HAVE_IPV6 */
3687
3688 apply_mask (&p);
3689
3690 rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3691 if (! rn)
3692 {
3693 vty_out (vty, "%% Can't find specified static route configuration.%s",
3694 VTY_NEWLINE);
3695 return CMD_WARNING;
3696 }
3697
3698 bgp_static = rn->info;
Paul Jakma41367172007-08-06 15:24:51 +00003699
paul718e3742002-12-13 20:15:29 +00003700 /* Update BGP RIB. */
3701 if (! bgp_static->backdoor)
3702 bgp_static_withdraw (bgp, &p, afi, safi);
3703
3704 /* Clear configuration. */
3705 bgp_static_free (bgp_static);
3706 rn->info = NULL;
3707 bgp_unlock_node (rn);
3708 bgp_unlock_node (rn);
3709
3710 return CMD_SUCCESS;
3711}
3712
3713/* Called from bgp_delete(). Delete all static routes from the BGP
3714 instance. */
3715void
3716bgp_static_delete (struct bgp *bgp)
3717{
3718 afi_t afi;
3719 safi_t safi;
3720 struct bgp_node *rn;
3721 struct bgp_node *rm;
3722 struct bgp_table *table;
3723 struct bgp_static *bgp_static;
3724
3725 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3726 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3727 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3728 if (rn->info != NULL)
3729 {
3730 if (safi == SAFI_MPLS_VPN)
3731 {
3732 table = rn->info;
3733
3734 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3735 {
3736 bgp_static = rn->info;
3737 bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3738 AFI_IP, SAFI_MPLS_VPN,
3739 (struct prefix_rd *)&rn->p,
3740 bgp_static->tag);
3741 bgp_static_free (bgp_static);
3742 rn->info = NULL;
3743 bgp_unlock_node (rn);
3744 }
3745 }
3746 else
3747 {
3748 bgp_static = rn->info;
3749 bgp_static_withdraw (bgp, &rn->p, afi, safi);
3750 bgp_static_free (bgp_static);
3751 rn->info = NULL;
3752 bgp_unlock_node (rn);
3753 }
3754 }
3755}
3756
3757int
paulfd79ac92004-10-13 05:06:08 +00003758bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3759 const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003760{
3761 int ret;
3762 struct prefix p;
3763 struct prefix_rd prd;
3764 struct bgp *bgp;
3765 struct bgp_node *prn;
3766 struct bgp_node *rn;
3767 struct bgp_table *table;
3768 struct bgp_static *bgp_static;
3769 u_char tag[3];
3770
3771 bgp = vty->index;
3772
3773 ret = str2prefix (ip_str, &p);
3774 if (! ret)
3775 {
3776 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3777 return CMD_WARNING;
3778 }
3779 apply_mask (&p);
3780
3781 ret = str2prefix_rd (rd_str, &prd);
3782 if (! ret)
3783 {
3784 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3785 return CMD_WARNING;
3786 }
3787
3788 ret = str2tag (tag_str, tag);
3789 if (! ret)
3790 {
3791 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3792 return CMD_WARNING;
3793 }
3794
3795 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3796 (struct prefix *)&prd);
3797 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003798 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003799 else
3800 bgp_unlock_node (prn);
3801 table = prn->info;
3802
3803 rn = bgp_node_get (table, &p);
3804
3805 if (rn->info)
3806 {
3807 vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3808 bgp_unlock_node (rn);
3809 }
3810 else
3811 {
3812 /* New configuration. */
3813 bgp_static = bgp_static_new ();
3814 bgp_static->valid = 1;
3815 memcpy (bgp_static->tag, tag, 3);
3816 rn->info = bgp_static;
3817
3818 bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3819 }
3820
3821 return CMD_SUCCESS;
3822}
3823
3824/* Configure static BGP network. */
3825int
paulfd79ac92004-10-13 05:06:08 +00003826bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3827 const char *rd_str, const char *tag_str)
paul718e3742002-12-13 20:15:29 +00003828{
3829 int ret;
3830 struct bgp *bgp;
3831 struct prefix p;
3832 struct prefix_rd prd;
3833 struct bgp_node *prn;
3834 struct bgp_node *rn;
3835 struct bgp_table *table;
3836 struct bgp_static *bgp_static;
3837 u_char tag[3];
3838
3839 bgp = vty->index;
3840
3841 /* Convert IP prefix string to struct prefix. */
3842 ret = str2prefix (ip_str, &p);
3843 if (! ret)
3844 {
3845 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3846 return CMD_WARNING;
3847 }
3848 apply_mask (&p);
3849
3850 ret = str2prefix_rd (rd_str, &prd);
3851 if (! ret)
3852 {
3853 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3854 return CMD_WARNING;
3855 }
3856
3857 ret = str2tag (tag_str, tag);
3858 if (! ret)
3859 {
3860 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3861 return CMD_WARNING;
3862 }
3863
3864 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3865 (struct prefix *)&prd);
3866 if (prn->info == NULL)
Paul Jakma64e580a2006-02-21 01:09:01 +00003867 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
paul718e3742002-12-13 20:15:29 +00003868 else
3869 bgp_unlock_node (prn);
3870 table = prn->info;
3871
3872 rn = bgp_node_lookup (table, &p);
3873
3874 if (rn)
3875 {
3876 bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3877
3878 bgp_static = rn->info;
3879 bgp_static_free (bgp_static);
3880 rn->info = NULL;
3881 bgp_unlock_node (rn);
3882 bgp_unlock_node (rn);
3883 }
3884 else
3885 vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
3886
3887 return CMD_SUCCESS;
3888}
3889
3890DEFUN (bgp_network,
3891 bgp_network_cmd,
3892 "network A.B.C.D/M",
3893 "Specify a network to announce via BGP\n"
3894 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
3895{
3896 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003897 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00003898}
3899
3900DEFUN (bgp_network_route_map,
3901 bgp_network_route_map_cmd,
3902 "network A.B.C.D/M route-map WORD",
3903 "Specify a network to announce via BGP\n"
3904 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3905 "Route-map to modify the attributes\n"
3906 "Name of the route map\n")
3907{
3908 return bgp_static_set (vty, vty->index, argv[0],
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003909 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00003910}
3911
3912DEFUN (bgp_network_backdoor,
3913 bgp_network_backdoor_cmd,
3914 "network A.B.C.D/M backdoor",
3915 "Specify a network to announce via BGP\n"
3916 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3917 "Specify a BGP backdoor route\n")
3918{
Paul Jakma41367172007-08-06 15:24:51 +00003919 return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003920 NULL, 1);
paul718e3742002-12-13 20:15:29 +00003921}
3922
3923DEFUN (bgp_network_mask,
3924 bgp_network_mask_cmd,
3925 "network A.B.C.D mask A.B.C.D",
3926 "Specify a network to announce via BGP\n"
3927 "Network number\n"
3928 "Network mask\n"
3929 "Network mask\n")
3930{
3931 int ret;
3932 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00003933
paul718e3742002-12-13 20:15:29 +00003934 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3935 if (! ret)
3936 {
3937 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3938 return CMD_WARNING;
3939 }
3940
3941 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003942 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00003943}
3944
3945DEFUN (bgp_network_mask_route_map,
3946 bgp_network_mask_route_map_cmd,
3947 "network A.B.C.D mask A.B.C.D route-map WORD",
3948 "Specify a network to announce via BGP\n"
3949 "Network number\n"
3950 "Network mask\n"
3951 "Network mask\n"
3952 "Route-map to modify the attributes\n"
3953 "Name of the route map\n")
3954{
3955 int ret;
3956 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00003957
paul718e3742002-12-13 20:15:29 +00003958 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3959 if (! ret)
3960 {
3961 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3962 return CMD_WARNING;
3963 }
3964
3965 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003966 AFI_IP, bgp_node_safi (vty), argv[2], 0);
paul718e3742002-12-13 20:15:29 +00003967}
3968
3969DEFUN (bgp_network_mask_backdoor,
3970 bgp_network_mask_backdoor_cmd,
3971 "network A.B.C.D mask A.B.C.D backdoor",
3972 "Specify a network to announce via BGP\n"
3973 "Network number\n"
3974 "Network mask\n"
3975 "Network mask\n"
3976 "Specify a BGP backdoor route\n")
3977{
3978 int ret;
3979 char prefix_str[BUFSIZ];
Paul Jakma41367172007-08-06 15:24:51 +00003980
paul718e3742002-12-13 20:15:29 +00003981 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3982 if (! ret)
3983 {
3984 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3985 return CMD_WARNING;
3986 }
3987
Paul Jakma41367172007-08-06 15:24:51 +00003988 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00003989 NULL, 1);
paul718e3742002-12-13 20:15:29 +00003990}
3991
3992DEFUN (bgp_network_mask_natural,
3993 bgp_network_mask_natural_cmd,
3994 "network A.B.C.D",
3995 "Specify a network to announce via BGP\n"
3996 "Network number\n")
3997{
3998 int ret;
3999 char prefix_str[BUFSIZ];
4000
4001 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4002 if (! ret)
4003 {
4004 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4005 return CMD_WARNING;
4006 }
4007
4008 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004009 AFI_IP, bgp_node_safi (vty), NULL, 0);
paul718e3742002-12-13 20:15:29 +00004010}
4011
4012DEFUN (bgp_network_mask_natural_route_map,
4013 bgp_network_mask_natural_route_map_cmd,
4014 "network A.B.C.D route-map WORD",
4015 "Specify a network to announce via BGP\n"
4016 "Network number\n"
4017 "Route-map to modify the attributes\n"
4018 "Name of the route map\n")
4019{
4020 int ret;
4021 char prefix_str[BUFSIZ];
4022
4023 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4024 if (! ret)
4025 {
4026 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4027 return CMD_WARNING;
4028 }
4029
4030 return bgp_static_set (vty, vty->index, prefix_str,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004031 AFI_IP, bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004032}
4033
4034DEFUN (bgp_network_mask_natural_backdoor,
4035 bgp_network_mask_natural_backdoor_cmd,
4036 "network A.B.C.D backdoor",
4037 "Specify a network to announce via BGP\n"
4038 "Network number\n"
4039 "Specify a BGP backdoor route\n")
4040{
4041 int ret;
4042 char prefix_str[BUFSIZ];
4043
4044 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4045 if (! ret)
4046 {
4047 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4048 return CMD_WARNING;
4049 }
4050
Paul Jakma41367172007-08-06 15:24:51 +00004051 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004052 NULL, 1);
paul718e3742002-12-13 20:15:29 +00004053}
4054
4055DEFUN (no_bgp_network,
4056 no_bgp_network_cmd,
4057 "no network A.B.C.D/M",
4058 NO_STR
4059 "Specify a network to announce via BGP\n"
4060 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4061{
4062 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4063 bgp_node_safi (vty));
4064}
4065
4066ALIAS (no_bgp_network,
4067 no_bgp_network_route_map_cmd,
4068 "no network A.B.C.D/M route-map WORD",
4069 NO_STR
4070 "Specify a network to announce via BGP\n"
4071 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4072 "Route-map to modify the attributes\n"
4073 "Name of the route map\n")
4074
4075ALIAS (no_bgp_network,
4076 no_bgp_network_backdoor_cmd,
4077 "no network A.B.C.D/M backdoor",
4078 NO_STR
4079 "Specify a network to announce via BGP\n"
4080 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4081 "Specify a BGP backdoor route\n")
4082
4083DEFUN (no_bgp_network_mask,
4084 no_bgp_network_mask_cmd,
4085 "no network A.B.C.D mask A.B.C.D",
4086 NO_STR
4087 "Specify a network to announce via BGP\n"
4088 "Network number\n"
4089 "Network mask\n"
4090 "Network mask\n")
4091{
4092 int ret;
4093 char prefix_str[BUFSIZ];
4094
4095 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4096 if (! ret)
4097 {
4098 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4099 return CMD_WARNING;
4100 }
4101
4102 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4103 bgp_node_safi (vty));
4104}
4105
4106ALIAS (no_bgp_network_mask,
4107 no_bgp_network_mask_route_map_cmd,
4108 "no network A.B.C.D mask A.B.C.D route-map WORD",
4109 NO_STR
4110 "Specify a network to announce via BGP\n"
4111 "Network number\n"
4112 "Network mask\n"
4113 "Network mask\n"
4114 "Route-map to modify the attributes\n"
4115 "Name of the route map\n")
4116
4117ALIAS (no_bgp_network_mask,
4118 no_bgp_network_mask_backdoor_cmd,
4119 "no network A.B.C.D mask A.B.C.D backdoor",
4120 NO_STR
4121 "Specify a network to announce via BGP\n"
4122 "Network number\n"
4123 "Network mask\n"
4124 "Network mask\n"
4125 "Specify a BGP backdoor route\n")
4126
4127DEFUN (no_bgp_network_mask_natural,
4128 no_bgp_network_mask_natural_cmd,
4129 "no network A.B.C.D",
4130 NO_STR
4131 "Specify a network to announce via BGP\n"
4132 "Network number\n")
4133{
4134 int ret;
4135 char prefix_str[BUFSIZ];
4136
4137 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4138 if (! ret)
4139 {
4140 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4141 return CMD_WARNING;
4142 }
4143
4144 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4145 bgp_node_safi (vty));
4146}
4147
4148ALIAS (no_bgp_network_mask_natural,
4149 no_bgp_network_mask_natural_route_map_cmd,
4150 "no network A.B.C.D route-map WORD",
4151 NO_STR
4152 "Specify a network to announce via BGP\n"
4153 "Network number\n"
4154 "Route-map to modify the attributes\n"
4155 "Name of the route map\n")
4156
4157ALIAS (no_bgp_network_mask_natural,
4158 no_bgp_network_mask_natural_backdoor_cmd,
4159 "no network A.B.C.D backdoor",
4160 NO_STR
4161 "Specify a network to announce via BGP\n"
4162 "Network number\n"
4163 "Specify a BGP backdoor route\n")
4164
4165#ifdef HAVE_IPV6
4166DEFUN (ipv6_bgp_network,
4167 ipv6_bgp_network_cmd,
4168 "network X:X::X:X/M",
4169 "Specify a network to announce via BGP\n"
4170 "IPv6 prefix <network>/<length>\n")
4171{
Paul Jakma41367172007-08-06 15:24:51 +00004172 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004173 NULL, 0);
paul718e3742002-12-13 20:15:29 +00004174}
4175
4176DEFUN (ipv6_bgp_network_route_map,
4177 ipv6_bgp_network_route_map_cmd,
4178 "network X:X::X:X/M route-map WORD",
4179 "Specify a network to announce via BGP\n"
4180 "IPv6 prefix <network>/<length>\n"
4181 "Route-map to modify the attributes\n"
4182 "Name of the route map\n")
4183{
4184 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004185 bgp_node_safi (vty), argv[1], 0);
paul718e3742002-12-13 20:15:29 +00004186}
4187
4188DEFUN (no_ipv6_bgp_network,
4189 no_ipv6_bgp_network_cmd,
4190 "no network X:X::X:X/M",
4191 NO_STR
4192 "Specify a network to announce via BGP\n"
4193 "IPv6 prefix <network>/<length>\n")
4194{
4195 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
4196}
4197
4198ALIAS (no_ipv6_bgp_network,
4199 no_ipv6_bgp_network_route_map_cmd,
4200 "no network X:X::X:X/M route-map WORD",
4201 NO_STR
4202 "Specify a network to announce via BGP\n"
4203 "IPv6 prefix <network>/<length>\n"
4204 "Route-map to modify the attributes\n"
4205 "Name of the route map\n")
4206
4207ALIAS (ipv6_bgp_network,
4208 old_ipv6_bgp_network_cmd,
4209 "ipv6 bgp network X:X::X:X/M",
4210 IPV6_STR
4211 BGP_STR
4212 "Specify a network to announce via BGP\n"
4213 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4214
4215ALIAS (no_ipv6_bgp_network,
4216 old_no_ipv6_bgp_network_cmd,
4217 "no ipv6 bgp network X:X::X:X/M",
4218 NO_STR
4219 IPV6_STR
4220 BGP_STR
4221 "Specify a network to announce via BGP\n"
4222 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4223#endif /* HAVE_IPV6 */
Paul Jakmac8f3fe32010-12-05 20:28:02 +00004224
4225/* stubs for removed AS-Pathlimit commands, kept for config compatibility */
4226ALIAS_DEPRECATED (bgp_network,
4227 bgp_network_ttl_cmd,
4228 "network A.B.C.D/M pathlimit <0-255>",
4229 "Specify a network to announce via BGP\n"
4230 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4231 "AS-Path hopcount limit attribute\n"
4232 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4233ALIAS_DEPRECATED (bgp_network_backdoor,
4234 bgp_network_backdoor_ttl_cmd,
4235 "network A.B.C.D/M backdoor pathlimit <0-255>",
4236 "Specify a network to announce via BGP\n"
4237 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4238 "Specify a BGP backdoor route\n"
4239 "AS-Path hopcount limit attribute\n"
4240 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4241ALIAS_DEPRECATED (bgp_network_mask,
4242 bgp_network_mask_ttl_cmd,
4243 "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4244 "Specify a network to announce via BGP\n"
4245 "Network number\n"
4246 "Network mask\n"
4247 "Network mask\n"
4248 "AS-Path hopcount limit attribute\n"
4249 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4250ALIAS_DEPRECATED (bgp_network_mask_backdoor,
4251 bgp_network_mask_backdoor_ttl_cmd,
4252 "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4253 "Specify a network to announce via BGP\n"
4254 "Network number\n"
4255 "Network mask\n"
4256 "Network mask\n"
4257 "Specify a BGP backdoor route\n"
4258 "AS-Path hopcount limit attribute\n"
4259 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4260ALIAS_DEPRECATED (bgp_network_mask_natural,
4261 bgp_network_mask_natural_ttl_cmd,
4262 "network A.B.C.D pathlimit <0-255>",
4263 "Specify a network to announce via BGP\n"
4264 "Network number\n"
4265 "AS-Path hopcount limit attribute\n"
4266 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4267ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
4268 bgp_network_mask_natural_backdoor_ttl_cmd,
4269 "network A.B.C.D backdoor pathlimit (1-255>",
4270 "Specify a network to announce via BGP\n"
4271 "Network number\n"
4272 "Specify a BGP backdoor route\n"
4273 "AS-Path hopcount limit attribute\n"
4274 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4275ALIAS_DEPRECATED (no_bgp_network,
4276 no_bgp_network_ttl_cmd,
4277 "no network A.B.C.D/M pathlimit <0-255>",
4278 NO_STR
4279 "Specify a network to announce via BGP\n"
4280 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4281 "AS-Path hopcount limit attribute\n"
4282 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4283ALIAS_DEPRECATED (no_bgp_network,
4284 no_bgp_network_backdoor_ttl_cmd,
4285 "no network A.B.C.D/M backdoor pathlimit <0-255>",
4286 NO_STR
4287 "Specify a network to announce via BGP\n"
4288 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4289 "Specify a BGP backdoor route\n"
4290 "AS-Path hopcount limit attribute\n"
4291 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4292ALIAS_DEPRECATED (no_bgp_network,
4293 no_bgp_network_mask_ttl_cmd,
4294 "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4295 NO_STR
4296 "Specify a network to announce via BGP\n"
4297 "Network number\n"
4298 "Network mask\n"
4299 "Network mask\n"
4300 "AS-Path hopcount limit attribute\n"
4301 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4302ALIAS_DEPRECATED (no_bgp_network_mask,
4303 no_bgp_network_mask_backdoor_ttl_cmd,
4304 "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4305 NO_STR
4306 "Specify a network to announce via BGP\n"
4307 "Network number\n"
4308 "Network mask\n"
4309 "Network mask\n"
4310 "Specify a BGP backdoor route\n"
4311 "AS-Path hopcount limit attribute\n"
4312 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4313ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4314 no_bgp_network_mask_natural_ttl_cmd,
4315 "no network A.B.C.D pathlimit <0-255>",
4316 NO_STR
4317 "Specify a network to announce via BGP\n"
4318 "Network number\n"
4319 "AS-Path hopcount limit attribute\n"
4320 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4321ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4322 no_bgp_network_mask_natural_backdoor_ttl_cmd,
4323 "no network A.B.C.D backdoor pathlimit <0-255>",
4324 NO_STR
4325 "Specify a network to announce via BGP\n"
4326 "Network number\n"
4327 "Specify a BGP backdoor route\n"
4328 "AS-Path hopcount limit attribute\n"
4329 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4330ALIAS_DEPRECATED (ipv6_bgp_network,
4331 ipv6_bgp_network_ttl_cmd,
4332 "network X:X::X:X/M pathlimit <0-255>",
4333 "Specify a network to announce via BGP\n"
4334 "IPv6 prefix <network>/<length>\n"
4335 "AS-Path hopcount limit attribute\n"
4336 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4337ALIAS_DEPRECATED (no_ipv6_bgp_network,
4338 no_ipv6_bgp_network_ttl_cmd,
4339 "no network X:X::X:X/M pathlimit <0-255>",
4340 NO_STR
4341 "Specify a network to announce via BGP\n"
4342 "IPv6 prefix <network>/<length>\n"
4343 "AS-Path hopcount limit attribute\n"
4344 "AS-Pathlimit TTL, in number of AS-Path hops\n")
paul718e3742002-12-13 20:15:29 +00004345
4346/* Aggreagete address:
4347
4348 advertise-map Set condition to advertise attribute
4349 as-set Generate AS set path information
4350 attribute-map Set attributes of aggregate
4351 route-map Set parameters of aggregate
4352 summary-only Filter more specific routes from updates
4353 suppress-map Conditionally filter more specific routes from updates
4354 <cr>
4355 */
4356struct bgp_aggregate
4357{
4358 /* Summary-only flag. */
4359 u_char summary_only;
4360
4361 /* AS set generation. */
4362 u_char as_set;
4363
4364 /* Route-map for aggregated route. */
4365 struct route_map *map;
4366
4367 /* Suppress-count. */
4368 unsigned long count;
4369
4370 /* SAFI configuration. */
4371 safi_t safi;
4372};
4373
paul94f2b392005-06-28 12:44:16 +00004374static struct bgp_aggregate *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08004375bgp_aggregate_new (void)
paul718e3742002-12-13 20:15:29 +00004376{
Stephen Hemminger393deb92008-08-18 14:13:29 -07004377 return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
paul718e3742002-12-13 20:15:29 +00004378}
4379
paul94f2b392005-06-28 12:44:16 +00004380static void
paul718e3742002-12-13 20:15:29 +00004381bgp_aggregate_free (struct bgp_aggregate *aggregate)
4382{
4383 XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4384}
4385
paul94f2b392005-06-28 12:44:16 +00004386static void
paul718e3742002-12-13 20:15:29 +00004387bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4388 afi_t afi, safi_t safi, struct bgp_info *del,
4389 struct bgp_aggregate *aggregate)
4390{
4391 struct bgp_table *table;
4392 struct bgp_node *top;
4393 struct bgp_node *rn;
4394 u_char origin;
4395 struct aspath *aspath = NULL;
4396 struct aspath *asmerge = NULL;
4397 struct community *community = NULL;
4398 struct community *commerge = NULL;
4399 struct in_addr nexthop;
4400 u_int32_t med = 0;
4401 struct bgp_info *ri;
4402 struct bgp_info *new;
4403 int first = 1;
4404 unsigned long match = 0;
4405
4406 /* Record adding route's nexthop and med. */
4407 if (rinew)
4408 {
4409 nexthop = rinew->attr->nexthop;
4410 med = rinew->attr->med;
4411 }
4412
4413 /* ORIGIN attribute: If at least one route among routes that are
4414 aggregated has ORIGIN with the value INCOMPLETE, then the
4415 aggregated route must have the ORIGIN attribute with the value
4416 INCOMPLETE. Otherwise, if at least one route among routes that
4417 are aggregated has ORIGIN with the value EGP, then the aggregated
4418 route must have the origin attribute with the value EGP. In all
4419 other case the value of the ORIGIN attribute of the aggregated
4420 route is INTERNAL. */
4421 origin = BGP_ORIGIN_IGP;
4422
4423 table = bgp->rib[afi][safi];
4424
4425 top = bgp_node_get (table, p);
4426 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4427 if (rn->p.prefixlen > p->prefixlen)
4428 {
4429 match = 0;
4430
4431 for (ri = rn->info; ri; ri = ri->next)
4432 {
4433 if (BGP_INFO_HOLDDOWN (ri))
4434 continue;
4435
4436 if (del && ri == del)
4437 continue;
4438
4439 if (! rinew && first)
4440 {
4441 nexthop = ri->attr->nexthop;
4442 med = ri->attr->med;
4443 first = 0;
4444 }
4445
4446#ifdef AGGREGATE_NEXTHOP_CHECK
4447 if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4448 || ri->attr->med != med)
4449 {
4450 if (aspath)
4451 aspath_free (aspath);
4452 if (community)
4453 community_free (community);
4454 bgp_unlock_node (rn);
4455 bgp_unlock_node (top);
4456 return;
4457 }
4458#endif /* AGGREGATE_NEXTHOP_CHECK */
4459
4460 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4461 {
4462 if (aggregate->summary_only)
4463 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004464 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004465 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004466 match++;
4467 }
4468
4469 aggregate->count++;
4470
4471 if (aggregate->as_set)
4472 {
4473 if (origin < ri->attr->origin)
4474 origin = ri->attr->origin;
4475
4476 if (aspath)
4477 {
4478 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4479 aspath_free (aspath);
4480 aspath = asmerge;
4481 }
4482 else
4483 aspath = aspath_dup (ri->attr->aspath);
4484
4485 if (ri->attr->community)
4486 {
4487 if (community)
4488 {
4489 commerge = community_merge (community,
4490 ri->attr->community);
4491 community = community_uniq_sort (commerge);
4492 community_free (commerge);
4493 }
4494 else
4495 community = community_dup (ri->attr->community);
4496 }
4497 }
4498 }
4499 }
4500 if (match)
4501 bgp_process (bgp, rn, afi, safi);
4502 }
4503 bgp_unlock_node (top);
4504
4505 if (rinew)
4506 {
4507 aggregate->count++;
4508
4509 if (aggregate->summary_only)
Paul Jakmafb982c22007-05-04 20:15:47 +00004510 (bgp_info_extra_get (rinew))->suppress++;
paul718e3742002-12-13 20:15:29 +00004511
4512 if (aggregate->as_set)
4513 {
4514 if (origin < rinew->attr->origin)
4515 origin = rinew->attr->origin;
4516
4517 if (aspath)
4518 {
4519 asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4520 aspath_free (aspath);
4521 aspath = asmerge;
4522 }
4523 else
4524 aspath = aspath_dup (rinew->attr->aspath);
4525
4526 if (rinew->attr->community)
4527 {
4528 if (community)
4529 {
4530 commerge = community_merge (community,
4531 rinew->attr->community);
4532 community = community_uniq_sort (commerge);
4533 community_free (commerge);
4534 }
4535 else
4536 community = community_dup (rinew->attr->community);
4537 }
4538 }
4539 }
4540
4541 if (aggregate->count > 0)
4542 {
4543 rn = bgp_node_get (table, p);
4544 new = bgp_info_new ();
4545 new->type = ZEBRA_ROUTE_BGP;
4546 new->sub_type = BGP_ROUTE_AGGREGATE;
4547 new->peer = bgp->peer_self;
4548 SET_FLAG (new->flags, BGP_INFO_VALID);
4549 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004550 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004551
4552 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004553 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00004554 bgp_process (bgp, rn, afi, safi);
4555 }
4556 else
4557 {
4558 if (aspath)
4559 aspath_free (aspath);
4560 if (community)
4561 community_free (community);
4562 }
4563}
4564
4565void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4566 struct bgp_aggregate *);
4567
4568void
4569bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4570 struct bgp_info *ri, afi_t afi, safi_t safi)
4571{
4572 struct bgp_node *child;
4573 struct bgp_node *rn;
4574 struct bgp_aggregate *aggregate;
4575
4576 /* MPLS-VPN aggregation is not yet supported. */
4577 if (safi == SAFI_MPLS_VPN)
4578 return;
4579
4580 if (p->prefixlen == 0)
4581 return;
4582
4583 if (BGP_INFO_HOLDDOWN (ri))
4584 return;
4585
4586 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4587
4588 /* Aggregate address configuration check. */
4589 for (rn = child; rn; rn = rn->parent)
4590 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4591 {
4592 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004593 bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
paul718e3742002-12-13 20:15:29 +00004594 }
4595 bgp_unlock_node (child);
4596}
4597
4598void
4599bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4600 struct bgp_info *del, afi_t afi, safi_t safi)
4601{
4602 struct bgp_node *child;
4603 struct bgp_node *rn;
4604 struct bgp_aggregate *aggregate;
4605
4606 /* MPLS-VPN aggregation is not yet supported. */
4607 if (safi == SAFI_MPLS_VPN)
4608 return;
4609
4610 if (p->prefixlen == 0)
4611 return;
4612
4613 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4614
4615 /* Aggregate address configuration check. */
4616 for (rn = child; rn; rn = rn->parent)
4617 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4618 {
4619 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
paul286e1e72003-08-08 00:24:31 +00004620 bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
paul718e3742002-12-13 20:15:29 +00004621 }
4622 bgp_unlock_node (child);
4623}
4624
paul94f2b392005-06-28 12:44:16 +00004625static void
paul718e3742002-12-13 20:15:29 +00004626bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4627 struct bgp_aggregate *aggregate)
4628{
4629 struct bgp_table *table;
4630 struct bgp_node *top;
4631 struct bgp_node *rn;
4632 struct bgp_info *new;
4633 struct bgp_info *ri;
4634 unsigned long match;
4635 u_char origin = BGP_ORIGIN_IGP;
4636 struct aspath *aspath = NULL;
4637 struct aspath *asmerge = NULL;
4638 struct community *community = NULL;
4639 struct community *commerge = NULL;
4640
4641 table = bgp->rib[afi][safi];
4642
4643 /* Sanity check. */
4644 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4645 return;
4646 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4647 return;
4648
4649 /* If routes exists below this node, generate aggregate routes. */
4650 top = bgp_node_get (table, p);
4651 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4652 if (rn->p.prefixlen > p->prefixlen)
4653 {
4654 match = 0;
4655
4656 for (ri = rn->info; ri; ri = ri->next)
4657 {
4658 if (BGP_INFO_HOLDDOWN (ri))
4659 continue;
4660
4661 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4662 {
4663 /* summary-only aggregate route suppress aggregated
4664 route announcement. */
4665 if (aggregate->summary_only)
4666 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004667 (bgp_info_extra_get (ri))->suppress++;
Paul Jakma1a392d42006-09-07 00:24:49 +00004668 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004669 match++;
4670 }
4671 /* as-set aggregate route generate origin, as path,
4672 community aggregation. */
4673 if (aggregate->as_set)
4674 {
4675 if (origin < ri->attr->origin)
4676 origin = ri->attr->origin;
4677
4678 if (aspath)
4679 {
4680 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4681 aspath_free (aspath);
4682 aspath = asmerge;
4683 }
4684 else
4685 aspath = aspath_dup (ri->attr->aspath);
4686
4687 if (ri->attr->community)
4688 {
4689 if (community)
4690 {
4691 commerge = community_merge (community,
4692 ri->attr->community);
4693 community = community_uniq_sort (commerge);
4694 community_free (commerge);
4695 }
4696 else
4697 community = community_dup (ri->attr->community);
4698 }
4699 }
4700 aggregate->count++;
4701 }
4702 }
4703
4704 /* If this node is suppressed, process the change. */
4705 if (match)
4706 bgp_process (bgp, rn, afi, safi);
4707 }
4708 bgp_unlock_node (top);
4709
4710 /* Add aggregate route to BGP table. */
4711 if (aggregate->count)
4712 {
4713 rn = bgp_node_get (table, p);
4714
4715 new = bgp_info_new ();
4716 new->type = ZEBRA_ROUTE_BGP;
4717 new->sub_type = BGP_ROUTE_AGGREGATE;
4718 new->peer = bgp->peer_self;
4719 SET_FLAG (new->flags, BGP_INFO_VALID);
4720 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
Stephen Hemminger65957882010-01-15 16:22:10 +03004721 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00004722
4723 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00004724 bgp_unlock_node (rn);
4725
paul718e3742002-12-13 20:15:29 +00004726 /* Process change. */
4727 bgp_process (bgp, rn, afi, safi);
4728 }
4729}
4730
4731void
4732bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4733 safi_t safi, struct bgp_aggregate *aggregate)
4734{
4735 struct bgp_table *table;
4736 struct bgp_node *top;
4737 struct bgp_node *rn;
4738 struct bgp_info *ri;
4739 unsigned long match;
4740
4741 table = bgp->rib[afi][safi];
4742
4743 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4744 return;
4745 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4746 return;
4747
4748 /* If routes exists below this node, generate aggregate routes. */
4749 top = bgp_node_get (table, p);
4750 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4751 if (rn->p.prefixlen > p->prefixlen)
4752 {
4753 match = 0;
4754
4755 for (ri = rn->info; ri; ri = ri->next)
4756 {
4757 if (BGP_INFO_HOLDDOWN (ri))
4758 continue;
4759
4760 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4761 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004762 if (aggregate->summary_only && ri->extra)
paul718e3742002-12-13 20:15:29 +00004763 {
Paul Jakmafb982c22007-05-04 20:15:47 +00004764 ri->extra->suppress--;
paul718e3742002-12-13 20:15:29 +00004765
Paul Jakmafb982c22007-05-04 20:15:47 +00004766 if (ri->extra->suppress == 0)
paul718e3742002-12-13 20:15:29 +00004767 {
Paul Jakma1a392d42006-09-07 00:24:49 +00004768 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00004769 match++;
4770 }
4771 }
4772 aggregate->count--;
4773 }
4774 }
4775
Paul Jakmafb982c22007-05-04 20:15:47 +00004776 /* If this node was suppressed, process the change. */
paul718e3742002-12-13 20:15:29 +00004777 if (match)
4778 bgp_process (bgp, rn, afi, safi);
4779 }
4780 bgp_unlock_node (top);
4781
4782 /* Delete aggregate route from BGP table. */
4783 rn = bgp_node_get (table, p);
4784
4785 for (ri = rn->info; ri; ri = ri->next)
4786 if (ri->peer == bgp->peer_self
4787 && ri->type == ZEBRA_ROUTE_BGP
4788 && ri->sub_type == BGP_ROUTE_AGGREGATE)
4789 break;
4790
4791 /* Withdraw static BGP route from routing table. */
4792 if (ri)
4793 {
paul718e3742002-12-13 20:15:29 +00004794 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00004795 bgp_process (bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00004796 }
4797
4798 /* Unlock bgp_node_lookup. */
4799 bgp_unlock_node (rn);
4800}
4801
4802/* Aggregate route attribute. */
4803#define AGGREGATE_SUMMARY_ONLY 1
4804#define AGGREGATE_AS_SET 1
4805
paul94f2b392005-06-28 12:44:16 +00004806static int
Robert Baysf6269b42010-08-05 10:26:28 -07004807bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4808 afi_t afi, safi_t safi)
4809{
4810 int ret;
4811 struct prefix p;
4812 struct bgp_node *rn;
4813 struct bgp *bgp;
4814 struct bgp_aggregate *aggregate;
4815
4816 /* Convert string to prefix structure. */
4817 ret = str2prefix (prefix_str, &p);
4818 if (!ret)
4819 {
4820 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4821 return CMD_WARNING;
4822 }
4823 apply_mask (&p);
4824
4825 /* Get BGP structure. */
4826 bgp = vty->index;
4827
4828 /* Old configuration check. */
4829 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
4830 if (! rn)
4831 {
4832 vty_out (vty, "%% There is no aggregate-address configuration.%s",
4833 VTY_NEWLINE);
4834 return CMD_WARNING;
4835 }
4836
4837 aggregate = rn->info;
4838 if (aggregate->safi & SAFI_UNICAST)
4839 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
4840 if (aggregate->safi & SAFI_MULTICAST)
4841 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4842
4843 /* Unlock aggregate address configuration. */
4844 rn->info = NULL;
4845 bgp_aggregate_free (aggregate);
4846 bgp_unlock_node (rn);
4847 bgp_unlock_node (rn);
4848
4849 return CMD_SUCCESS;
4850}
4851
4852static int
4853bgp_aggregate_set (struct vty *vty, const char *prefix_str,
paulfd79ac92004-10-13 05:06:08 +00004854 afi_t afi, safi_t safi,
paul718e3742002-12-13 20:15:29 +00004855 u_char summary_only, u_char as_set)
4856{
4857 int ret;
4858 struct prefix p;
4859 struct bgp_node *rn;
4860 struct bgp *bgp;
4861 struct bgp_aggregate *aggregate;
4862
4863 /* Convert string to prefix structure. */
4864 ret = str2prefix (prefix_str, &p);
4865 if (!ret)
4866 {
4867 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4868 return CMD_WARNING;
4869 }
4870 apply_mask (&p);
4871
4872 /* Get BGP structure. */
4873 bgp = vty->index;
4874
4875 /* Old configuration check. */
4876 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4877
4878 if (rn->info)
4879 {
4880 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
Robert Bays368473f2010-08-05 10:26:29 -07004881 /* try to remove the old entry */
Robert Baysf6269b42010-08-05 10:26:28 -07004882 ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
4883 if (ret)
4884 {
Robert Bays368473f2010-08-05 10:26:29 -07004885 vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
4886 bgp_unlock_node (rn);
Robert Baysf6269b42010-08-05 10:26:28 -07004887 return CMD_WARNING;
4888 }
paul718e3742002-12-13 20:15:29 +00004889 }
4890
4891 /* Make aggregate address structure. */
4892 aggregate = bgp_aggregate_new ();
4893 aggregate->summary_only = summary_only;
4894 aggregate->as_set = as_set;
4895 aggregate->safi = safi;
4896 rn->info = aggregate;
4897
4898 /* Aggregate address insert into BGP routing table. */
4899 if (safi & SAFI_UNICAST)
4900 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
4901 if (safi & SAFI_MULTICAST)
4902 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4903
4904 return CMD_SUCCESS;
4905}
4906
paul718e3742002-12-13 20:15:29 +00004907DEFUN (aggregate_address,
4908 aggregate_address_cmd,
4909 "aggregate-address A.B.C.D/M",
4910 "Configure BGP aggregate entries\n"
4911 "Aggregate prefix\n")
4912{
4913 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
4914}
4915
4916DEFUN (aggregate_address_mask,
4917 aggregate_address_mask_cmd,
4918 "aggregate-address A.B.C.D A.B.C.D",
4919 "Configure BGP aggregate entries\n"
4920 "Aggregate address\n"
4921 "Aggregate mask\n")
4922{
4923 int ret;
4924 char prefix_str[BUFSIZ];
4925
4926 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4927
4928 if (! ret)
4929 {
4930 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4931 return CMD_WARNING;
4932 }
4933
4934 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4935 0, 0);
4936}
4937
4938DEFUN (aggregate_address_summary_only,
4939 aggregate_address_summary_only_cmd,
4940 "aggregate-address A.B.C.D/M summary-only",
4941 "Configure BGP aggregate entries\n"
4942 "Aggregate prefix\n"
4943 "Filter more specific routes from updates\n")
4944{
4945 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4946 AGGREGATE_SUMMARY_ONLY, 0);
4947}
4948
4949DEFUN (aggregate_address_mask_summary_only,
4950 aggregate_address_mask_summary_only_cmd,
4951 "aggregate-address A.B.C.D A.B.C.D summary-only",
4952 "Configure BGP aggregate entries\n"
4953 "Aggregate address\n"
4954 "Aggregate mask\n"
4955 "Filter more specific routes from updates\n")
4956{
4957 int ret;
4958 char prefix_str[BUFSIZ];
4959
4960 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4961
4962 if (! ret)
4963 {
4964 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4965 return CMD_WARNING;
4966 }
4967
4968 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4969 AGGREGATE_SUMMARY_ONLY, 0);
4970}
4971
4972DEFUN (aggregate_address_as_set,
4973 aggregate_address_as_set_cmd,
4974 "aggregate-address A.B.C.D/M as-set",
4975 "Configure BGP aggregate entries\n"
4976 "Aggregate prefix\n"
4977 "Generate AS set path information\n")
4978{
4979 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4980 0, AGGREGATE_AS_SET);
4981}
4982
4983DEFUN (aggregate_address_mask_as_set,
4984 aggregate_address_mask_as_set_cmd,
4985 "aggregate-address A.B.C.D A.B.C.D as-set",
4986 "Configure BGP aggregate entries\n"
4987 "Aggregate address\n"
4988 "Aggregate mask\n"
4989 "Generate AS set path information\n")
4990{
4991 int ret;
4992 char prefix_str[BUFSIZ];
4993
4994 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4995
4996 if (! ret)
4997 {
4998 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4999 return CMD_WARNING;
5000 }
5001
5002 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5003 0, AGGREGATE_AS_SET);
5004}
5005
5006
5007DEFUN (aggregate_address_as_set_summary,
5008 aggregate_address_as_set_summary_cmd,
5009 "aggregate-address A.B.C.D/M as-set summary-only",
5010 "Configure BGP aggregate entries\n"
5011 "Aggregate prefix\n"
5012 "Generate AS set path information\n"
5013 "Filter more specific routes from updates\n")
5014{
5015 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5016 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5017}
5018
5019ALIAS (aggregate_address_as_set_summary,
5020 aggregate_address_summary_as_set_cmd,
5021 "aggregate-address A.B.C.D/M summary-only as-set",
5022 "Configure BGP aggregate entries\n"
5023 "Aggregate prefix\n"
5024 "Filter more specific routes from updates\n"
5025 "Generate AS set path information\n")
5026
5027DEFUN (aggregate_address_mask_as_set_summary,
5028 aggregate_address_mask_as_set_summary_cmd,
5029 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5030 "Configure BGP aggregate entries\n"
5031 "Aggregate address\n"
5032 "Aggregate mask\n"
5033 "Generate AS set path information\n"
5034 "Filter more specific routes from updates\n")
5035{
5036 int ret;
5037 char prefix_str[BUFSIZ];
5038
5039 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5040
5041 if (! ret)
5042 {
5043 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5044 return CMD_WARNING;
5045 }
5046
5047 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5048 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5049}
5050
5051ALIAS (aggregate_address_mask_as_set_summary,
5052 aggregate_address_mask_summary_as_set_cmd,
5053 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5054 "Configure BGP aggregate entries\n"
5055 "Aggregate address\n"
5056 "Aggregate mask\n"
5057 "Filter more specific routes from updates\n"
5058 "Generate AS set path information\n")
5059
5060DEFUN (no_aggregate_address,
5061 no_aggregate_address_cmd,
5062 "no aggregate-address A.B.C.D/M",
5063 NO_STR
5064 "Configure BGP aggregate entries\n"
5065 "Aggregate prefix\n")
5066{
5067 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5068}
5069
5070ALIAS (no_aggregate_address,
5071 no_aggregate_address_summary_only_cmd,
5072 "no aggregate-address A.B.C.D/M summary-only",
5073 NO_STR
5074 "Configure BGP aggregate entries\n"
5075 "Aggregate prefix\n"
5076 "Filter more specific routes from updates\n")
5077
5078ALIAS (no_aggregate_address,
5079 no_aggregate_address_as_set_cmd,
5080 "no aggregate-address A.B.C.D/M as-set",
5081 NO_STR
5082 "Configure BGP aggregate entries\n"
5083 "Aggregate prefix\n"
5084 "Generate AS set path information\n")
5085
5086ALIAS (no_aggregate_address,
5087 no_aggregate_address_as_set_summary_cmd,
5088 "no aggregate-address A.B.C.D/M as-set summary-only",
5089 NO_STR
5090 "Configure BGP aggregate entries\n"
5091 "Aggregate prefix\n"
5092 "Generate AS set path information\n"
5093 "Filter more specific routes from updates\n")
5094
5095ALIAS (no_aggregate_address,
5096 no_aggregate_address_summary_as_set_cmd,
5097 "no aggregate-address A.B.C.D/M summary-only as-set",
5098 NO_STR
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 (no_aggregate_address_mask,
5105 no_aggregate_address_mask_cmd,
5106 "no aggregate-address A.B.C.D A.B.C.D",
5107 NO_STR
5108 "Configure BGP aggregate entries\n"
5109 "Aggregate address\n"
5110 "Aggregate mask\n")
5111{
5112 int ret;
5113 char prefix_str[BUFSIZ];
5114
5115 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5116
5117 if (! ret)
5118 {
5119 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5120 return CMD_WARNING;
5121 }
5122
5123 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5124}
5125
5126ALIAS (no_aggregate_address_mask,
5127 no_aggregate_address_mask_summary_only_cmd,
5128 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5129 NO_STR
5130 "Configure BGP aggregate entries\n"
5131 "Aggregate address\n"
5132 "Aggregate mask\n"
5133 "Filter more specific routes from updates\n")
5134
5135ALIAS (no_aggregate_address_mask,
5136 no_aggregate_address_mask_as_set_cmd,
5137 "no aggregate-address A.B.C.D A.B.C.D as-set",
5138 NO_STR
5139 "Configure BGP aggregate entries\n"
5140 "Aggregate address\n"
5141 "Aggregate mask\n"
5142 "Generate AS set path information\n")
5143
5144ALIAS (no_aggregate_address_mask,
5145 no_aggregate_address_mask_as_set_summary_cmd,
5146 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5147 NO_STR
5148 "Configure BGP aggregate entries\n"
5149 "Aggregate address\n"
5150 "Aggregate mask\n"
5151 "Generate AS set path information\n"
5152 "Filter more specific routes from updates\n")
5153
5154ALIAS (no_aggregate_address_mask,
5155 no_aggregate_address_mask_summary_as_set_cmd,
5156 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5157 NO_STR
5158 "Configure BGP aggregate entries\n"
5159 "Aggregate address\n"
5160 "Aggregate mask\n"
5161 "Filter more specific routes from updates\n"
5162 "Generate AS set path information\n")
5163
5164#ifdef HAVE_IPV6
5165DEFUN (ipv6_aggregate_address,
5166 ipv6_aggregate_address_cmd,
5167 "aggregate-address X:X::X:X/M",
5168 "Configure BGP aggregate entries\n"
5169 "Aggregate prefix\n")
5170{
5171 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5172}
5173
5174DEFUN (ipv6_aggregate_address_summary_only,
5175 ipv6_aggregate_address_summary_only_cmd,
5176 "aggregate-address X:X::X:X/M summary-only",
5177 "Configure BGP aggregate entries\n"
5178 "Aggregate prefix\n"
5179 "Filter more specific routes from updates\n")
5180{
5181 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5182 AGGREGATE_SUMMARY_ONLY, 0);
5183}
5184
5185DEFUN (no_ipv6_aggregate_address,
5186 no_ipv6_aggregate_address_cmd,
5187 "no aggregate-address X:X::X:X/M",
5188 NO_STR
5189 "Configure BGP aggregate entries\n"
5190 "Aggregate prefix\n")
5191{
5192 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5193}
5194
5195DEFUN (no_ipv6_aggregate_address_summary_only,
5196 no_ipv6_aggregate_address_summary_only_cmd,
5197 "no aggregate-address X:X::X:X/M summary-only",
5198 NO_STR
5199 "Configure BGP aggregate entries\n"
5200 "Aggregate prefix\n"
5201 "Filter more specific routes from updates\n")
5202{
5203 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5204}
5205
5206ALIAS (ipv6_aggregate_address,
5207 old_ipv6_aggregate_address_cmd,
5208 "ipv6 bgp aggregate-address X:X::X:X/M",
5209 IPV6_STR
5210 BGP_STR
5211 "Configure BGP aggregate entries\n"
5212 "Aggregate prefix\n")
5213
5214ALIAS (ipv6_aggregate_address_summary_only,
5215 old_ipv6_aggregate_address_summary_only_cmd,
5216 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5217 IPV6_STR
5218 BGP_STR
5219 "Configure BGP aggregate entries\n"
5220 "Aggregate prefix\n"
5221 "Filter more specific routes from updates\n")
5222
5223ALIAS (no_ipv6_aggregate_address,
5224 old_no_ipv6_aggregate_address_cmd,
5225 "no ipv6 bgp aggregate-address X:X::X:X/M",
5226 NO_STR
5227 IPV6_STR
5228 BGP_STR
5229 "Configure BGP aggregate entries\n"
5230 "Aggregate prefix\n")
5231
5232ALIAS (no_ipv6_aggregate_address_summary_only,
5233 old_no_ipv6_aggregate_address_summary_only_cmd,
5234 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5235 NO_STR
5236 IPV6_STR
5237 BGP_STR
5238 "Configure BGP aggregate entries\n"
5239 "Aggregate prefix\n"
5240 "Filter more specific routes from updates\n")
5241#endif /* HAVE_IPV6 */
5242
5243/* Redistribute route treatment. */
5244void
5245bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
5246 u_int32_t metric, u_char type)
5247{
5248 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005249 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005250 struct bgp_info *new;
5251 struct bgp_info *bi;
5252 struct bgp_info info;
5253 struct bgp_node *bn;
Paul Jakmafb982c22007-05-04 20:15:47 +00005254 struct attr attr = { 0 };
5255 struct attr attr_new = { 0 };
paul718e3742002-12-13 20:15:29 +00005256 struct attr *new_attr;
5257 afi_t afi;
5258 int ret;
5259
5260 /* Make default attribute. */
5261 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5262 if (nexthop)
5263 attr.nexthop = *nexthop;
5264
5265 attr.med = metric;
5266 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5267
paul1eb8ef22005-04-07 07:30:20 +00005268 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005269 {
5270 afi = family2afi (p->family);
5271
5272 if (bgp->redist[afi][type])
5273 {
5274 /* Copy attribute for modification. */
Paul Jakmafb982c22007-05-04 20:15:47 +00005275 bgp_attr_dup (&attr_new, &attr);
paul718e3742002-12-13 20:15:29 +00005276
5277 if (bgp->redist_metric_flag[afi][type])
5278 attr_new.med = bgp->redist_metric[afi][type];
5279
5280 /* Apply route-map. */
5281 if (bgp->rmap[afi][type].map)
5282 {
5283 info.peer = bgp->peer_self;
5284 info.attr = &attr_new;
5285
paulfee0f4c2004-09-13 05:12:46 +00005286 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5287
paul718e3742002-12-13 20:15:29 +00005288 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5289 &info);
paulfee0f4c2004-09-13 05:12:46 +00005290
5291 bgp->peer_self->rmap_type = 0;
5292
paul718e3742002-12-13 20:15:29 +00005293 if (ret == RMAP_DENYMATCH)
5294 {
5295 /* Free uninterned attribute. */
5296 bgp_attr_flush (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005297 bgp_attr_extra_free (&attr_new);
5298
paul718e3742002-12-13 20:15:29 +00005299 /* Unintern original. */
5300 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005301 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005302 bgp_redistribute_delete (p, type);
5303 return;
5304 }
5305 }
5306
Paul Jakmafb982c22007-05-04 20:15:47 +00005307 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5308 afi, SAFI_UNICAST, p, NULL);
5309
paul718e3742002-12-13 20:15:29 +00005310 new_attr = bgp_attr_intern (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005311 bgp_attr_extra_free (&attr_new);
5312
paul718e3742002-12-13 20:15:29 +00005313 for (bi = bn->info; bi; bi = bi->next)
5314 if (bi->peer == bgp->peer_self
5315 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5316 break;
5317
5318 if (bi)
5319 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005320 if (attrhash_cmp (bi->attr, new_attr) &&
5321 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00005322 {
5323 bgp_attr_unintern (new_attr);
5324 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005325 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005326 bgp_unlock_node (bn);
5327 return;
5328 }
5329 else
5330 {
5331 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00005332 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00005333
5334 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005335 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5336 bgp_info_restore(bn, bi);
5337 else
5338 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005339 bgp_attr_unintern (bi->attr);
5340 bi->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005341 bi->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005342
5343 /* Process change. */
5344 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5345 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5346 bgp_unlock_node (bn);
5347 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005348 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005349 return;
5350 }
5351 }
5352
5353 new = bgp_info_new ();
5354 new->type = type;
5355 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5356 new->peer = bgp->peer_self;
5357 SET_FLAG (new->flags, BGP_INFO_VALID);
5358 new->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005359 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005360
5361 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5362 bgp_info_add (bn, new);
paul200df112005-06-01 11:17:05 +00005363 bgp_unlock_node (bn);
paul718e3742002-12-13 20:15:29 +00005364 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5365 }
5366 }
5367
5368 /* Unintern original. */
5369 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005370 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005371}
5372
5373void
5374bgp_redistribute_delete (struct prefix *p, u_char type)
5375{
5376 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005377 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005378 afi_t afi;
5379 struct bgp_node *rn;
5380 struct bgp_info *ri;
5381
paul1eb8ef22005-04-07 07:30:20 +00005382 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005383 {
5384 afi = family2afi (p->family);
5385
5386 if (bgp->redist[afi][type])
5387 {
paulfee0f4c2004-09-13 05:12:46 +00005388 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
paul718e3742002-12-13 20:15:29 +00005389
5390 for (ri = rn->info; ri; ri = ri->next)
5391 if (ri->peer == bgp->peer_self
5392 && ri->type == type)
5393 break;
5394
5395 if (ri)
5396 {
5397 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005398 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005399 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005400 }
5401 bgp_unlock_node (rn);
5402 }
5403 }
5404}
5405
5406/* Withdraw specified route type's route. */
5407void
5408bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5409{
5410 struct bgp_node *rn;
5411 struct bgp_info *ri;
5412 struct bgp_table *table;
5413
5414 table = bgp->rib[afi][SAFI_UNICAST];
5415
5416 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5417 {
5418 for (ri = rn->info; ri; ri = ri->next)
5419 if (ri->peer == bgp->peer_self
5420 && ri->type == type)
5421 break;
5422
5423 if (ri)
5424 {
5425 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005426 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005427 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005428 }
5429 }
5430}
5431
5432/* Static function to display route. */
paul94f2b392005-06-28 12:44:16 +00005433static void
paul718e3742002-12-13 20:15:29 +00005434route_vty_out_route (struct prefix *p, struct vty *vty)
5435{
5436 int len;
5437 u_int32_t destination;
5438 char buf[BUFSIZ];
5439
5440 if (p->family == AF_INET)
5441 {
5442 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5443 destination = ntohl (p->u.prefix4.s_addr);
5444
5445 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5446 || (IN_CLASSB (destination) && p->prefixlen == 16)
5447 || (IN_CLASSA (destination) && p->prefixlen == 8)
5448 || p->u.prefix4.s_addr == 0)
5449 {
5450 /* When mask is natural, mask is not displayed. */
5451 }
5452 else
5453 len += vty_out (vty, "/%d", p->prefixlen);
5454 }
5455 else
5456 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5457 p->prefixlen);
5458
5459 len = 17 - len;
5460 if (len < 1)
5461 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5462 else
5463 vty_out (vty, "%*s", len, " ");
5464}
5465
paul718e3742002-12-13 20:15:29 +00005466enum bgp_display_type
5467{
5468 normal_list,
5469};
5470
paulb40d9392005-08-22 22:34:41 +00005471/* Print the short form route status for a bgp_info */
5472static void
5473route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
paul718e3742002-12-13 20:15:29 +00005474{
paulb40d9392005-08-22 22:34:41 +00005475 /* Route status display. */
5476 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5477 vty_out (vty, "R");
5478 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
hasso93406d82005-02-02 14:40:33 +00005479 vty_out (vty, "S");
Paul Jakmafb982c22007-05-04 20:15:47 +00005480 else if (binfo->extra && binfo->extra->suppress)
paul718e3742002-12-13 20:15:29 +00005481 vty_out (vty, "s");
5482 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5483 vty_out (vty, "*");
5484 else
5485 vty_out (vty, " ");
5486
5487 /* Selected */
5488 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5489 vty_out (vty, "h");
5490 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5491 vty_out (vty, "d");
5492 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5493 vty_out (vty, ">");
5494 else
5495 vty_out (vty, " ");
5496
5497 /* Internal route. */
5498 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5499 vty_out (vty, "i");
5500 else
paulb40d9392005-08-22 22:34:41 +00005501 vty_out (vty, " ");
5502}
5503
5504/* called from terminal list command */
5505void
5506route_vty_out (struct vty *vty, struct prefix *p,
5507 struct bgp_info *binfo, int display, safi_t safi)
5508{
5509 struct attr *attr;
5510
5511 /* short status lead text */
5512 route_vty_short_status_out (vty, binfo);
paul718e3742002-12-13 20:15:29 +00005513
5514 /* print prefix and mask */
5515 if (! display)
5516 route_vty_out_route (p, vty);
5517 else
5518 vty_out (vty, "%*s", 17, " ");
5519
5520 /* Print attribute */
5521 attr = binfo->attr;
5522 if (attr)
5523 {
5524 if (p->family == AF_INET)
5525 {
5526 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005527 vty_out (vty, "%-16s",
5528 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005529 else
5530 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5531 }
5532#ifdef HAVE_IPV6
5533 else if (p->family == AF_INET6)
5534 {
5535 int len;
5536 char buf[BUFSIZ];
5537
5538 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005539 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5540 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005541 len = 16 - len;
5542 if (len < 1)
5543 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5544 else
5545 vty_out (vty, "%*s", len, " ");
5546 }
5547#endif /* HAVE_IPV6 */
5548
5549 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005550 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005551 else
5552 vty_out (vty, " ");
5553
5554 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005555 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005556 else
5557 vty_out (vty, " ");
5558
Paul Jakmafb982c22007-05-04 20:15:47 +00005559 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
paul718e3742002-12-13 20:15:29 +00005560
Paul Jakmab2518c12006-05-12 23:48:40 +00005561 /* Print aspath */
5562 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005563 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005564
Paul Jakmab2518c12006-05-12 23:48:40 +00005565 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005566 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005567 }
paul718e3742002-12-13 20:15:29 +00005568 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005569}
5570
5571/* called from terminal list command */
5572void
5573route_vty_out_tmp (struct vty *vty, struct prefix *p,
5574 struct attr *attr, safi_t safi)
5575{
5576 /* Route status display. */
5577 vty_out (vty, "*");
5578 vty_out (vty, ">");
5579 vty_out (vty, " ");
5580
5581 /* print prefix and mask */
5582 route_vty_out_route (p, vty);
5583
5584 /* Print attribute */
5585 if (attr)
5586 {
5587 if (p->family == AF_INET)
5588 {
5589 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005590 vty_out (vty, "%-16s",
5591 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005592 else
5593 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5594 }
5595#ifdef HAVE_IPV6
5596 else if (p->family == AF_INET6)
5597 {
5598 int len;
5599 char buf[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005600
5601 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005602
5603 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005604 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5605 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005606 len = 16 - len;
5607 if (len < 1)
5608 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5609 else
5610 vty_out (vty, "%*s", len, " ");
5611 }
5612#endif /* HAVE_IPV6 */
5613
5614 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005615 vty_out (vty, "%10u", attr->med);
paul718e3742002-12-13 20:15:29 +00005616 else
5617 vty_out (vty, " ");
5618
5619 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005620 vty_out (vty, "%7u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005621 else
5622 vty_out (vty, " ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005623
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005624 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
Paul Jakmafb982c22007-05-04 20:15:47 +00005625
Paul Jakmab2518c12006-05-12 23:48:40 +00005626 /* Print aspath */
5627 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005628 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005629
Paul Jakmab2518c12006-05-12 23:48:40 +00005630 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005631 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005632 }
paul718e3742002-12-13 20:15:29 +00005633
5634 vty_out (vty, "%s", VTY_NEWLINE);
5635}
5636
ajs5a646652004-11-05 01:25:55 +00005637void
paul718e3742002-12-13 20:15:29 +00005638route_vty_out_tag (struct vty *vty, struct prefix *p,
5639 struct bgp_info *binfo, int display, safi_t safi)
5640{
5641 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005642 u_int32_t label = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00005643
5644 if (!binfo->extra)
5645 return;
5646
paulb40d9392005-08-22 22:34:41 +00005647 /* short status lead text */
5648 route_vty_short_status_out (vty, binfo);
5649
paul718e3742002-12-13 20:15:29 +00005650 /* print prefix and mask */
5651 if (! display)
5652 route_vty_out_route (p, vty);
5653 else
5654 vty_out (vty, "%*s", 17, " ");
5655
5656 /* Print attribute */
5657 attr = binfo->attr;
5658 if (attr)
5659 {
5660 if (p->family == AF_INET)
5661 {
5662 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005663 vty_out (vty, "%-16s",
5664 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005665 else
5666 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5667 }
5668#ifdef HAVE_IPV6
5669 else if (p->family == AF_INET6)
5670 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005671 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005672 char buf[BUFSIZ];
5673 char buf1[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005674 if (attr->extra->mp_nexthop_len == 16)
paul718e3742002-12-13 20:15:29 +00005675 vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005676 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5677 buf, BUFSIZ));
5678 else if (attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005679 vty_out (vty, "%s(%s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005680 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5681 buf, BUFSIZ),
5682 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5683 buf1, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005684
5685 }
5686#endif /* HAVE_IPV6 */
5687 }
5688
Paul Jakmafb982c22007-05-04 20:15:47 +00005689 label = decode_label (binfo->extra->tag);
paul718e3742002-12-13 20:15:29 +00005690
5691 vty_out (vty, "notag/%d", label);
5692
5693 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005694}
5695
5696/* dampening route */
ajs5a646652004-11-05 01:25:55 +00005697static void
paul718e3742002-12-13 20:15:29 +00005698damp_route_vty_out (struct vty *vty, struct prefix *p,
5699 struct bgp_info *binfo, int display, safi_t safi)
5700{
5701 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005702 int len;
Chris Caputo50aef6f2009-06-23 06:06:49 +00005703 char timebuf[BGP_UPTIME_LEN];
paul718e3742002-12-13 20:15:29 +00005704
paulb40d9392005-08-22 22:34:41 +00005705 /* short status lead text */
5706 route_vty_short_status_out (vty, binfo);
5707
paul718e3742002-12-13 20:15:29 +00005708 /* print prefix and mask */
5709 if (! display)
5710 route_vty_out_route (p, vty);
5711 else
5712 vty_out (vty, "%*s", 17, " ");
5713
5714 len = vty_out (vty, "%s", binfo->peer->host);
5715 len = 17 - len;
5716 if (len < 1)
5717 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5718 else
5719 vty_out (vty, "%*s", len, " ");
5720
Chris Caputo50aef6f2009-06-23 06:06:49 +00005721 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005722
5723 /* Print attribute */
5724 attr = binfo->attr;
5725 if (attr)
5726 {
5727 /* Print aspath */
5728 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005729 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005730
5731 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005732 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005733 }
5734 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005735}
5736
paul718e3742002-12-13 20:15:29 +00005737/* flap route */
ajs5a646652004-11-05 01:25:55 +00005738static void
paul718e3742002-12-13 20:15:29 +00005739flap_route_vty_out (struct vty *vty, struct prefix *p,
5740 struct bgp_info *binfo, int display, safi_t safi)
5741{
5742 struct attr *attr;
5743 struct bgp_damp_info *bdi;
paul718e3742002-12-13 20:15:29 +00005744 char timebuf[BGP_UPTIME_LEN];
5745 int len;
Paul Jakmafb982c22007-05-04 20:15:47 +00005746
5747 if (!binfo->extra)
5748 return;
5749
5750 bdi = binfo->extra->damp_info;
paul718e3742002-12-13 20:15:29 +00005751
paulb40d9392005-08-22 22:34:41 +00005752 /* short status lead text */
5753 route_vty_short_status_out (vty, binfo);
5754
paul718e3742002-12-13 20:15:29 +00005755 /* print prefix and mask */
5756 if (! display)
5757 route_vty_out_route (p, vty);
5758 else
5759 vty_out (vty, "%*s", 17, " ");
5760
5761 len = vty_out (vty, "%s", binfo->peer->host);
5762 len = 16 - len;
5763 if (len < 1)
5764 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5765 else
5766 vty_out (vty, "%*s", len, " ");
5767
5768 len = vty_out (vty, "%d", bdi->flap);
5769 len = 5 - len;
5770 if (len < 1)
5771 vty_out (vty, " ");
5772 else
5773 vty_out (vty, "%*s ", len, " ");
5774
5775 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5776 timebuf, BGP_UPTIME_LEN));
5777
5778 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5779 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
Chris Caputo50aef6f2009-06-23 06:06:49 +00005780 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005781 else
5782 vty_out (vty, "%*s ", 8, " ");
5783
5784 /* Print attribute */
5785 attr = binfo->attr;
5786 if (attr)
5787 {
5788 /* Print aspath */
5789 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005790 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005791
5792 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005793 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005794 }
5795 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005796}
5797
paul94f2b392005-06-28 12:44:16 +00005798static void
paul718e3742002-12-13 20:15:29 +00005799route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5800 struct bgp_info *binfo, afi_t afi, safi_t safi)
5801{
5802 char buf[INET6_ADDRSTRLEN];
5803 char buf1[BUFSIZ];
5804 struct attr *attr;
5805 int sockunion_vty_out (struct vty *, union sockunion *);
John Kemp30b00172011-03-18 17:52:18 +03005806#ifdef HAVE_CLOCK_MONOTONIC
5807 time_t tbuf;
5808#endif
paul718e3742002-12-13 20:15:29 +00005809
5810 attr = binfo->attr;
5811
5812 if (attr)
5813 {
5814 /* Line1 display AS-path, Aggregator */
5815 if (attr->aspath)
5816 {
5817 vty_out (vty, " ");
paulfe69a502005-09-10 16:55:02 +00005818 if (aspath_count_hops (attr->aspath) == 0)
paul718e3742002-12-13 20:15:29 +00005819 vty_out (vty, "Local");
5820 else
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005821 aspath_print_vty (vty, "%s", attr->aspath, "");
paul718e3742002-12-13 20:15:29 +00005822 }
5823
paulb40d9392005-08-22 22:34:41 +00005824 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5825 vty_out (vty, ", (removed)");
hasso93406d82005-02-02 14:40:33 +00005826 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5827 vty_out (vty, ", (stale)");
5828 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04005829 vty_out (vty, ", (aggregated by %u %s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005830 attr->extra->aggregator_as,
5831 inet_ntoa (attr->extra->aggregator_addr));
hasso93406d82005-02-02 14:40:33 +00005832 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5833 vty_out (vty, ", (Received from a RR-client)");
5834 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5835 vty_out (vty, ", (Received from a RS-client)");
5836 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5837 vty_out (vty, ", (history entry)");
5838 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5839 vty_out (vty, ", (suppressed due to dampening)");
paul718e3742002-12-13 20:15:29 +00005840 vty_out (vty, "%s", VTY_NEWLINE);
5841
5842 /* Line2 display Next-hop, Neighbor, Router-id */
5843 if (p->family == AF_INET)
5844 {
5845 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
Paul Jakmafb982c22007-05-04 20:15:47 +00005846 inet_ntoa (attr->extra->mp_nexthop_global_in) :
paul718e3742002-12-13 20:15:29 +00005847 inet_ntoa (attr->nexthop));
5848 }
5849#ifdef HAVE_IPV6
5850 else
5851 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005852 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005853 vty_out (vty, " %s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005854 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
paul718e3742002-12-13 20:15:29 +00005855 buf, INET6_ADDRSTRLEN));
5856 }
5857#endif /* HAVE_IPV6 */
5858
5859 if (binfo->peer == bgp->peer_self)
5860 {
5861 vty_out (vty, " from %s ",
5862 p->family == AF_INET ? "0.0.0.0" : "::");
5863 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5864 }
5865 else
5866 {
5867 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5868 vty_out (vty, " (inaccessible)");
Paul Jakmafb982c22007-05-04 20:15:47 +00005869 else if (binfo->extra && binfo->extra->igpmetric)
5870 vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
pauleb821182004-05-01 08:44:08 +00005871 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
paul718e3742002-12-13 20:15:29 +00005872 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005873 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005874 else
5875 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
5876 }
5877 vty_out (vty, "%s", VTY_NEWLINE);
5878
5879#ifdef HAVE_IPV6
5880 /* display nexthop local */
Paul Jakmafb982c22007-05-04 20:15:47 +00005881 if (attr->extra && attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005882 {
5883 vty_out (vty, " (%s)%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005884 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
paul718e3742002-12-13 20:15:29 +00005885 buf, INET6_ADDRSTRLEN),
5886 VTY_NEWLINE);
5887 }
5888#endif /* HAVE_IPV6 */
5889
5890 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
5891 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
5892
5893 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005894 vty_out (vty, ", metric %u", attr->med);
paul718e3742002-12-13 20:15:29 +00005895
5896 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005897 vty_out (vty, ", localpref %u", attr->local_pref);
paul718e3742002-12-13 20:15:29 +00005898 else
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005899 vty_out (vty, ", localpref %u", bgp->default_local_pref);
paul718e3742002-12-13 20:15:29 +00005900
Paul Jakmafb982c22007-05-04 20:15:47 +00005901 if (attr->extra && attr->extra->weight != 0)
Wataru Tanitsuc099baf2010-09-10 09:47:56 -07005902 vty_out (vty, ", weight %u", attr->extra->weight);
paul718e3742002-12-13 20:15:29 +00005903
5904 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5905 vty_out (vty, ", valid");
5906
5907 if (binfo->peer != bgp->peer_self)
5908 {
5909 if (binfo->peer->as == binfo->peer->local_as)
5910 vty_out (vty, ", internal");
5911 else
5912 vty_out (vty, ", %s",
5913 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
5914 }
5915 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
5916 vty_out (vty, ", aggregated, local");
5917 else if (binfo->type != ZEBRA_ROUTE_BGP)
5918 vty_out (vty, ", sourced");
5919 else
5920 vty_out (vty, ", sourced, local");
5921
5922 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
5923 vty_out (vty, ", atomic-aggregate");
5924
5925 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5926 vty_out (vty, ", best");
5927
5928 vty_out (vty, "%s", VTY_NEWLINE);
5929
5930 /* Line 4 display Community */
5931 if (attr->community)
5932 vty_out (vty, " Community: %s%s", attr->community->str,
5933 VTY_NEWLINE);
5934
5935 /* Line 5 display Extended-community */
5936 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
Paul Jakmafb982c22007-05-04 20:15:47 +00005937 vty_out (vty, " Extended Community: %s%s",
5938 attr->extra->ecommunity->str, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005939
5940 /* Line 6 display Originator, Cluster-id */
5941 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
5942 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
5943 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005944 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005945 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005946 vty_out (vty, " Originator: %s",
5947 inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005948
5949 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
5950 {
5951 int i;
5952 vty_out (vty, ", Cluster list: ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005953 for (i = 0; i < attr->extra->cluster->length / 4; i++)
5954 vty_out (vty, "%s ",
5955 inet_ntoa (attr->extra->cluster->list[i]));
paul718e3742002-12-13 20:15:29 +00005956 }
5957 vty_out (vty, "%s", VTY_NEWLINE);
5958 }
Paul Jakma41367172007-08-06 15:24:51 +00005959
Paul Jakmafb982c22007-05-04 20:15:47 +00005960 if (binfo->extra && binfo->extra->damp_info)
paul718e3742002-12-13 20:15:29 +00005961 bgp_damp_info_vty (vty, binfo);
5962
5963 /* Line 7 display Uptime */
John Kemp30b00172011-03-18 17:52:18 +03005964#ifdef HAVE_CLOCK_MONOTONIC
5965 tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
Vladimir L Ivanov213b6cd2010-10-21 14:59:54 +04005966 vty_out (vty, " Last update: %s", ctime(&tbuf));
John Kemp30b00172011-03-18 17:52:18 +03005967#else
5968 vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
5969#endif /* HAVE_CLOCK_MONOTONIC */
paul718e3742002-12-13 20:15:29 +00005970 }
5971 vty_out (vty, "%s", VTY_NEWLINE);
5972}
5973
paulb40d9392005-08-22 22:34:41 +00005974#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 +00005975#define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
paul718e3742002-12-13 20:15:29 +00005976#define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
5977#define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
5978#define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
5979
5980enum bgp_show_type
5981{
5982 bgp_show_type_normal,
5983 bgp_show_type_regexp,
5984 bgp_show_type_prefix_list,
5985 bgp_show_type_filter_list,
5986 bgp_show_type_route_map,
5987 bgp_show_type_neighbor,
5988 bgp_show_type_cidr_only,
5989 bgp_show_type_prefix_longer,
5990 bgp_show_type_community_all,
5991 bgp_show_type_community,
5992 bgp_show_type_community_exact,
5993 bgp_show_type_community_list,
5994 bgp_show_type_community_list_exact,
5995 bgp_show_type_flap_statistics,
5996 bgp_show_type_flap_address,
5997 bgp_show_type_flap_prefix,
5998 bgp_show_type_flap_cidr_only,
5999 bgp_show_type_flap_regexp,
6000 bgp_show_type_flap_filter_list,
6001 bgp_show_type_flap_prefix_list,
6002 bgp_show_type_flap_prefix_longer,
6003 bgp_show_type_flap_route_map,
6004 bgp_show_type_flap_neighbor,
6005 bgp_show_type_dampend_paths,
6006 bgp_show_type_damp_neighbor
6007};
6008
ajs5a646652004-11-05 01:25:55 +00006009static int
paulfee0f4c2004-09-13 05:12:46 +00006010bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
ajs5a646652004-11-05 01:25:55 +00006011 enum bgp_show_type type, void *output_arg)
paul718e3742002-12-13 20:15:29 +00006012{
paul718e3742002-12-13 20:15:29 +00006013 struct bgp_info *ri;
6014 struct bgp_node *rn;
paul718e3742002-12-13 20:15:29 +00006015 int header = 1;
paul718e3742002-12-13 20:15:29 +00006016 int display;
ajs5a646652004-11-05 01:25:55 +00006017 unsigned long output_count;
paul718e3742002-12-13 20:15:29 +00006018
6019 /* This is first entry point, so reset total line. */
ajs5a646652004-11-05 01:25:55 +00006020 output_count = 0;
paul718e3742002-12-13 20:15:29 +00006021
paul718e3742002-12-13 20:15:29 +00006022 /* Start processing of routes. */
6023 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6024 if (rn->info != NULL)
6025 {
6026 display = 0;
6027
6028 for (ri = rn->info; ri; ri = ri->next)
6029 {
ajs5a646652004-11-05 01:25:55 +00006030 if (type == bgp_show_type_flap_statistics
paul718e3742002-12-13 20:15:29 +00006031 || type == bgp_show_type_flap_address
6032 || type == bgp_show_type_flap_prefix
6033 || type == bgp_show_type_flap_cidr_only
6034 || type == bgp_show_type_flap_regexp
6035 || type == bgp_show_type_flap_filter_list
6036 || type == bgp_show_type_flap_prefix_list
6037 || type == bgp_show_type_flap_prefix_longer
6038 || type == bgp_show_type_flap_route_map
6039 || type == bgp_show_type_flap_neighbor
6040 || type == bgp_show_type_dampend_paths
6041 || type == bgp_show_type_damp_neighbor)
6042 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006043 if (!(ri->extra && ri->extra->damp_info))
paul718e3742002-12-13 20:15:29 +00006044 continue;
6045 }
6046 if (type == bgp_show_type_regexp
6047 || type == bgp_show_type_flap_regexp)
6048 {
ajs5a646652004-11-05 01:25:55 +00006049 regex_t *regex = output_arg;
paul718e3742002-12-13 20:15:29 +00006050
6051 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6052 continue;
6053 }
6054 if (type == bgp_show_type_prefix_list
6055 || type == bgp_show_type_flap_prefix_list)
6056 {
ajs5a646652004-11-05 01:25:55 +00006057 struct prefix_list *plist = output_arg;
paul718e3742002-12-13 20:15:29 +00006058
6059 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6060 continue;
6061 }
6062 if (type == bgp_show_type_filter_list
6063 || type == bgp_show_type_flap_filter_list)
6064 {
ajs5a646652004-11-05 01:25:55 +00006065 struct as_list *as_list = output_arg;
paul718e3742002-12-13 20:15:29 +00006066
6067 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6068 continue;
6069 }
6070 if (type == bgp_show_type_route_map
6071 || type == bgp_show_type_flap_route_map)
6072 {
ajs5a646652004-11-05 01:25:55 +00006073 struct route_map *rmap = output_arg;
paul718e3742002-12-13 20:15:29 +00006074 struct bgp_info binfo;
Paul Jakma9eda90c2007-08-30 13:36:17 +00006075 struct attr dummy_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00006076 int ret;
6077
Paul Jakmafb982c22007-05-04 20:15:47 +00006078 bgp_attr_dup (&dummy_attr, ri->attr);
paul718e3742002-12-13 20:15:29 +00006079 binfo.peer = ri->peer;
6080 binfo.attr = &dummy_attr;
6081
6082 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
Paul Jakmafb982c22007-05-04 20:15:47 +00006083
6084 bgp_attr_extra_free (&dummy_attr);
6085
paul718e3742002-12-13 20:15:29 +00006086 if (ret == RMAP_DENYMATCH)
6087 continue;
6088 }
6089 if (type == bgp_show_type_neighbor
6090 || type == bgp_show_type_flap_neighbor
6091 || type == bgp_show_type_damp_neighbor)
6092 {
ajs5a646652004-11-05 01:25:55 +00006093 union sockunion *su = output_arg;
paul718e3742002-12-13 20:15:29 +00006094
6095 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6096 continue;
6097 }
6098 if (type == bgp_show_type_cidr_only
6099 || type == bgp_show_type_flap_cidr_only)
6100 {
6101 u_int32_t destination;
6102
6103 destination = ntohl (rn->p.u.prefix4.s_addr);
6104 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6105 continue;
6106 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6107 continue;
6108 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6109 continue;
6110 }
6111 if (type == bgp_show_type_prefix_longer
6112 || type == bgp_show_type_flap_prefix_longer)
6113 {
ajs5a646652004-11-05 01:25:55 +00006114 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006115
6116 if (! prefix_match (p, &rn->p))
6117 continue;
6118 }
6119 if (type == bgp_show_type_community_all)
6120 {
6121 if (! ri->attr->community)
6122 continue;
6123 }
6124 if (type == bgp_show_type_community)
6125 {
ajs5a646652004-11-05 01:25:55 +00006126 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006127
6128 if (! ri->attr->community ||
6129 ! community_match (ri->attr->community, com))
6130 continue;
6131 }
6132 if (type == bgp_show_type_community_exact)
6133 {
ajs5a646652004-11-05 01:25:55 +00006134 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006135
6136 if (! ri->attr->community ||
6137 ! community_cmp (ri->attr->community, com))
6138 continue;
6139 }
6140 if (type == bgp_show_type_community_list)
6141 {
ajs5a646652004-11-05 01:25:55 +00006142 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006143
6144 if (! community_list_match (ri->attr->community, list))
6145 continue;
6146 }
6147 if (type == bgp_show_type_community_list_exact)
6148 {
ajs5a646652004-11-05 01:25:55 +00006149 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006150
6151 if (! community_list_exact_match (ri->attr->community, list))
6152 continue;
6153 }
6154 if (type == bgp_show_type_flap_address
6155 || type == bgp_show_type_flap_prefix)
6156 {
ajs5a646652004-11-05 01:25:55 +00006157 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006158
6159 if (! prefix_match (&rn->p, p))
6160 continue;
6161
6162 if (type == bgp_show_type_flap_prefix)
6163 if (p->prefixlen != rn->p.prefixlen)
6164 continue;
6165 }
6166 if (type == bgp_show_type_dampend_paths
6167 || type == bgp_show_type_damp_neighbor)
6168 {
6169 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6170 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6171 continue;
6172 }
6173
6174 if (header)
6175 {
hasso93406d82005-02-02 14:40:33 +00006176 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6177 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6178 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006179 if (type == bgp_show_type_dampend_paths
6180 || type == bgp_show_type_damp_neighbor)
6181 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6182 else if (type == bgp_show_type_flap_statistics
6183 || type == bgp_show_type_flap_address
6184 || type == bgp_show_type_flap_prefix
6185 || type == bgp_show_type_flap_cidr_only
6186 || type == bgp_show_type_flap_regexp
6187 || type == bgp_show_type_flap_filter_list
6188 || type == bgp_show_type_flap_prefix_list
6189 || type == bgp_show_type_flap_prefix_longer
6190 || type == bgp_show_type_flap_route_map
6191 || type == bgp_show_type_flap_neighbor)
6192 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6193 else
6194 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006195 header = 0;
6196 }
6197
6198 if (type == bgp_show_type_dampend_paths
6199 || type == bgp_show_type_damp_neighbor)
ajs5a646652004-11-05 01:25:55 +00006200 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006201 else if (type == bgp_show_type_flap_statistics
6202 || type == bgp_show_type_flap_address
6203 || type == bgp_show_type_flap_prefix
6204 || type == bgp_show_type_flap_cidr_only
6205 || type == bgp_show_type_flap_regexp
6206 || type == bgp_show_type_flap_filter_list
6207 || type == bgp_show_type_flap_prefix_list
6208 || type == bgp_show_type_flap_prefix_longer
6209 || type == bgp_show_type_flap_route_map
6210 || type == bgp_show_type_flap_neighbor)
ajs5a646652004-11-05 01:25:55 +00006211 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006212 else
ajs5a646652004-11-05 01:25:55 +00006213 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006214 display++;
6215 }
6216 if (display)
ajs5a646652004-11-05 01:25:55 +00006217 output_count++;
paul718e3742002-12-13 20:15:29 +00006218 }
6219
6220 /* No route is displayed */
ajs5a646652004-11-05 01:25:55 +00006221 if (output_count == 0)
paul718e3742002-12-13 20:15:29 +00006222 {
6223 if (type == bgp_show_type_normal)
6224 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6225 }
6226 else
6227 vty_out (vty, "%sTotal number of prefixes %ld%s",
ajs5a646652004-11-05 01:25:55 +00006228 VTY_NEWLINE, output_count, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006229
6230 return CMD_SUCCESS;
6231}
6232
ajs5a646652004-11-05 01:25:55 +00006233static int
paulfee0f4c2004-09-13 05:12:46 +00006234bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
ajs5a646652004-11-05 01:25:55 +00006235 enum bgp_show_type type, void *output_arg)
paulfee0f4c2004-09-13 05:12:46 +00006236{
6237 struct bgp_table *table;
6238
6239 if (bgp == NULL) {
6240 bgp = bgp_get_default ();
6241 }
6242
6243 if (bgp == NULL)
6244 {
6245 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6246 return CMD_WARNING;
6247 }
6248
6249
6250 table = bgp->rib[afi][safi];
6251
ajs5a646652004-11-05 01:25:55 +00006252 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
paulfee0f4c2004-09-13 05:12:46 +00006253}
6254
paul718e3742002-12-13 20:15:29 +00006255/* Header of detailed BGP route information */
paul94f2b392005-06-28 12:44:16 +00006256static void
paul718e3742002-12-13 20:15:29 +00006257route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6258 struct bgp_node *rn,
6259 struct prefix_rd *prd, afi_t afi, safi_t safi)
6260{
6261 struct bgp_info *ri;
6262 struct prefix *p;
6263 struct peer *peer;
paul1eb8ef22005-04-07 07:30:20 +00006264 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00006265 char buf1[INET6_ADDRSTRLEN];
6266 char buf2[INET6_ADDRSTRLEN];
6267 int count = 0;
6268 int best = 0;
6269 int suppress = 0;
6270 int no_export = 0;
6271 int no_advertise = 0;
6272 int local_as = 0;
6273 int first = 0;
6274
6275 p = &rn->p;
6276 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6277 (safi == SAFI_MPLS_VPN ?
6278 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6279 safi == SAFI_MPLS_VPN ? ":" : "",
6280 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6281 p->prefixlen, VTY_NEWLINE);
6282
6283 for (ri = rn->info; ri; ri = ri->next)
6284 {
6285 count++;
6286 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6287 {
6288 best = count;
Paul Jakmafb982c22007-05-04 20:15:47 +00006289 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00006290 suppress = 1;
6291 if (ri->attr->community != NULL)
6292 {
6293 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6294 no_advertise = 1;
6295 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6296 no_export = 1;
6297 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6298 local_as = 1;
6299 }
6300 }
6301 }
6302
6303 vty_out (vty, "Paths: (%d available", count);
6304 if (best)
6305 {
6306 vty_out (vty, ", best #%d", best);
6307 if (safi == SAFI_UNICAST)
6308 vty_out (vty, ", table Default-IP-Routing-Table");
6309 }
6310 else
6311 vty_out (vty, ", no best path");
6312 if (no_advertise)
6313 vty_out (vty, ", not advertised to any peer");
6314 else if (no_export)
6315 vty_out (vty, ", not advertised to EBGP peer");
6316 else if (local_as)
6317 vty_out (vty, ", not advertised outside local AS");
6318 if (suppress)
6319 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6320 vty_out (vty, ")%s", VTY_NEWLINE);
6321
6322 /* advertised peer */
paul1eb8ef22005-04-07 07:30:20 +00006323 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00006324 {
6325 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6326 {
6327 if (! first)
6328 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6329 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6330 first = 1;
6331 }
6332 }
6333 if (! first)
6334 vty_out (vty, " Not advertised to any peer");
6335 vty_out (vty, "%s", VTY_NEWLINE);
6336}
6337
6338/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +00006339static int
paulfee0f4c2004-09-13 05:12:46 +00006340bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
paulfd79ac92004-10-13 05:06:08 +00006341 struct bgp_table *rib, const char *ip_str,
6342 afi_t afi, safi_t safi, struct prefix_rd *prd,
6343 int prefix_check)
paul718e3742002-12-13 20:15:29 +00006344{
6345 int ret;
6346 int header;
6347 int display = 0;
6348 struct prefix match;
6349 struct bgp_node *rn;
6350 struct bgp_node *rm;
6351 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00006352 struct bgp_table *table;
6353
paul718e3742002-12-13 20:15:29 +00006354 /* Check IP address argument. */
6355 ret = str2prefix (ip_str, &match);
6356 if (! ret)
6357 {
6358 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6359 return CMD_WARNING;
6360 }
6361
6362 match.family = afi2family (afi);
6363
6364 if (safi == SAFI_MPLS_VPN)
6365 {
paulfee0f4c2004-09-13 05:12:46 +00006366 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
paul718e3742002-12-13 20:15:29 +00006367 {
6368 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6369 continue;
6370
6371 if ((table = rn->info) != NULL)
6372 {
6373 header = 1;
6374
6375 if ((rm = bgp_node_match (table, &match)) != NULL)
6376 {
6377 if (prefix_check && rm->p.prefixlen != match.prefixlen)
Chris Caputo6c88b442010-07-27 16:28:55 +00006378 {
6379 bgp_unlock_node (rm);
6380 continue;
6381 }
paul718e3742002-12-13 20:15:29 +00006382
6383 for (ri = rm->info; ri; ri = ri->next)
6384 {
6385 if (header)
6386 {
6387 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6388 AFI_IP, SAFI_MPLS_VPN);
6389
6390 header = 0;
6391 }
6392 display++;
6393 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6394 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006395
6396 bgp_unlock_node (rm);
paul718e3742002-12-13 20:15:29 +00006397 }
6398 }
6399 }
6400 }
6401 else
6402 {
6403 header = 1;
6404
paulfee0f4c2004-09-13 05:12:46 +00006405 if ((rn = bgp_node_match (rib, &match)) != NULL)
paul718e3742002-12-13 20:15:29 +00006406 {
6407 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6408 {
6409 for (ri = rn->info; ri; ri = ri->next)
6410 {
6411 if (header)
6412 {
6413 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6414 header = 0;
6415 }
6416 display++;
6417 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6418 }
6419 }
Chris Caputo6c88b442010-07-27 16:28:55 +00006420
6421 bgp_unlock_node (rn);
paul718e3742002-12-13 20:15:29 +00006422 }
6423 }
6424
6425 if (! display)
6426 {
6427 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6428 return CMD_WARNING;
6429 }
6430
6431 return CMD_SUCCESS;
6432}
6433
paulfee0f4c2004-09-13 05:12:46 +00006434/* Display specified route of Main RIB */
paul94f2b392005-06-28 12:44:16 +00006435static int
paulfd79ac92004-10-13 05:06:08 +00006436bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
paulfee0f4c2004-09-13 05:12:46 +00006437 afi_t afi, safi_t safi, struct prefix_rd *prd,
6438 int prefix_check)
6439{
6440 struct bgp *bgp;
6441
6442 /* BGP structure lookup. */
6443 if (view_name)
6444 {
6445 bgp = bgp_lookup_by_name (view_name);
6446 if (bgp == NULL)
6447 {
6448 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6449 return CMD_WARNING;
6450 }
6451 }
6452 else
6453 {
6454 bgp = bgp_get_default ();
6455 if (bgp == NULL)
6456 {
6457 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6458 return CMD_WARNING;
6459 }
6460 }
6461
6462 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6463 afi, safi, prd, prefix_check);
6464}
6465
paul718e3742002-12-13 20:15:29 +00006466/* BGP route print out function. */
6467DEFUN (show_ip_bgp,
6468 show_ip_bgp_cmd,
6469 "show ip bgp",
6470 SHOW_STR
6471 IP_STR
6472 BGP_STR)
6473{
ajs5a646652004-11-05 01:25:55 +00006474 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006475}
6476
6477DEFUN (show_ip_bgp_ipv4,
6478 show_ip_bgp_ipv4_cmd,
6479 "show ip bgp ipv4 (unicast|multicast)",
6480 SHOW_STR
6481 IP_STR
6482 BGP_STR
6483 "Address family\n"
6484 "Address Family modifier\n"
6485 "Address Family modifier\n")
6486{
6487 if (strncmp (argv[0], "m", 1) == 0)
ajs5a646652004-11-05 01:25:55 +00006488 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6489 NULL);
paul718e3742002-12-13 20:15:29 +00006490
ajs5a646652004-11-05 01:25:55 +00006491 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006492}
6493
Michael Lambert95cbbd22010-07-23 14:43:04 -04006494ALIAS (show_ip_bgp_ipv4,
6495 show_bgp_ipv4_safi_cmd,
6496 "show bgp ipv4 (unicast|multicast)",
6497 SHOW_STR
6498 BGP_STR
6499 "Address family\n"
6500 "Address Family modifier\n"
6501 "Address Family modifier\n")
6502
paul718e3742002-12-13 20:15:29 +00006503DEFUN (show_ip_bgp_route,
6504 show_ip_bgp_route_cmd,
6505 "show ip bgp A.B.C.D",
6506 SHOW_STR
6507 IP_STR
6508 BGP_STR
6509 "Network in the BGP routing table to display\n")
6510{
6511 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6512}
6513
6514DEFUN (show_ip_bgp_ipv4_route,
6515 show_ip_bgp_ipv4_route_cmd,
6516 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6517 SHOW_STR
6518 IP_STR
6519 BGP_STR
6520 "Address family\n"
6521 "Address Family modifier\n"
6522 "Address Family modifier\n"
6523 "Network in the BGP routing table to display\n")
6524{
6525 if (strncmp (argv[0], "m", 1) == 0)
6526 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6527
6528 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6529}
6530
Michael Lambert95cbbd22010-07-23 14:43:04 -04006531ALIAS (show_ip_bgp_ipv4_route,
6532 show_bgp_ipv4_safi_route_cmd,
6533 "show bgp ipv4 (unicast|multicast) A.B.C.D",
6534 SHOW_STR
6535 BGP_STR
6536 "Address family\n"
6537 "Address Family modifier\n"
6538 "Address Family modifier\n"
6539 "Network in the BGP routing table to display\n")
6540
paul718e3742002-12-13 20:15:29 +00006541DEFUN (show_ip_bgp_vpnv4_all_route,
6542 show_ip_bgp_vpnv4_all_route_cmd,
6543 "show ip bgp vpnv4 all A.B.C.D",
6544 SHOW_STR
6545 IP_STR
6546 BGP_STR
6547 "Display VPNv4 NLRI specific information\n"
6548 "Display information about all VPNv4 NLRIs\n"
6549 "Network in the BGP routing table to display\n")
6550{
6551 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6552}
6553
6554DEFUN (show_ip_bgp_vpnv4_rd_route,
6555 show_ip_bgp_vpnv4_rd_route_cmd,
6556 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6557 SHOW_STR
6558 IP_STR
6559 BGP_STR
6560 "Display VPNv4 NLRI specific information\n"
6561 "Display information for a route distinguisher\n"
6562 "VPN Route Distinguisher\n"
6563 "Network in the BGP routing table to display\n")
6564{
6565 int ret;
6566 struct prefix_rd prd;
6567
6568 ret = str2prefix_rd (argv[0], &prd);
6569 if (! ret)
6570 {
6571 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6572 return CMD_WARNING;
6573 }
6574 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6575}
6576
6577DEFUN (show_ip_bgp_prefix,
6578 show_ip_bgp_prefix_cmd,
6579 "show ip bgp A.B.C.D/M",
6580 SHOW_STR
6581 IP_STR
6582 BGP_STR
6583 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6584{
6585 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6586}
6587
6588DEFUN (show_ip_bgp_ipv4_prefix,
6589 show_ip_bgp_ipv4_prefix_cmd,
6590 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6591 SHOW_STR
6592 IP_STR
6593 BGP_STR
6594 "Address family\n"
6595 "Address Family modifier\n"
6596 "Address Family modifier\n"
6597 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6598{
6599 if (strncmp (argv[0], "m", 1) == 0)
6600 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6601
6602 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6603}
6604
Michael Lambert95cbbd22010-07-23 14:43:04 -04006605ALIAS (show_ip_bgp_ipv4_prefix,
6606 show_bgp_ipv4_safi_prefix_cmd,
6607 "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
6608 SHOW_STR
6609 BGP_STR
6610 "Address family\n"
6611 "Address Family modifier\n"
6612 "Address Family modifier\n"
6613 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6614
paul718e3742002-12-13 20:15:29 +00006615DEFUN (show_ip_bgp_vpnv4_all_prefix,
6616 show_ip_bgp_vpnv4_all_prefix_cmd,
6617 "show ip bgp vpnv4 all A.B.C.D/M",
6618 SHOW_STR
6619 IP_STR
6620 BGP_STR
6621 "Display VPNv4 NLRI specific information\n"
6622 "Display information about all VPNv4 NLRIs\n"
6623 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6624{
6625 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6626}
6627
6628DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6629 show_ip_bgp_vpnv4_rd_prefix_cmd,
6630 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6631 SHOW_STR
6632 IP_STR
6633 BGP_STR
6634 "Display VPNv4 NLRI specific information\n"
6635 "Display information for a route distinguisher\n"
6636 "VPN Route Distinguisher\n"
6637 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6638{
6639 int ret;
6640 struct prefix_rd prd;
6641
6642 ret = str2prefix_rd (argv[0], &prd);
6643 if (! ret)
6644 {
6645 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6646 return CMD_WARNING;
6647 }
6648 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6649}
6650
6651DEFUN (show_ip_bgp_view,
6652 show_ip_bgp_view_cmd,
6653 "show ip bgp view WORD",
6654 SHOW_STR
6655 IP_STR
6656 BGP_STR
6657 "BGP view\n"
6658 "BGP view name\n")
6659{
paulbb46e942003-10-24 19:02:03 +00006660 struct bgp *bgp;
6661
6662 /* BGP structure lookup. */
6663 bgp = bgp_lookup_by_name (argv[0]);
6664 if (bgp == NULL)
6665 {
6666 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6667 return CMD_WARNING;
6668 }
6669
ajs5a646652004-11-05 01:25:55 +00006670 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006671}
6672
6673DEFUN (show_ip_bgp_view_route,
6674 show_ip_bgp_view_route_cmd,
6675 "show ip bgp view WORD A.B.C.D",
6676 SHOW_STR
6677 IP_STR
6678 BGP_STR
6679 "BGP view\n"
6680 "BGP view name\n"
6681 "Network in the BGP routing table to display\n")
6682{
6683 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6684}
6685
6686DEFUN (show_ip_bgp_view_prefix,
6687 show_ip_bgp_view_prefix_cmd,
6688 "show ip bgp view WORD A.B.C.D/M",
6689 SHOW_STR
6690 IP_STR
6691 BGP_STR
6692 "BGP view\n"
6693 "BGP view name\n"
6694 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6695{
6696 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6697}
6698
6699#ifdef HAVE_IPV6
6700DEFUN (show_bgp,
6701 show_bgp_cmd,
6702 "show bgp",
6703 SHOW_STR
6704 BGP_STR)
6705{
ajs5a646652004-11-05 01:25:55 +00006706 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6707 NULL);
paul718e3742002-12-13 20:15:29 +00006708}
6709
6710ALIAS (show_bgp,
6711 show_bgp_ipv6_cmd,
6712 "show bgp ipv6",
6713 SHOW_STR
6714 BGP_STR
6715 "Address family\n")
6716
Michael Lambert95cbbd22010-07-23 14:43:04 -04006717DEFUN (show_bgp_ipv6_safi,
6718 show_bgp_ipv6_safi_cmd,
6719 "show bgp ipv6 (unicast|multicast)",
6720 SHOW_STR
6721 BGP_STR
6722 "Address family\n"
6723 "Address Family modifier\n"
6724 "Address Family modifier\n")
6725{
6726 if (strncmp (argv[0], "m", 1) == 0)
6727 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6728 NULL);
6729
6730 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6731}
6732
paul718e3742002-12-13 20:15:29 +00006733/* old command */
6734DEFUN (show_ipv6_bgp,
6735 show_ipv6_bgp_cmd,
6736 "show ipv6 bgp",
6737 SHOW_STR
6738 IP_STR
6739 BGP_STR)
6740{
ajs5a646652004-11-05 01:25:55 +00006741 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6742 NULL);
paul718e3742002-12-13 20:15:29 +00006743}
6744
6745DEFUN (show_bgp_route,
6746 show_bgp_route_cmd,
6747 "show bgp X:X::X:X",
6748 SHOW_STR
6749 BGP_STR
6750 "Network in the BGP routing table to display\n")
6751{
6752 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6753}
6754
6755ALIAS (show_bgp_route,
6756 show_bgp_ipv6_route_cmd,
6757 "show bgp ipv6 X:X::X:X",
6758 SHOW_STR
6759 BGP_STR
6760 "Address family\n"
6761 "Network in the BGP routing table to display\n")
6762
Michael Lambert95cbbd22010-07-23 14:43:04 -04006763DEFUN (show_bgp_ipv6_safi_route,
6764 show_bgp_ipv6_safi_route_cmd,
6765 "show bgp ipv6 (unicast|multicast) X:X::X:X",
6766 SHOW_STR
6767 BGP_STR
6768 "Address family\n"
6769 "Address Family modifier\n"
6770 "Address Family modifier\n"
6771 "Network in the BGP routing table to display\n")
6772{
6773 if (strncmp (argv[0], "m", 1) == 0)
6774 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6775
6776 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6777}
6778
paul718e3742002-12-13 20:15:29 +00006779/* old command */
6780DEFUN (show_ipv6_bgp_route,
6781 show_ipv6_bgp_route_cmd,
6782 "show ipv6 bgp X:X::X:X",
6783 SHOW_STR
6784 IP_STR
6785 BGP_STR
6786 "Network in the BGP routing table to display\n")
6787{
6788 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6789}
6790
6791DEFUN (show_bgp_prefix,
6792 show_bgp_prefix_cmd,
6793 "show bgp X:X::X:X/M",
6794 SHOW_STR
6795 BGP_STR
6796 "IPv6 prefix <network>/<length>\n")
6797{
6798 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6799}
6800
6801ALIAS (show_bgp_prefix,
6802 show_bgp_ipv6_prefix_cmd,
6803 "show bgp ipv6 X:X::X:X/M",
6804 SHOW_STR
6805 BGP_STR
6806 "Address family\n"
6807 "IPv6 prefix <network>/<length>\n")
6808
Michael Lambert95cbbd22010-07-23 14:43:04 -04006809DEFUN (show_bgp_ipv6_safi_prefix,
6810 show_bgp_ipv6_safi_prefix_cmd,
6811 "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
6812 SHOW_STR
6813 BGP_STR
6814 "Address family\n"
6815 "Address Family modifier\n"
6816 "Address Family modifier\n"
6817 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6818{
6819 if (strncmp (argv[0], "m", 1) == 0)
6820 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6821
6822 return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6823}
6824
paul718e3742002-12-13 20:15:29 +00006825/* old command */
6826DEFUN (show_ipv6_bgp_prefix,
6827 show_ipv6_bgp_prefix_cmd,
6828 "show ipv6 bgp X:X::X:X/M",
6829 SHOW_STR
6830 IP_STR
6831 BGP_STR
6832 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6833{
6834 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6835}
6836
paulbb46e942003-10-24 19:02:03 +00006837DEFUN (show_bgp_view,
6838 show_bgp_view_cmd,
6839 "show bgp view WORD",
6840 SHOW_STR
6841 BGP_STR
6842 "BGP view\n"
6843 "View name\n")
6844{
6845 struct bgp *bgp;
6846
6847 /* BGP structure lookup. */
6848 bgp = bgp_lookup_by_name (argv[0]);
6849 if (bgp == NULL)
6850 {
6851 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6852 return CMD_WARNING;
6853 }
6854
ajs5a646652004-11-05 01:25:55 +00006855 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
paulbb46e942003-10-24 19:02:03 +00006856}
6857
6858ALIAS (show_bgp_view,
6859 show_bgp_view_ipv6_cmd,
6860 "show bgp view WORD ipv6",
6861 SHOW_STR
6862 BGP_STR
6863 "BGP view\n"
6864 "View name\n"
6865 "Address family\n")
6866
6867DEFUN (show_bgp_view_route,
6868 show_bgp_view_route_cmd,
6869 "show bgp view WORD X:X::X:X",
6870 SHOW_STR
6871 BGP_STR
6872 "BGP view\n"
6873 "View name\n"
6874 "Network in the BGP routing table to display\n")
6875{
6876 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6877}
6878
6879ALIAS (show_bgp_view_route,
6880 show_bgp_view_ipv6_route_cmd,
6881 "show bgp view WORD ipv6 X:X::X:X",
6882 SHOW_STR
6883 BGP_STR
6884 "BGP view\n"
6885 "View name\n"
6886 "Address family\n"
6887 "Network in the BGP routing table to display\n")
6888
6889DEFUN (show_bgp_view_prefix,
6890 show_bgp_view_prefix_cmd,
6891 "show bgp view WORD X:X::X:X/M",
6892 SHOW_STR
6893 BGP_STR
6894 "BGP view\n"
6895 "View name\n"
6896 "IPv6 prefix <network>/<length>\n")
6897{
6898 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6899}
6900
6901ALIAS (show_bgp_view_prefix,
6902 show_bgp_view_ipv6_prefix_cmd,
6903 "show bgp view WORD ipv6 X:X::X:X/M",
6904 SHOW_STR
6905 BGP_STR
6906 "BGP view\n"
6907 "View name\n"
6908 "Address family\n"
6909 "IPv6 prefix <network>/<length>\n")
6910
paul718e3742002-12-13 20:15:29 +00006911/* old command */
6912DEFUN (show_ipv6_mbgp,
6913 show_ipv6_mbgp_cmd,
6914 "show ipv6 mbgp",
6915 SHOW_STR
6916 IP_STR
6917 MBGP_STR)
6918{
ajs5a646652004-11-05 01:25:55 +00006919 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6920 NULL);
paul718e3742002-12-13 20:15:29 +00006921}
6922
6923/* old command */
6924DEFUN (show_ipv6_mbgp_route,
6925 show_ipv6_mbgp_route_cmd,
6926 "show ipv6 mbgp X:X::X:X",
6927 SHOW_STR
6928 IP_STR
6929 MBGP_STR
6930 "Network in the MBGP routing table to display\n")
6931{
6932 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6933}
6934
6935/* old command */
6936DEFUN (show_ipv6_mbgp_prefix,
6937 show_ipv6_mbgp_prefix_cmd,
6938 "show ipv6 mbgp X:X::X:X/M",
6939 SHOW_STR
6940 IP_STR
6941 MBGP_STR
6942 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6943{
6944 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6945}
6946#endif
6947
paul718e3742002-12-13 20:15:29 +00006948
paul94f2b392005-06-28 12:44:16 +00006949static int
paulfd79ac92004-10-13 05:06:08 +00006950bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
paul718e3742002-12-13 20:15:29 +00006951 safi_t safi, enum bgp_show_type type)
6952{
6953 int i;
6954 struct buffer *b;
6955 char *regstr;
6956 int first;
6957 regex_t *regex;
ajs5a646652004-11-05 01:25:55 +00006958 int rc;
paul718e3742002-12-13 20:15:29 +00006959
6960 first = 0;
6961 b = buffer_new (1024);
6962 for (i = 0; i < argc; i++)
6963 {
6964 if (first)
6965 buffer_putc (b, ' ');
6966 else
6967 {
6968 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
6969 continue;
6970 first = 1;
6971 }
6972
6973 buffer_putstr (b, argv[i]);
6974 }
6975 buffer_putc (b, '\0');
6976
6977 regstr = buffer_getstr (b);
6978 buffer_free (b);
6979
6980 regex = bgp_regcomp (regstr);
ajs3b8b1852005-01-29 18:19:13 +00006981 XFREE(MTYPE_TMP, regstr);
paul718e3742002-12-13 20:15:29 +00006982 if (! regex)
6983 {
6984 vty_out (vty, "Can't compile regexp %s%s", argv[0],
6985 VTY_NEWLINE);
6986 return CMD_WARNING;
6987 }
6988
ajs5a646652004-11-05 01:25:55 +00006989 rc = bgp_show (vty, NULL, afi, safi, type, regex);
6990 bgp_regex_free (regex);
6991 return rc;
paul718e3742002-12-13 20:15:29 +00006992}
6993
6994DEFUN (show_ip_bgp_regexp,
6995 show_ip_bgp_regexp_cmd,
6996 "show ip bgp regexp .LINE",
6997 SHOW_STR
6998 IP_STR
6999 BGP_STR
7000 "Display routes matching the AS path regular expression\n"
7001 "A regular-expression to match the BGP AS paths\n")
7002{
7003 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7004 bgp_show_type_regexp);
7005}
7006
7007DEFUN (show_ip_bgp_flap_regexp,
7008 show_ip_bgp_flap_regexp_cmd,
7009 "show ip bgp flap-statistics regexp .LINE",
7010 SHOW_STR
7011 IP_STR
7012 BGP_STR
7013 "Display flap statistics of routes\n"
7014 "Display routes matching the AS path regular expression\n"
7015 "A regular-expression to match the BGP AS paths\n")
7016{
7017 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7018 bgp_show_type_flap_regexp);
7019}
7020
7021DEFUN (show_ip_bgp_ipv4_regexp,
7022 show_ip_bgp_ipv4_regexp_cmd,
7023 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7024 SHOW_STR
7025 IP_STR
7026 BGP_STR
7027 "Address family\n"
7028 "Address Family modifier\n"
7029 "Address Family modifier\n"
7030 "Display routes matching the AS path regular expression\n"
7031 "A regular-expression to match the BGP AS paths\n")
7032{
7033 if (strncmp (argv[0], "m", 1) == 0)
7034 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7035 bgp_show_type_regexp);
7036
7037 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7038 bgp_show_type_regexp);
7039}
7040
7041#ifdef HAVE_IPV6
7042DEFUN (show_bgp_regexp,
7043 show_bgp_regexp_cmd,
7044 "show bgp regexp .LINE",
7045 SHOW_STR
7046 BGP_STR
7047 "Display routes matching the AS path regular expression\n"
7048 "A regular-expression to match the BGP AS paths\n")
7049{
7050 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7051 bgp_show_type_regexp);
7052}
7053
7054ALIAS (show_bgp_regexp,
7055 show_bgp_ipv6_regexp_cmd,
7056 "show bgp ipv6 regexp .LINE",
7057 SHOW_STR
7058 BGP_STR
7059 "Address family\n"
7060 "Display routes matching the AS path regular expression\n"
7061 "A regular-expression to match the BGP AS paths\n")
7062
7063/* old command */
7064DEFUN (show_ipv6_bgp_regexp,
7065 show_ipv6_bgp_regexp_cmd,
7066 "show ipv6 bgp regexp .LINE",
7067 SHOW_STR
7068 IP_STR
7069 BGP_STR
7070 "Display routes matching the AS path regular expression\n"
7071 "A regular-expression to match the BGP AS paths\n")
7072{
7073 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7074 bgp_show_type_regexp);
7075}
7076
7077/* old command */
7078DEFUN (show_ipv6_mbgp_regexp,
7079 show_ipv6_mbgp_regexp_cmd,
7080 "show ipv6 mbgp regexp .LINE",
7081 SHOW_STR
7082 IP_STR
7083 BGP_STR
7084 "Display routes matching the AS path regular expression\n"
7085 "A regular-expression to match the MBGP AS paths\n")
7086{
7087 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7088 bgp_show_type_regexp);
7089}
7090#endif /* HAVE_IPV6 */
7091
paul94f2b392005-06-28 12:44:16 +00007092static int
paulfd79ac92004-10-13 05:06:08 +00007093bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007094 safi_t safi, enum bgp_show_type type)
7095{
7096 struct prefix_list *plist;
7097
7098 plist = prefix_list_lookup (afi, prefix_list_str);
7099 if (plist == NULL)
7100 {
7101 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7102 prefix_list_str, VTY_NEWLINE);
7103 return CMD_WARNING;
7104 }
7105
ajs5a646652004-11-05 01:25:55 +00007106 return bgp_show (vty, NULL, afi, safi, type, plist);
paul718e3742002-12-13 20:15:29 +00007107}
7108
7109DEFUN (show_ip_bgp_prefix_list,
7110 show_ip_bgp_prefix_list_cmd,
7111 "show ip bgp prefix-list WORD",
7112 SHOW_STR
7113 IP_STR
7114 BGP_STR
7115 "Display routes conforming to the prefix-list\n"
7116 "IP prefix-list name\n")
7117{
7118 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7119 bgp_show_type_prefix_list);
7120}
7121
7122DEFUN (show_ip_bgp_flap_prefix_list,
7123 show_ip_bgp_flap_prefix_list_cmd,
7124 "show ip bgp flap-statistics prefix-list WORD",
7125 SHOW_STR
7126 IP_STR
7127 BGP_STR
7128 "Display flap statistics of routes\n"
7129 "Display routes conforming to the prefix-list\n"
7130 "IP prefix-list name\n")
7131{
7132 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7133 bgp_show_type_flap_prefix_list);
7134}
7135
7136DEFUN (show_ip_bgp_ipv4_prefix_list,
7137 show_ip_bgp_ipv4_prefix_list_cmd,
7138 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7139 SHOW_STR
7140 IP_STR
7141 BGP_STR
7142 "Address family\n"
7143 "Address Family modifier\n"
7144 "Address Family modifier\n"
7145 "Display routes conforming to the prefix-list\n"
7146 "IP prefix-list name\n")
7147{
7148 if (strncmp (argv[0], "m", 1) == 0)
7149 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7150 bgp_show_type_prefix_list);
7151
7152 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7153 bgp_show_type_prefix_list);
7154}
7155
7156#ifdef HAVE_IPV6
7157DEFUN (show_bgp_prefix_list,
7158 show_bgp_prefix_list_cmd,
7159 "show bgp prefix-list WORD",
7160 SHOW_STR
7161 BGP_STR
7162 "Display routes conforming to the prefix-list\n"
7163 "IPv6 prefix-list name\n")
7164{
7165 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7166 bgp_show_type_prefix_list);
7167}
7168
7169ALIAS (show_bgp_prefix_list,
7170 show_bgp_ipv6_prefix_list_cmd,
7171 "show bgp ipv6 prefix-list WORD",
7172 SHOW_STR
7173 BGP_STR
7174 "Address family\n"
7175 "Display routes conforming to the prefix-list\n"
7176 "IPv6 prefix-list name\n")
7177
7178/* old command */
7179DEFUN (show_ipv6_bgp_prefix_list,
7180 show_ipv6_bgp_prefix_list_cmd,
7181 "show ipv6 bgp prefix-list WORD",
7182 SHOW_STR
7183 IPV6_STR
7184 BGP_STR
7185 "Display routes matching the prefix-list\n"
7186 "IPv6 prefix-list name\n")
7187{
7188 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7189 bgp_show_type_prefix_list);
7190}
7191
7192/* old command */
7193DEFUN (show_ipv6_mbgp_prefix_list,
7194 show_ipv6_mbgp_prefix_list_cmd,
7195 "show ipv6 mbgp prefix-list WORD",
7196 SHOW_STR
7197 IPV6_STR
7198 MBGP_STR
7199 "Display routes matching the prefix-list\n"
7200 "IPv6 prefix-list name\n")
7201{
7202 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7203 bgp_show_type_prefix_list);
7204}
7205#endif /* HAVE_IPV6 */
7206
paul94f2b392005-06-28 12:44:16 +00007207static int
paulfd79ac92004-10-13 05:06:08 +00007208bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007209 safi_t safi, enum bgp_show_type type)
7210{
7211 struct as_list *as_list;
7212
7213 as_list = as_list_lookup (filter);
7214 if (as_list == NULL)
7215 {
7216 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7217 return CMD_WARNING;
7218 }
7219
ajs5a646652004-11-05 01:25:55 +00007220 return bgp_show (vty, NULL, afi, safi, type, as_list);
paul718e3742002-12-13 20:15:29 +00007221}
7222
7223DEFUN (show_ip_bgp_filter_list,
7224 show_ip_bgp_filter_list_cmd,
7225 "show ip bgp filter-list WORD",
7226 SHOW_STR
7227 IP_STR
7228 BGP_STR
7229 "Display routes conforming to the filter-list\n"
7230 "Regular expression access list name\n")
7231{
7232 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7233 bgp_show_type_filter_list);
7234}
7235
7236DEFUN (show_ip_bgp_flap_filter_list,
7237 show_ip_bgp_flap_filter_list_cmd,
7238 "show ip bgp flap-statistics filter-list WORD",
7239 SHOW_STR
7240 IP_STR
7241 BGP_STR
7242 "Display flap statistics of routes\n"
7243 "Display routes conforming to the filter-list\n"
7244 "Regular expression access list name\n")
7245{
7246 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7247 bgp_show_type_flap_filter_list);
7248}
7249
7250DEFUN (show_ip_bgp_ipv4_filter_list,
7251 show_ip_bgp_ipv4_filter_list_cmd,
7252 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7253 SHOW_STR
7254 IP_STR
7255 BGP_STR
7256 "Address family\n"
7257 "Address Family modifier\n"
7258 "Address Family modifier\n"
7259 "Display routes conforming to the filter-list\n"
7260 "Regular expression access list name\n")
7261{
7262 if (strncmp (argv[0], "m", 1) == 0)
7263 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7264 bgp_show_type_filter_list);
7265
7266 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7267 bgp_show_type_filter_list);
7268}
7269
7270#ifdef HAVE_IPV6
7271DEFUN (show_bgp_filter_list,
7272 show_bgp_filter_list_cmd,
7273 "show bgp filter-list WORD",
7274 SHOW_STR
7275 BGP_STR
7276 "Display routes conforming to the filter-list\n"
7277 "Regular expression access list name\n")
7278{
7279 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7280 bgp_show_type_filter_list);
7281}
7282
7283ALIAS (show_bgp_filter_list,
7284 show_bgp_ipv6_filter_list_cmd,
7285 "show bgp ipv6 filter-list WORD",
7286 SHOW_STR
7287 BGP_STR
7288 "Address family\n"
7289 "Display routes conforming to the filter-list\n"
7290 "Regular expression access list name\n")
7291
7292/* old command */
7293DEFUN (show_ipv6_bgp_filter_list,
7294 show_ipv6_bgp_filter_list_cmd,
7295 "show ipv6 bgp filter-list WORD",
7296 SHOW_STR
7297 IPV6_STR
7298 BGP_STR
7299 "Display routes conforming to the filter-list\n"
7300 "Regular expression access list name\n")
7301{
7302 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7303 bgp_show_type_filter_list);
7304}
7305
7306/* old command */
7307DEFUN (show_ipv6_mbgp_filter_list,
7308 show_ipv6_mbgp_filter_list_cmd,
7309 "show ipv6 mbgp filter-list WORD",
7310 SHOW_STR
7311 IPV6_STR
7312 MBGP_STR
7313 "Display routes conforming to the filter-list\n"
7314 "Regular expression access list name\n")
7315{
7316 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7317 bgp_show_type_filter_list);
7318}
7319#endif /* HAVE_IPV6 */
7320
paul94f2b392005-06-28 12:44:16 +00007321static int
paulfd79ac92004-10-13 05:06:08 +00007322bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007323 safi_t safi, enum bgp_show_type type)
7324{
7325 struct route_map *rmap;
7326
7327 rmap = route_map_lookup_by_name (rmap_str);
7328 if (! rmap)
7329 {
7330 vty_out (vty, "%% %s is not a valid route-map name%s",
7331 rmap_str, VTY_NEWLINE);
7332 return CMD_WARNING;
7333 }
7334
ajs5a646652004-11-05 01:25:55 +00007335 return bgp_show (vty, NULL, afi, safi, type, rmap);
paul718e3742002-12-13 20:15:29 +00007336}
7337
7338DEFUN (show_ip_bgp_route_map,
7339 show_ip_bgp_route_map_cmd,
7340 "show ip bgp route-map WORD",
7341 SHOW_STR
7342 IP_STR
7343 BGP_STR
7344 "Display routes matching the route-map\n"
7345 "A route-map to match on\n")
7346{
7347 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7348 bgp_show_type_route_map);
7349}
7350
7351DEFUN (show_ip_bgp_flap_route_map,
7352 show_ip_bgp_flap_route_map_cmd,
7353 "show ip bgp flap-statistics route-map WORD",
7354 SHOW_STR
7355 IP_STR
7356 BGP_STR
7357 "Display flap statistics of routes\n"
7358 "Display routes matching the route-map\n"
7359 "A route-map to match on\n")
7360{
7361 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7362 bgp_show_type_flap_route_map);
7363}
7364
7365DEFUN (show_ip_bgp_ipv4_route_map,
7366 show_ip_bgp_ipv4_route_map_cmd,
7367 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7368 SHOW_STR
7369 IP_STR
7370 BGP_STR
7371 "Address family\n"
7372 "Address Family modifier\n"
7373 "Address Family modifier\n"
7374 "Display routes matching the route-map\n"
7375 "A route-map to match on\n")
7376{
7377 if (strncmp (argv[0], "m", 1) == 0)
7378 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7379 bgp_show_type_route_map);
7380
7381 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7382 bgp_show_type_route_map);
7383}
7384
7385DEFUN (show_bgp_route_map,
7386 show_bgp_route_map_cmd,
7387 "show bgp route-map WORD",
7388 SHOW_STR
7389 BGP_STR
7390 "Display routes matching the route-map\n"
7391 "A route-map to match on\n")
7392{
7393 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7394 bgp_show_type_route_map);
7395}
7396
7397ALIAS (show_bgp_route_map,
7398 show_bgp_ipv6_route_map_cmd,
7399 "show bgp ipv6 route-map WORD",
7400 SHOW_STR
7401 BGP_STR
7402 "Address family\n"
7403 "Display routes matching the route-map\n"
7404 "A route-map to match on\n")
7405
7406DEFUN (show_ip_bgp_cidr_only,
7407 show_ip_bgp_cidr_only_cmd,
7408 "show ip bgp cidr-only",
7409 SHOW_STR
7410 IP_STR
7411 BGP_STR
7412 "Display only routes with non-natural netmasks\n")
7413{
7414 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007415 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007416}
7417
7418DEFUN (show_ip_bgp_flap_cidr_only,
7419 show_ip_bgp_flap_cidr_only_cmd,
7420 "show ip bgp flap-statistics cidr-only",
7421 SHOW_STR
7422 IP_STR
7423 BGP_STR
7424 "Display flap statistics of routes\n"
7425 "Display only routes with non-natural netmasks\n")
7426{
7427 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007428 bgp_show_type_flap_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007429}
7430
7431DEFUN (show_ip_bgp_ipv4_cidr_only,
7432 show_ip_bgp_ipv4_cidr_only_cmd,
7433 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7434 SHOW_STR
7435 IP_STR
7436 BGP_STR
7437 "Address family\n"
7438 "Address Family modifier\n"
7439 "Address Family modifier\n"
7440 "Display only routes with non-natural netmasks\n")
7441{
7442 if (strncmp (argv[0], "m", 1) == 0)
7443 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007444 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007445
7446 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007447 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007448}
7449
7450DEFUN (show_ip_bgp_community_all,
7451 show_ip_bgp_community_all_cmd,
7452 "show ip bgp community",
7453 SHOW_STR
7454 IP_STR
7455 BGP_STR
7456 "Display routes matching the communities\n")
7457{
7458 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007459 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007460}
7461
7462DEFUN (show_ip_bgp_ipv4_community_all,
7463 show_ip_bgp_ipv4_community_all_cmd,
7464 "show ip bgp ipv4 (unicast|multicast) community",
7465 SHOW_STR
7466 IP_STR
7467 BGP_STR
7468 "Address family\n"
7469 "Address Family modifier\n"
7470 "Address Family modifier\n"
7471 "Display routes matching the communities\n")
7472{
7473 if (strncmp (argv[0], "m", 1) == 0)
7474 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007475 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007476
7477 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007478 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007479}
7480
7481#ifdef HAVE_IPV6
7482DEFUN (show_bgp_community_all,
7483 show_bgp_community_all_cmd,
7484 "show bgp community",
7485 SHOW_STR
7486 BGP_STR
7487 "Display routes matching the communities\n")
7488{
7489 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007490 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007491}
7492
7493ALIAS (show_bgp_community_all,
7494 show_bgp_ipv6_community_all_cmd,
7495 "show bgp ipv6 community",
7496 SHOW_STR
7497 BGP_STR
7498 "Address family\n"
7499 "Display routes matching the communities\n")
7500
7501/* old command */
7502DEFUN (show_ipv6_bgp_community_all,
7503 show_ipv6_bgp_community_all_cmd,
7504 "show ipv6 bgp community",
7505 SHOW_STR
7506 IPV6_STR
7507 BGP_STR
7508 "Display routes matching the communities\n")
7509{
7510 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007511 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007512}
7513
7514/* old command */
7515DEFUN (show_ipv6_mbgp_community_all,
7516 show_ipv6_mbgp_community_all_cmd,
7517 "show ipv6 mbgp community",
7518 SHOW_STR
7519 IPV6_STR
7520 MBGP_STR
7521 "Display routes matching the communities\n")
7522{
7523 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007524 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007525}
7526#endif /* HAVE_IPV6 */
7527
paul94f2b392005-06-28 12:44:16 +00007528static int
Michael Lambert95cbbd22010-07-23 14:43:04 -04007529bgp_show_community (struct vty *vty, const char *view_name, int argc,
7530 const char **argv, int exact, afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00007531{
7532 struct community *com;
7533 struct buffer *b;
Michael Lambert95cbbd22010-07-23 14:43:04 -04007534 struct bgp *bgp;
paul718e3742002-12-13 20:15:29 +00007535 int i;
7536 char *str;
7537 int first = 0;
7538
Michael Lambert95cbbd22010-07-23 14:43:04 -04007539 /* BGP structure lookup */
7540 if (view_name)
7541 {
7542 bgp = bgp_lookup_by_name (view_name);
7543 if (bgp == NULL)
7544 {
7545 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
7546 return CMD_WARNING;
7547 }
7548 }
7549 else
7550 {
7551 bgp = bgp_get_default ();
7552 if (bgp == NULL)
7553 {
7554 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
7555 return CMD_WARNING;
7556 }
7557 }
7558
paul718e3742002-12-13 20:15:29 +00007559 b = buffer_new (1024);
7560 for (i = 0; i < argc; i++)
7561 {
7562 if (first)
7563 buffer_putc (b, ' ');
7564 else
7565 {
7566 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7567 continue;
7568 first = 1;
7569 }
7570
7571 buffer_putstr (b, argv[i]);
7572 }
7573 buffer_putc (b, '\0');
7574
7575 str = buffer_getstr (b);
7576 buffer_free (b);
7577
7578 com = community_str2com (str);
ajs3b8b1852005-01-29 18:19:13 +00007579 XFREE (MTYPE_TMP, str);
paul718e3742002-12-13 20:15:29 +00007580 if (! com)
7581 {
7582 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7583 return CMD_WARNING;
7584 }
7585
Michael Lambert95cbbd22010-07-23 14:43:04 -04007586 return bgp_show (vty, bgp, afi, safi,
ajs5a646652004-11-05 01:25:55 +00007587 (exact ? bgp_show_type_community_exact :
7588 bgp_show_type_community), com);
paul718e3742002-12-13 20:15:29 +00007589}
7590
7591DEFUN (show_ip_bgp_community,
7592 show_ip_bgp_community_cmd,
7593 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7594 SHOW_STR
7595 IP_STR
7596 BGP_STR
7597 "Display routes matching the communities\n"
7598 "community number\n"
7599 "Do not send outside local AS (well-known community)\n"
7600 "Do not advertise to any peer (well-known community)\n"
7601 "Do not export to next AS (well-known community)\n")
7602{
Michael Lambert95cbbd22010-07-23 14:43:04 -04007603 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007604}
7605
7606ALIAS (show_ip_bgp_community,
7607 show_ip_bgp_community2_cmd,
7608 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7609 SHOW_STR
7610 IP_STR
7611 BGP_STR
7612 "Display routes matching the communities\n"
7613 "community number\n"
7614 "Do not send outside local AS (well-known community)\n"
7615 "Do not advertise to any peer (well-known community)\n"
7616 "Do not export to next AS (well-known community)\n"
7617 "community number\n"
7618 "Do not send outside local AS (well-known community)\n"
7619 "Do not advertise to any peer (well-known community)\n"
7620 "Do not export to next AS (well-known community)\n")
7621
7622ALIAS (show_ip_bgp_community,
7623 show_ip_bgp_community3_cmd,
7624 "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)",
7625 SHOW_STR
7626 IP_STR
7627 BGP_STR
7628 "Display routes matching the communities\n"
7629 "community number\n"
7630 "Do not send outside local AS (well-known community)\n"
7631 "Do not advertise to any peer (well-known community)\n"
7632 "Do not export to next AS (well-known community)\n"
7633 "community number\n"
7634 "Do not send outside local AS (well-known community)\n"
7635 "Do not advertise to any peer (well-known community)\n"
7636 "Do not export to next AS (well-known community)\n"
7637 "community number\n"
7638 "Do not send outside local AS (well-known community)\n"
7639 "Do not advertise to any peer (well-known community)\n"
7640 "Do not export to next AS (well-known community)\n")
7641
7642ALIAS (show_ip_bgp_community,
7643 show_ip_bgp_community4_cmd,
7644 "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)",
7645 SHOW_STR
7646 IP_STR
7647 BGP_STR
7648 "Display routes matching the communities\n"
7649 "community number\n"
7650 "Do not send outside local AS (well-known community)\n"
7651 "Do not advertise to any peer (well-known community)\n"
7652 "Do not export to next AS (well-known community)\n"
7653 "community number\n"
7654 "Do not send outside local AS (well-known community)\n"
7655 "Do not advertise to any peer (well-known community)\n"
7656 "Do not export to next AS (well-known community)\n"
7657 "community number\n"
7658 "Do not send outside local AS (well-known community)\n"
7659 "Do not advertise to any peer (well-known community)\n"
7660 "Do not export to next AS (well-known community)\n"
7661 "community number\n"
7662 "Do not send outside local AS (well-known community)\n"
7663 "Do not advertise to any peer (well-known community)\n"
7664 "Do not export to next AS (well-known community)\n")
7665
7666DEFUN (show_ip_bgp_ipv4_community,
7667 show_ip_bgp_ipv4_community_cmd,
7668 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7669 SHOW_STR
7670 IP_STR
7671 BGP_STR
7672 "Address family\n"
7673 "Address Family modifier\n"
7674 "Address Family modifier\n"
7675 "Display routes matching the communities\n"
7676 "community number\n"
7677 "Do not send outside local AS (well-known community)\n"
7678 "Do not advertise to any peer (well-known community)\n"
7679 "Do not export to next AS (well-known community)\n")
7680{
7681 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04007682 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00007683
Michael Lambert95cbbd22010-07-23 14:43:04 -04007684 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007685}
7686
7687ALIAS (show_ip_bgp_ipv4_community,
7688 show_ip_bgp_ipv4_community2_cmd,
7689 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7690 SHOW_STR
7691 IP_STR
7692 BGP_STR
7693 "Address family\n"
7694 "Address Family modifier\n"
7695 "Address Family modifier\n"
7696 "Display routes matching the communities\n"
7697 "community number\n"
7698 "Do not send outside local AS (well-known community)\n"
7699 "Do not advertise to any peer (well-known community)\n"
7700 "Do not export to next AS (well-known community)\n"
7701 "community number\n"
7702 "Do not send outside local AS (well-known community)\n"
7703 "Do not advertise to any peer (well-known community)\n"
7704 "Do not export to next AS (well-known community)\n")
7705
7706ALIAS (show_ip_bgp_ipv4_community,
7707 show_ip_bgp_ipv4_community3_cmd,
7708 "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)",
7709 SHOW_STR
7710 IP_STR
7711 BGP_STR
7712 "Address family\n"
7713 "Address Family modifier\n"
7714 "Address Family modifier\n"
7715 "Display routes matching the communities\n"
7716 "community number\n"
7717 "Do not send outside local AS (well-known community)\n"
7718 "Do not advertise to any peer (well-known community)\n"
7719 "Do not export to next AS (well-known community)\n"
7720 "community number\n"
7721 "Do not send outside local AS (well-known community)\n"
7722 "Do not advertise to any peer (well-known community)\n"
7723 "Do not export to next AS (well-known community)\n"
7724 "community number\n"
7725 "Do not send outside local AS (well-known community)\n"
7726 "Do not advertise to any peer (well-known community)\n"
7727 "Do not export to next AS (well-known community)\n")
7728
7729ALIAS (show_ip_bgp_ipv4_community,
7730 show_ip_bgp_ipv4_community4_cmd,
7731 "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)",
7732 SHOW_STR
7733 IP_STR
7734 BGP_STR
7735 "Address family\n"
7736 "Address Family modifier\n"
7737 "Address Family modifier\n"
7738 "Display routes matching the communities\n"
7739 "community number\n"
7740 "Do not send outside local AS (well-known community)\n"
7741 "Do not advertise to any peer (well-known community)\n"
7742 "Do not export to next AS (well-known community)\n"
7743 "community number\n"
7744 "Do not send outside local AS (well-known community)\n"
7745 "Do not advertise to any peer (well-known community)\n"
7746 "Do not export to next AS (well-known community)\n"
7747 "community number\n"
7748 "Do not send outside local AS (well-known community)\n"
7749 "Do not advertise to any peer (well-known community)\n"
7750 "Do not export to next AS (well-known community)\n"
7751 "community number\n"
7752 "Do not send outside local AS (well-known community)\n"
7753 "Do not advertise to any peer (well-known community)\n"
7754 "Do not export to next AS (well-known community)\n")
7755
Michael Lambert95cbbd22010-07-23 14:43:04 -04007756DEFUN (show_bgp_view_afi_safi_community_all,
7757 show_bgp_view_afi_safi_community_all_cmd,
7758#ifdef HAVE_IPV6
7759 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
7760#else
7761 "show bgp view WORD ipv4 (unicast|multicast) community",
7762#endif
7763 SHOW_STR
7764 BGP_STR
7765 "BGP view\n"
7766 "BGP view name\n"
7767 "Address family\n"
7768#ifdef HAVE_IPV6
7769 "Address family\n"
7770#endif
7771 "Address Family modifier\n"
7772 "Address Family modifier\n"
7773 "Display routes containing communities\n")
7774{
7775 int afi;
7776 int safi;
7777 struct bgp *bgp;
7778
7779 /* BGP structure lookup. */
7780 bgp = bgp_lookup_by_name (argv[0]);
7781 if (bgp == NULL)
7782 {
7783 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7784 return CMD_WARNING;
7785 }
7786
7787#ifdef HAVE_IPV6
7788 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7789 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7790#else
7791 afi = AFI_IP;
7792 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7793#endif
7794 return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
7795}
7796
7797DEFUN (show_bgp_view_afi_safi_community,
7798 show_bgp_view_afi_safi_community_cmd,
7799#ifdef HAVE_IPV6
7800 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7801#else
7802 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7803#endif
7804 SHOW_STR
7805 BGP_STR
7806 "BGP view\n"
7807 "BGP view name\n"
7808 "Address family\n"
7809#ifdef HAVE_IPV6
7810 "Address family\n"
7811#endif
7812 "Address family modifier\n"
7813 "Address family modifier\n"
7814 "Display routes matching the communities\n"
7815 "community number\n"
7816 "Do not send outside local AS (well-known community)\n"
7817 "Do not advertise to any peer (well-known community)\n"
7818 "Do not export to next AS (well-known community)\n")
7819{
7820 int afi;
7821 int safi;
7822
7823#ifdef HAVE_IPV6
7824 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7825 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7826 return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
7827#else
7828 afi = AFI_IP;
7829 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7830 return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
7831#endif
7832}
7833
7834ALIAS (show_bgp_view_afi_safi_community,
7835 show_bgp_view_afi_safi_community2_cmd,
7836#ifdef HAVE_IPV6
7837 "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)",
7838#else
7839 "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7840#endif
7841 SHOW_STR
7842 BGP_STR
7843 "BGP view\n"
7844 "BGP view name\n"
7845 "Address family\n"
7846#ifdef HAVE_IPV6
7847 "Address family\n"
7848#endif
7849 "Address family modifier\n"
7850 "Address family modifier\n"
7851 "Display routes matching the communities\n"
7852 "community number\n"
7853 "Do not send outside local AS (well-known community)\n"
7854 "Do not advertise to any peer (well-known community)\n"
7855 "Do not export to next AS (well-known community)\n"
7856 "community number\n"
7857 "Do not send outside local AS (well-known community)\n"
7858 "Do not advertise to any peer (well-known community)\n"
7859 "Do not export to next AS (well-known community)\n")
7860
7861ALIAS (show_bgp_view_afi_safi_community,
7862 show_bgp_view_afi_safi_community3_cmd,
7863#ifdef HAVE_IPV6
7864 "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)",
7865#else
7866 "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)",
7867#endif
7868 SHOW_STR
7869 BGP_STR
7870 "BGP view\n"
7871 "BGP view name\n"
7872 "Address family\n"
7873#ifdef HAVE_IPV6
7874 "Address family\n"
7875#endif
7876 "Address family modifier\n"
7877 "Address family modifier\n"
7878 "Display routes matching the communities\n"
7879 "community number\n"
7880 "Do not send outside local AS (well-known community)\n"
7881 "Do not advertise to any peer (well-known community)\n"
7882 "Do not export to next AS (well-known community)\n"
7883 "community number\n"
7884 "Do not send outside local AS (well-known community)\n"
7885 "Do not advertise to any peer (well-known community)\n"
7886 "Do not export to next AS (well-known community)\n"
7887 "community number\n"
7888 "Do not send outside local AS (well-known community)\n"
7889 "Do not advertise to any peer (well-known community)\n"
7890 "Do not export to next AS (well-known community)\n")
7891
7892ALIAS (show_bgp_view_afi_safi_community,
7893 show_bgp_view_afi_safi_community4_cmd,
7894#ifdef HAVE_IPV6
7895 "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)",
7896#else
7897 "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)",
7898#endif
7899 SHOW_STR
7900 BGP_STR
7901 "BGP view\n"
7902 "BGP view name\n"
7903 "Address family\n"
7904#ifdef HAVE_IPV6
7905 "Address family\n"
7906#endif
7907 "Address family modifier\n"
7908 "Address family modifier\n"
7909 "Display routes matching the communities\n"
7910 "community number\n"
7911 "Do not send outside local AS (well-known community)\n"
7912 "Do not advertise to any peer (well-known community)\n"
7913 "Do not export to next AS (well-known community)\n"
7914 "community number\n"
7915 "Do not send outside local AS (well-known community)\n"
7916 "Do not advertise to any peer (well-known community)\n"
7917 "Do not export to next AS (well-known community)\n"
7918 "community number\n"
7919 "Do not send outside local AS (well-known community)\n"
7920 "Do not advertise to any peer (well-known community)\n"
7921 "Do not export to next AS (well-known community)\n"
7922 "community number\n"
7923 "Do not send outside local AS (well-known community)\n"
7924 "Do not advertise to any peer (well-known community)\n"
7925 "Do not export to next AS (well-known community)\n")
7926
paul718e3742002-12-13 20:15:29 +00007927DEFUN (show_ip_bgp_community_exact,
7928 show_ip_bgp_community_exact_cmd,
7929 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7930 SHOW_STR
7931 IP_STR
7932 BGP_STR
7933 "Display routes matching the communities\n"
7934 "community number\n"
7935 "Do not send outside local AS (well-known community)\n"
7936 "Do not advertise to any peer (well-known community)\n"
7937 "Do not export to next AS (well-known community)\n"
7938 "Exact match of the communities")
7939{
Michael Lambert95cbbd22010-07-23 14:43:04 -04007940 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00007941}
7942
7943ALIAS (show_ip_bgp_community_exact,
7944 show_ip_bgp_community2_exact_cmd,
7945 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7946 SHOW_STR
7947 IP_STR
7948 BGP_STR
7949 "Display routes matching the communities\n"
7950 "community number\n"
7951 "Do not send outside local AS (well-known community)\n"
7952 "Do not advertise to any peer (well-known community)\n"
7953 "Do not export to next AS (well-known community)\n"
7954 "community number\n"
7955 "Do not send outside local AS (well-known community)\n"
7956 "Do not advertise to any peer (well-known community)\n"
7957 "Do not export to next AS (well-known community)\n"
7958 "Exact match of the communities")
7959
7960ALIAS (show_ip_bgp_community_exact,
7961 show_ip_bgp_community3_exact_cmd,
7962 "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",
7963 SHOW_STR
7964 IP_STR
7965 BGP_STR
7966 "Display routes matching the communities\n"
7967 "community number\n"
7968 "Do not send outside local AS (well-known community)\n"
7969 "Do not advertise to any peer (well-known community)\n"
7970 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
7980
7981ALIAS (show_ip_bgp_community_exact,
7982 show_ip_bgp_community4_exact_cmd,
7983 "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",
7984 SHOW_STR
7985 IP_STR
7986 BGP_STR
7987 "Display routes matching the communities\n"
7988 "community number\n"
7989 "Do not send outside local AS (well-known community)\n"
7990 "Do not advertise to any peer (well-known community)\n"
7991 "Do not export to next AS (well-known community)\n"
7992 "community number\n"
7993 "Do not send outside local AS (well-known community)\n"
7994 "Do not advertise to any peer (well-known community)\n"
7995 "Do not export to next AS (well-known community)\n"
7996 "community number\n"
7997 "Do not send outside local AS (well-known community)\n"
7998 "Do not advertise to any peer (well-known community)\n"
7999 "Do not export to next AS (well-known community)\n"
8000 "community number\n"
8001 "Do not send outside local AS (well-known community)\n"
8002 "Do not advertise to any peer (well-known community)\n"
8003 "Do not export to next AS (well-known community)\n"
8004 "Exact match of the communities")
8005
8006DEFUN (show_ip_bgp_ipv4_community_exact,
8007 show_ip_bgp_ipv4_community_exact_cmd,
8008 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8009 SHOW_STR
8010 IP_STR
8011 BGP_STR
8012 "Address family\n"
8013 "Address Family modifier\n"
8014 "Address Family modifier\n"
8015 "Display routes matching the communities\n"
8016 "community number\n"
8017 "Do not send outside local AS (well-known community)\n"
8018 "Do not advertise to any peer (well-known community)\n"
8019 "Do not export to next AS (well-known community)\n"
8020 "Exact match of the communities")
8021{
8022 if (strncmp (argv[0], "m", 1) == 0)
Michael Lambert95cbbd22010-07-23 14:43:04 -04008023 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008024
Michael Lambert95cbbd22010-07-23 14:43:04 -04008025 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008026}
8027
8028ALIAS (show_ip_bgp_ipv4_community_exact,
8029 show_ip_bgp_ipv4_community2_exact_cmd,
8030 "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",
8031 SHOW_STR
8032 IP_STR
8033 BGP_STR
8034 "Address family\n"
8035 "Address Family modifier\n"
8036 "Address Family modifier\n"
8037 "Display routes matching the communities\n"
8038 "community number\n"
8039 "Do not send outside local AS (well-known community)\n"
8040 "Do not advertise to any peer (well-known community)\n"
8041 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
8047
8048ALIAS (show_ip_bgp_ipv4_community_exact,
8049 show_ip_bgp_ipv4_community3_exact_cmd,
8050 "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",
8051 SHOW_STR
8052 IP_STR
8053 BGP_STR
8054 "Address family\n"
8055 "Address Family modifier\n"
8056 "Address Family modifier\n"
8057 "Display routes matching the communities\n"
8058 "community number\n"
8059 "Do not send outside local AS (well-known community)\n"
8060 "Do not advertise to any peer (well-known community)\n"
8061 "Do not export to next AS (well-known community)\n"
8062 "community number\n"
8063 "Do not send outside local AS (well-known community)\n"
8064 "Do not advertise to any peer (well-known community)\n"
8065 "Do not export to next AS (well-known community)\n"
8066 "community number\n"
8067 "Do not send outside local AS (well-known community)\n"
8068 "Do not advertise to any peer (well-known community)\n"
8069 "Do not export to next AS (well-known community)\n"
8070 "Exact match of the communities")
8071
8072ALIAS (show_ip_bgp_ipv4_community_exact,
8073 show_ip_bgp_ipv4_community4_exact_cmd,
8074 "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",
8075 SHOW_STR
8076 IP_STR
8077 BGP_STR
8078 "Address family\n"
8079 "Address Family modifier\n"
8080 "Address Family modifier\n"
8081 "Display routes matching the communities\n"
8082 "community number\n"
8083 "Do not send outside local AS (well-known community)\n"
8084 "Do not advertise to any peer (well-known community)\n"
8085 "Do not export to next AS (well-known community)\n"
8086 "community number\n"
8087 "Do not send outside local AS (well-known community)\n"
8088 "Do not advertise to any peer (well-known community)\n"
8089 "Do not export to next AS (well-known community)\n"
8090 "community number\n"
8091 "Do not send outside local AS (well-known community)\n"
8092 "Do not advertise to any peer (well-known community)\n"
8093 "Do not export to next AS (well-known community)\n"
8094 "community number\n"
8095 "Do not send outside local AS (well-known community)\n"
8096 "Do not advertise to any peer (well-known community)\n"
8097 "Do not export to next AS (well-known community)\n"
8098 "Exact match of the communities")
8099
8100#ifdef HAVE_IPV6
8101DEFUN (show_bgp_community,
8102 show_bgp_community_cmd,
8103 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
8104 SHOW_STR
8105 BGP_STR
8106 "Display routes matching the communities\n"
8107 "community number\n"
8108 "Do not send outside local AS (well-known community)\n"
8109 "Do not advertise to any peer (well-known community)\n"
8110 "Do not export to next AS (well-known community)\n")
8111{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008112 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008113}
8114
8115ALIAS (show_bgp_community,
8116 show_bgp_ipv6_community_cmd,
8117 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
8118 SHOW_STR
8119 BGP_STR
8120 "Address family\n"
8121 "Display routes matching the communities\n"
8122 "community number\n"
8123 "Do not send outside local AS (well-known community)\n"
8124 "Do not advertise to any peer (well-known community)\n"
8125 "Do not export to next AS (well-known community)\n")
8126
8127ALIAS (show_bgp_community,
8128 show_bgp_community2_cmd,
8129 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8130 SHOW_STR
8131 BGP_STR
8132 "Display routes matching the communities\n"
8133 "community number\n"
8134 "Do not send outside local AS (well-known community)\n"
8135 "Do not advertise to any peer (well-known community)\n"
8136 "Do not export to next AS (well-known community)\n"
8137 "community number\n"
8138 "Do not send outside local AS (well-known community)\n"
8139 "Do not advertise to any peer (well-known community)\n"
8140 "Do not export to next AS (well-known community)\n")
8141
8142ALIAS (show_bgp_community,
8143 show_bgp_ipv6_community2_cmd,
8144 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8145 SHOW_STR
8146 BGP_STR
8147 "Address family\n"
8148 "Display routes matching the communities\n"
8149 "community number\n"
8150 "Do not send outside local AS (well-known community)\n"
8151 "Do not advertise to any peer (well-known community)\n"
8152 "Do not export to next AS (well-known community)\n"
8153 "community number\n"
8154 "Do not send outside local AS (well-known community)\n"
8155 "Do not advertise to any peer (well-known community)\n"
8156 "Do not export to next AS (well-known community)\n")
8157
8158ALIAS (show_bgp_community,
8159 show_bgp_community3_cmd,
8160 "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)",
8161 SHOW_STR
8162 BGP_STR
8163 "Display routes matching the communities\n"
8164 "community number\n"
8165 "Do not send outside local AS (well-known community)\n"
8166 "Do not advertise to any peer (well-known community)\n"
8167 "Do not export to next AS (well-known community)\n"
8168 "community number\n"
8169 "Do not send outside local AS (well-known community)\n"
8170 "Do not advertise to any peer (well-known community)\n"
8171 "Do not export to next AS (well-known community)\n"
8172 "community number\n"
8173 "Do not send outside local AS (well-known community)\n"
8174 "Do not advertise to any peer (well-known community)\n"
8175 "Do not export to next AS (well-known community)\n")
8176
8177ALIAS (show_bgp_community,
8178 show_bgp_ipv6_community3_cmd,
8179 "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)",
8180 SHOW_STR
8181 BGP_STR
8182 "Address family\n"
8183 "Display routes matching the communities\n"
8184 "community number\n"
8185 "Do not send outside local AS (well-known community)\n"
8186 "Do not advertise to any peer (well-known community)\n"
8187 "Do not export to next AS (well-known community)\n"
8188 "community number\n"
8189 "Do not send outside local AS (well-known community)\n"
8190 "Do not advertise to any peer (well-known community)\n"
8191 "Do not export to next AS (well-known community)\n"
8192 "community number\n"
8193 "Do not send outside local AS (well-known community)\n"
8194 "Do not advertise to any peer (well-known community)\n"
8195 "Do not export to next AS (well-known community)\n")
8196
8197ALIAS (show_bgp_community,
8198 show_bgp_community4_cmd,
8199 "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)",
8200 SHOW_STR
8201 BGP_STR
8202 "Display routes matching the communities\n"
8203 "community number\n"
8204 "Do not send outside local AS (well-known community)\n"
8205 "Do not advertise to any peer (well-known community)\n"
8206 "Do not export to next AS (well-known community)\n"
8207 "community number\n"
8208 "Do not send outside local AS (well-known community)\n"
8209 "Do not advertise to any peer (well-known community)\n"
8210 "Do not export to next AS (well-known community)\n"
8211 "community number\n"
8212 "Do not send outside local AS (well-known community)\n"
8213 "Do not advertise to any peer (well-known community)\n"
8214 "Do not export to next AS (well-known community)\n"
8215 "community number\n"
8216 "Do not send outside local AS (well-known community)\n"
8217 "Do not advertise to any peer (well-known community)\n"
8218 "Do not export to next AS (well-known community)\n")
8219
8220ALIAS (show_bgp_community,
8221 show_bgp_ipv6_community4_cmd,
8222 "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)",
8223 SHOW_STR
8224 BGP_STR
8225 "Address family\n"
8226 "Display routes matching the communities\n"
8227 "community number\n"
8228 "Do not send outside local AS (well-known community)\n"
8229 "Do not advertise to any peer (well-known community)\n"
8230 "Do not export to next AS (well-known community)\n"
8231 "community number\n"
8232 "Do not send outside local AS (well-known community)\n"
8233 "Do not advertise to any peer (well-known community)\n"
8234 "Do not export to next AS (well-known community)\n"
8235 "community number\n"
8236 "Do not send outside local AS (well-known community)\n"
8237 "Do not advertise to any peer (well-known community)\n"
8238 "Do not export to next AS (well-known community)\n"
8239 "community number\n"
8240 "Do not send outside local AS (well-known community)\n"
8241 "Do not advertise to any peer (well-known community)\n"
8242 "Do not export to next AS (well-known community)\n")
8243
8244/* old command */
8245DEFUN (show_ipv6_bgp_community,
8246 show_ipv6_bgp_community_cmd,
8247 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8248 SHOW_STR
8249 IPV6_STR
8250 BGP_STR
8251 "Display routes matching the communities\n"
8252 "community number\n"
8253 "Do not send outside local AS (well-known community)\n"
8254 "Do not advertise to any peer (well-known community)\n"
8255 "Do not export to next AS (well-known community)\n")
8256{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008257 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008258}
8259
8260/* old command */
8261ALIAS (show_ipv6_bgp_community,
8262 show_ipv6_bgp_community2_cmd,
8263 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8264 SHOW_STR
8265 IPV6_STR
8266 BGP_STR
8267 "Display routes matching the communities\n"
8268 "community number\n"
8269 "Do not send outside local AS (well-known community)\n"
8270 "Do not advertise to any peer (well-known community)\n"
8271 "Do not export to next AS (well-known community)\n"
8272 "community number\n"
8273 "Do not send outside local AS (well-known community)\n"
8274 "Do not advertise to any peer (well-known community)\n"
8275 "Do not export to next AS (well-known community)\n")
8276
8277/* old command */
8278ALIAS (show_ipv6_bgp_community,
8279 show_ipv6_bgp_community3_cmd,
8280 "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)",
8281 SHOW_STR
8282 IPV6_STR
8283 BGP_STR
8284 "Display routes matching the communities\n"
8285 "community number\n"
8286 "Do not send outside local AS (well-known community)\n"
8287 "Do not advertise to any peer (well-known community)\n"
8288 "Do not export to next AS (well-known community)\n"
8289 "community number\n"
8290 "Do not send outside local AS (well-known community)\n"
8291 "Do not advertise to any peer (well-known community)\n"
8292 "Do not export to next AS (well-known community)\n"
8293 "community number\n"
8294 "Do not send outside local AS (well-known community)\n"
8295 "Do not advertise to any peer (well-known community)\n"
8296 "Do not export to next AS (well-known community)\n")
8297
8298/* old command */
8299ALIAS (show_ipv6_bgp_community,
8300 show_ipv6_bgp_community4_cmd,
8301 "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)",
8302 SHOW_STR
8303 IPV6_STR
8304 BGP_STR
8305 "Display routes matching the communities\n"
8306 "community number\n"
8307 "Do not send outside local AS (well-known community)\n"
8308 "Do not advertise to any peer (well-known community)\n"
8309 "Do not export to next AS (well-known community)\n"
8310 "community number\n"
8311 "Do not send outside local AS (well-known community)\n"
8312 "Do not advertise to any peer (well-known community)\n"
8313 "Do not export to next AS (well-known community)\n"
8314 "community number\n"
8315 "Do not send outside local AS (well-known community)\n"
8316 "Do not advertise to any peer (well-known community)\n"
8317 "Do not export to next AS (well-known community)\n"
8318 "community number\n"
8319 "Do not send outside local AS (well-known community)\n"
8320 "Do not advertise to any peer (well-known community)\n"
8321 "Do not export to next AS (well-known community)\n")
8322
8323DEFUN (show_bgp_community_exact,
8324 show_bgp_community_exact_cmd,
8325 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8326 SHOW_STR
8327 BGP_STR
8328 "Display routes matching the communities\n"
8329 "community number\n"
8330 "Do not send outside local AS (well-known community)\n"
8331 "Do not advertise to any peer (well-known community)\n"
8332 "Do not export to next AS (well-known community)\n"
8333 "Exact match of the communities")
8334{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008335 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008336}
8337
8338ALIAS (show_bgp_community_exact,
8339 show_bgp_ipv6_community_exact_cmd,
8340 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8341 SHOW_STR
8342 BGP_STR
8343 "Address family\n"
8344 "Display routes matching the communities\n"
8345 "community number\n"
8346 "Do not send outside local AS (well-known community)\n"
8347 "Do not advertise to any peer (well-known community)\n"
8348 "Do not export to next AS (well-known community)\n"
8349 "Exact match of the communities")
8350
8351ALIAS (show_bgp_community_exact,
8352 show_bgp_community2_exact_cmd,
8353 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8354 SHOW_STR
8355 BGP_STR
8356 "Display routes matching the communities\n"
8357 "community number\n"
8358 "Do not send outside local AS (well-known community)\n"
8359 "Do not advertise to any peer (well-known community)\n"
8360 "Do not export to next AS (well-known community)\n"
8361 "community number\n"
8362 "Do not send outside local AS (well-known community)\n"
8363 "Do not advertise to any peer (well-known community)\n"
8364 "Do not export to next AS (well-known community)\n"
8365 "Exact match of the communities")
8366
8367ALIAS (show_bgp_community_exact,
8368 show_bgp_ipv6_community2_exact_cmd,
8369 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8370 SHOW_STR
8371 BGP_STR
8372 "Address family\n"
8373 "Display routes matching the communities\n"
8374 "community number\n"
8375 "Do not send outside local AS (well-known community)\n"
8376 "Do not advertise to any peer (well-known community)\n"
8377 "Do not export to next AS (well-known community)\n"
8378 "community number\n"
8379 "Do not send outside local AS (well-known community)\n"
8380 "Do not advertise to any peer (well-known community)\n"
8381 "Do not export to next AS (well-known community)\n"
8382 "Exact match of the communities")
8383
8384ALIAS (show_bgp_community_exact,
8385 show_bgp_community3_exact_cmd,
8386 "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",
8387 SHOW_STR
8388 BGP_STR
8389 "Display routes matching the communities\n"
8390 "community number\n"
8391 "Do not send outside local AS (well-known community)\n"
8392 "Do not advertise to any peer (well-known community)\n"
8393 "Do not export to next AS (well-known community)\n"
8394 "community number\n"
8395 "Do not send outside local AS (well-known community)\n"
8396 "Do not advertise to any peer (well-known community)\n"
8397 "Do not export to next AS (well-known community)\n"
8398 "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 "Exact match of the communities")
8403
8404ALIAS (show_bgp_community_exact,
8405 show_bgp_ipv6_community3_exact_cmd,
8406 "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",
8407 SHOW_STR
8408 BGP_STR
8409 "Address family\n"
8410 "Display routes matching the communities\n"
8411 "community number\n"
8412 "Do not send outside local AS (well-known community)\n"
8413 "Do not advertise to any peer (well-known community)\n"
8414 "Do not export to next AS (well-known community)\n"
8415 "community number\n"
8416 "Do not send outside local AS (well-known community)\n"
8417 "Do not advertise to any peer (well-known community)\n"
8418 "Do not export to next AS (well-known community)\n"
8419 "community number\n"
8420 "Do not send outside local AS (well-known community)\n"
8421 "Do not advertise to any peer (well-known community)\n"
8422 "Do not export to next AS (well-known community)\n"
8423 "Exact match of the communities")
8424
8425ALIAS (show_bgp_community_exact,
8426 show_bgp_community4_exact_cmd,
8427 "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",
8428 SHOW_STR
8429 BGP_STR
8430 "Display routes matching the communities\n"
8431 "community number\n"
8432 "Do not send outside local AS (well-known community)\n"
8433 "Do not advertise to any peer (well-known community)\n"
8434 "Do not export to next AS (well-known community)\n"
8435 "community number\n"
8436 "Do not send outside local AS (well-known community)\n"
8437 "Do not advertise to any peer (well-known community)\n"
8438 "Do not export to next AS (well-known community)\n"
8439 "community number\n"
8440 "Do not send outside local AS (well-known community)\n"
8441 "Do not advertise to any peer (well-known community)\n"
8442 "Do not export to next AS (well-known community)\n"
8443 "community number\n"
8444 "Do not send outside local AS (well-known community)\n"
8445 "Do not advertise to any peer (well-known community)\n"
8446 "Do not export to next AS (well-known community)\n"
8447 "Exact match of the communities")
8448
8449ALIAS (show_bgp_community_exact,
8450 show_bgp_ipv6_community4_exact_cmd,
8451 "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",
8452 SHOW_STR
8453 BGP_STR
8454 "Address family\n"
8455 "Display routes matching the communities\n"
8456 "community number\n"
8457 "Do not send outside local AS (well-known community)\n"
8458 "Do not advertise to any peer (well-known community)\n"
8459 "Do not export to next AS (well-known community)\n"
8460 "community number\n"
8461 "Do not send outside local AS (well-known community)\n"
8462 "Do not advertise to any peer (well-known community)\n"
8463 "Do not export to next AS (well-known community)\n"
8464 "community number\n"
8465 "Do not send outside local AS (well-known community)\n"
8466 "Do not advertise to any peer (well-known community)\n"
8467 "Do not export to next AS (well-known community)\n"
8468 "community number\n"
8469 "Do not send outside local AS (well-known community)\n"
8470 "Do not advertise to any peer (well-known community)\n"
8471 "Do not export to next AS (well-known community)\n"
8472 "Exact match of the communities")
8473
8474/* old command */
8475DEFUN (show_ipv6_bgp_community_exact,
8476 show_ipv6_bgp_community_exact_cmd,
8477 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8478 SHOW_STR
8479 IPV6_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 "Exact match of the communities")
8487{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008488 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00008489}
8490
8491/* old command */
8492ALIAS (show_ipv6_bgp_community_exact,
8493 show_ipv6_bgp_community2_exact_cmd,
8494 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8495 SHOW_STR
8496 IPV6_STR
8497 BGP_STR
8498 "Display routes matching the communities\n"
8499 "community number\n"
8500 "Do not send outside local AS (well-known community)\n"
8501 "Do not advertise to any peer (well-known community)\n"
8502 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
8508
8509/* old command */
8510ALIAS (show_ipv6_bgp_community_exact,
8511 show_ipv6_bgp_community3_exact_cmd,
8512 "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",
8513 SHOW_STR
8514 IPV6_STR
8515 BGP_STR
8516 "Display routes matching the communities\n"
8517 "community number\n"
8518 "Do not send outside local AS (well-known community)\n"
8519 "Do not advertise to any peer (well-known community)\n"
8520 "Do not export to next AS (well-known community)\n"
8521 "community number\n"
8522 "Do not send outside local AS (well-known community)\n"
8523 "Do not advertise to any peer (well-known community)\n"
8524 "Do not export to next AS (well-known community)\n"
8525 "community number\n"
8526 "Do not send outside local AS (well-known community)\n"
8527 "Do not advertise to any peer (well-known community)\n"
8528 "Do not export to next AS (well-known community)\n"
8529 "Exact match of the communities")
8530
8531/* old command */
8532ALIAS (show_ipv6_bgp_community_exact,
8533 show_ipv6_bgp_community4_exact_cmd,
8534 "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",
8535 SHOW_STR
8536 IPV6_STR
8537 BGP_STR
8538 "Display routes matching the communities\n"
8539 "community number\n"
8540 "Do not send outside local AS (well-known community)\n"
8541 "Do not advertise to any peer (well-known community)\n"
8542 "Do not export to next AS (well-known community)\n"
8543 "community number\n"
8544 "Do not send outside local AS (well-known community)\n"
8545 "Do not advertise to any peer (well-known community)\n"
8546 "Do not export to next AS (well-known community)\n"
8547 "community number\n"
8548 "Do not send outside local AS (well-known community)\n"
8549 "Do not advertise to any peer (well-known community)\n"
8550 "Do not export to next AS (well-known community)\n"
8551 "community number\n"
8552 "Do not send outside local AS (well-known community)\n"
8553 "Do not advertise to any peer (well-known community)\n"
8554 "Do not export to next AS (well-known community)\n"
8555 "Exact match of the communities")
8556
8557/* old command */
8558DEFUN (show_ipv6_mbgp_community,
8559 show_ipv6_mbgp_community_cmd,
8560 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8561 SHOW_STR
8562 IPV6_STR
8563 MBGP_STR
8564 "Display routes matching the communities\n"
8565 "community number\n"
8566 "Do not send outside local AS (well-known community)\n"
8567 "Do not advertise to any peer (well-known community)\n"
8568 "Do not export to next AS (well-known community)\n")
8569{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008570 return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008571}
8572
8573/* old command */
8574ALIAS (show_ipv6_mbgp_community,
8575 show_ipv6_mbgp_community2_cmd,
8576 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8577 SHOW_STR
8578 IPV6_STR
8579 MBGP_STR
8580 "Display routes matching the communities\n"
8581 "community number\n"
8582 "Do not send outside local AS (well-known community)\n"
8583 "Do not advertise to any peer (well-known community)\n"
8584 "Do not export to next AS (well-known community)\n"
8585 "community number\n"
8586 "Do not send outside local AS (well-known community)\n"
8587 "Do not advertise to any peer (well-known community)\n"
8588 "Do not export to next AS (well-known community)\n")
8589
8590/* old command */
8591ALIAS (show_ipv6_mbgp_community,
8592 show_ipv6_mbgp_community3_cmd,
8593 "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)",
8594 SHOW_STR
8595 IPV6_STR
8596 MBGP_STR
8597 "Display routes matching the communities\n"
8598 "community number\n"
8599 "Do not send outside local AS (well-known community)\n"
8600 "Do not advertise to any peer (well-known community)\n"
8601 "Do not export to next AS (well-known community)\n"
8602 "community number\n"
8603 "Do not send outside local AS (well-known community)\n"
8604 "Do not advertise to any peer (well-known community)\n"
8605 "Do not export to next AS (well-known community)\n"
8606 "community number\n"
8607 "Do not send outside local AS (well-known community)\n"
8608 "Do not advertise to any peer (well-known community)\n"
8609 "Do not export to next AS (well-known community)\n")
8610
8611/* old command */
8612ALIAS (show_ipv6_mbgp_community,
8613 show_ipv6_mbgp_community4_cmd,
8614 "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)",
8615 SHOW_STR
8616 IPV6_STR
8617 MBGP_STR
8618 "Display routes matching the communities\n"
8619 "community number\n"
8620 "Do not send outside local AS (well-known community)\n"
8621 "Do not advertise to any peer (well-known community)\n"
8622 "Do not export to next AS (well-known community)\n"
8623 "community number\n"
8624 "Do not send outside local AS (well-known community)\n"
8625 "Do not advertise to any peer (well-known community)\n"
8626 "Do not export to next AS (well-known community)\n"
8627 "community number\n"
8628 "Do not send outside local AS (well-known community)\n"
8629 "Do not advertise to any peer (well-known community)\n"
8630 "Do not export to next AS (well-known community)\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
8636/* old command */
8637DEFUN (show_ipv6_mbgp_community_exact,
8638 show_ipv6_mbgp_community_exact_cmd,
8639 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8640 SHOW_STR
8641 IPV6_STR
8642 MBGP_STR
8643 "Display routes matching the communities\n"
8644 "community number\n"
8645 "Do not send outside local AS (well-known community)\n"
8646 "Do not advertise to any peer (well-known community)\n"
8647 "Do not export to next AS (well-known community)\n"
8648 "Exact match of the communities")
8649{
Michael Lambert95cbbd22010-07-23 14:43:04 -04008650 return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
paul718e3742002-12-13 20:15:29 +00008651}
8652
8653/* old command */
8654ALIAS (show_ipv6_mbgp_community_exact,
8655 show_ipv6_mbgp_community2_exact_cmd,
8656 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8657 SHOW_STR
8658 IPV6_STR
8659 MBGP_STR
8660 "Display routes matching the communities\n"
8661 "community number\n"
8662 "Do not send outside local AS (well-known community)\n"
8663 "Do not advertise to any peer (well-known community)\n"
8664 "Do not export to next AS (well-known community)\n"
8665 "community number\n"
8666 "Do not send outside local AS (well-known community)\n"
8667 "Do not advertise to any peer (well-known community)\n"
8668 "Do not export to next AS (well-known community)\n"
8669 "Exact match of the communities")
8670
8671/* old command */
8672ALIAS (show_ipv6_mbgp_community_exact,
8673 show_ipv6_mbgp_community3_exact_cmd,
8674 "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",
8675 SHOW_STR
8676 IPV6_STR
8677 MBGP_STR
8678 "Display routes matching the communities\n"
8679 "community number\n"
8680 "Do not send outside local AS (well-known community)\n"
8681 "Do not advertise to any peer (well-known community)\n"
8682 "Do not export to next AS (well-known community)\n"
8683 "community number\n"
8684 "Do not send outside local AS (well-known community)\n"
8685 "Do not advertise to any peer (well-known community)\n"
8686 "Do not export to next AS (well-known community)\n"
8687 "community number\n"
8688 "Do not send outside local AS (well-known community)\n"
8689 "Do not advertise to any peer (well-known community)\n"
8690 "Do not export to next AS (well-known community)\n"
8691 "Exact match of the communities")
8692
8693/* old command */
8694ALIAS (show_ipv6_mbgp_community_exact,
8695 show_ipv6_mbgp_community4_exact_cmd,
8696 "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",
8697 SHOW_STR
8698 IPV6_STR
8699 MBGP_STR
8700 "Display routes matching the communities\n"
8701 "community number\n"
8702 "Do not send outside local AS (well-known community)\n"
8703 "Do not advertise to any peer (well-known community)\n"
8704 "Do not export to next AS (well-known community)\n"
8705 "community number\n"
8706 "Do not send outside local AS (well-known community)\n"
8707 "Do not advertise to any peer (well-known community)\n"
8708 "Do not export to next AS (well-known community)\n"
8709 "community number\n"
8710 "Do not send outside local AS (well-known community)\n"
8711 "Do not advertise to any peer (well-known community)\n"
8712 "Do not export to next AS (well-known community)\n"
8713 "community number\n"
8714 "Do not send outside local AS (well-known community)\n"
8715 "Do not advertise to any peer (well-known community)\n"
8716 "Do not export to next AS (well-known community)\n"
8717 "Exact match of the communities")
8718#endif /* HAVE_IPV6 */
8719
paul94f2b392005-06-28 12:44:16 +00008720static int
paulfd79ac92004-10-13 05:06:08 +00008721bgp_show_community_list (struct vty *vty, const char *com, int exact,
Michael Lambert4c9641b2010-07-22 13:20:55 -04008722 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00008723{
8724 struct community_list *list;
8725
hassofee6e4e2005-02-02 16:29:31 +00008726 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
paul718e3742002-12-13 20:15:29 +00008727 if (list == NULL)
8728 {
8729 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8730 VTY_NEWLINE);
8731 return CMD_WARNING;
8732 }
8733
ajs5a646652004-11-05 01:25:55 +00008734 return bgp_show (vty, NULL, afi, safi,
8735 (exact ? bgp_show_type_community_list_exact :
8736 bgp_show_type_community_list), list);
paul718e3742002-12-13 20:15:29 +00008737}
8738
8739DEFUN (show_ip_bgp_community_list,
8740 show_ip_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008741 "show ip bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008742 SHOW_STR
8743 IP_STR
8744 BGP_STR
8745 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008746 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008747 "community-list name\n")
8748{
8749 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8750}
8751
8752DEFUN (show_ip_bgp_ipv4_community_list,
8753 show_ip_bgp_ipv4_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008754 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008755 SHOW_STR
8756 IP_STR
8757 BGP_STR
8758 "Address family\n"
8759 "Address Family modifier\n"
8760 "Address Family modifier\n"
8761 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008762 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008763 "community-list name\n")
8764{
8765 if (strncmp (argv[0], "m", 1) == 0)
8766 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8767
8768 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8769}
8770
8771DEFUN (show_ip_bgp_community_list_exact,
8772 show_ip_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008773 "show ip bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008774 SHOW_STR
8775 IP_STR
8776 BGP_STR
8777 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008778 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008779 "community-list name\n"
8780 "Exact match of the communities\n")
8781{
8782 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8783}
8784
8785DEFUN (show_ip_bgp_ipv4_community_list_exact,
8786 show_ip_bgp_ipv4_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008787 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008788 SHOW_STR
8789 IP_STR
8790 BGP_STR
8791 "Address family\n"
8792 "Address Family modifier\n"
8793 "Address Family modifier\n"
8794 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008795 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008796 "community-list name\n"
8797 "Exact match of the communities\n")
8798{
8799 if (strncmp (argv[0], "m", 1) == 0)
8800 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8801
8802 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8803}
8804
8805#ifdef HAVE_IPV6
8806DEFUN (show_bgp_community_list,
8807 show_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008808 "show bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008809 SHOW_STR
8810 BGP_STR
8811 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008812 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008813 "community-list name\n")
8814{
8815 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8816}
8817
8818ALIAS (show_bgp_community_list,
8819 show_bgp_ipv6_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008820 "show bgp ipv6 community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008821 SHOW_STR
8822 BGP_STR
8823 "Address family\n"
8824 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008825 "community-list number\n"
paule8e19462006-01-19 20:16:55 +00008826 "community-list name\n")
paul718e3742002-12-13 20:15:29 +00008827
8828/* old command */
8829DEFUN (show_ipv6_bgp_community_list,
8830 show_ipv6_bgp_community_list_cmd,
8831 "show ipv6 bgp community-list WORD",
8832 SHOW_STR
8833 IPV6_STR
8834 BGP_STR
8835 "Display routes matching the community-list\n"
8836 "community-list name\n")
8837{
8838 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8839}
8840
8841/* old command */
8842DEFUN (show_ipv6_mbgp_community_list,
8843 show_ipv6_mbgp_community_list_cmd,
8844 "show ipv6 mbgp community-list WORD",
8845 SHOW_STR
8846 IPV6_STR
8847 MBGP_STR
8848 "Display routes matching the community-list\n"
8849 "community-list name\n")
8850{
8851 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8852}
8853
8854DEFUN (show_bgp_community_list_exact,
8855 show_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008856 "show bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008857 SHOW_STR
8858 BGP_STR
8859 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008860 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008861 "community-list name\n"
8862 "Exact match of the communities\n")
8863{
8864 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8865}
8866
8867ALIAS (show_bgp_community_list_exact,
8868 show_bgp_ipv6_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008869 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008870 SHOW_STR
8871 BGP_STR
8872 "Address family\n"
8873 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008874 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008875 "community-list name\n"
8876 "Exact match of the communities\n")
8877
8878/* old command */
8879DEFUN (show_ipv6_bgp_community_list_exact,
8880 show_ipv6_bgp_community_list_exact_cmd,
8881 "show ipv6 bgp community-list WORD exact-match",
8882 SHOW_STR
8883 IPV6_STR
8884 BGP_STR
8885 "Display routes matching the community-list\n"
8886 "community-list name\n"
8887 "Exact match of the communities\n")
8888{
8889 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8890}
8891
8892/* old command */
8893DEFUN (show_ipv6_mbgp_community_list_exact,
8894 show_ipv6_mbgp_community_list_exact_cmd,
8895 "show ipv6 mbgp community-list WORD exact-match",
8896 SHOW_STR
8897 IPV6_STR
8898 MBGP_STR
8899 "Display routes matching the community-list\n"
8900 "community-list name\n"
8901 "Exact match of the communities\n")
8902{
8903 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8904}
8905#endif /* HAVE_IPV6 */
8906
paul94f2b392005-06-28 12:44:16 +00008907static int
paulfd79ac92004-10-13 05:06:08 +00008908bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
paul718e3742002-12-13 20:15:29 +00008909 safi_t safi, enum bgp_show_type type)
8910{
8911 int ret;
8912 struct prefix *p;
8913
8914 p = prefix_new();
8915
8916 ret = str2prefix (prefix, p);
8917 if (! ret)
8918 {
8919 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
8920 return CMD_WARNING;
8921 }
8922
ajs5a646652004-11-05 01:25:55 +00008923 ret = bgp_show (vty, NULL, afi, safi, type, p);
8924 prefix_free(p);
8925 return ret;
paul718e3742002-12-13 20:15:29 +00008926}
8927
8928DEFUN (show_ip_bgp_prefix_longer,
8929 show_ip_bgp_prefix_longer_cmd,
8930 "show ip bgp A.B.C.D/M longer-prefixes",
8931 SHOW_STR
8932 IP_STR
8933 BGP_STR
8934 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8935 "Display route and more specific routes\n")
8936{
8937 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8938 bgp_show_type_prefix_longer);
8939}
8940
8941DEFUN (show_ip_bgp_flap_prefix_longer,
8942 show_ip_bgp_flap_prefix_longer_cmd,
8943 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
8944 SHOW_STR
8945 IP_STR
8946 BGP_STR
8947 "Display flap statistics of routes\n"
8948 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8949 "Display route and more specific routes\n")
8950{
8951 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8952 bgp_show_type_flap_prefix_longer);
8953}
8954
8955DEFUN (show_ip_bgp_ipv4_prefix_longer,
8956 show_ip_bgp_ipv4_prefix_longer_cmd,
8957 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
8958 SHOW_STR
8959 IP_STR
8960 BGP_STR
8961 "Address family\n"
8962 "Address Family modifier\n"
8963 "Address Family modifier\n"
8964 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8965 "Display route and more specific routes\n")
8966{
8967 if (strncmp (argv[0], "m", 1) == 0)
8968 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8969 bgp_show_type_prefix_longer);
8970
8971 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
8972 bgp_show_type_prefix_longer);
8973}
8974
8975DEFUN (show_ip_bgp_flap_address,
8976 show_ip_bgp_flap_address_cmd,
8977 "show ip bgp flap-statistics A.B.C.D",
8978 SHOW_STR
8979 IP_STR
8980 BGP_STR
8981 "Display flap statistics of routes\n"
8982 "Network in the BGP routing table to display\n")
8983{
8984 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8985 bgp_show_type_flap_address);
8986}
8987
8988DEFUN (show_ip_bgp_flap_prefix,
8989 show_ip_bgp_flap_prefix_cmd,
8990 "show ip bgp flap-statistics A.B.C.D/M",
8991 SHOW_STR
8992 IP_STR
8993 BGP_STR
8994 "Display flap statistics of routes\n"
8995 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
8996{
8997 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8998 bgp_show_type_flap_prefix);
8999}
9000#ifdef HAVE_IPV6
9001DEFUN (show_bgp_prefix_longer,
9002 show_bgp_prefix_longer_cmd,
9003 "show bgp X:X::X:X/M longer-prefixes",
9004 SHOW_STR
9005 BGP_STR
9006 "IPv6 prefix <network>/<length>\n"
9007 "Display route and more specific routes\n")
9008{
9009 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9010 bgp_show_type_prefix_longer);
9011}
9012
9013ALIAS (show_bgp_prefix_longer,
9014 show_bgp_ipv6_prefix_longer_cmd,
9015 "show bgp ipv6 X:X::X:X/M longer-prefixes",
9016 SHOW_STR
9017 BGP_STR
9018 "Address family\n"
9019 "IPv6 prefix <network>/<length>\n"
9020 "Display route and more specific routes\n")
9021
9022/* old command */
9023DEFUN (show_ipv6_bgp_prefix_longer,
9024 show_ipv6_bgp_prefix_longer_cmd,
9025 "show ipv6 bgp X:X::X:X/M longer-prefixes",
9026 SHOW_STR
9027 IPV6_STR
9028 BGP_STR
9029 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9030 "Display route and more specific routes\n")
9031{
9032 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9033 bgp_show_type_prefix_longer);
9034}
9035
9036/* old command */
9037DEFUN (show_ipv6_mbgp_prefix_longer,
9038 show_ipv6_mbgp_prefix_longer_cmd,
9039 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
9040 SHOW_STR
9041 IPV6_STR
9042 MBGP_STR
9043 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9044 "Display route and more specific routes\n")
9045{
9046 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
9047 bgp_show_type_prefix_longer);
9048}
9049#endif /* HAVE_IPV6 */
paulbb46e942003-10-24 19:02:03 +00009050
paul94f2b392005-06-28 12:44:16 +00009051static struct peer *
paulfd79ac92004-10-13 05:06:08 +00009052peer_lookup_in_view (struct vty *vty, const char *view_name,
9053 const char *ip_str)
paulbb46e942003-10-24 19:02:03 +00009054{
9055 int ret;
9056 struct bgp *bgp;
9057 struct peer *peer;
9058 union sockunion su;
9059
9060 /* BGP structure lookup. */
9061 if (view_name)
9062 {
9063 bgp = bgp_lookup_by_name (view_name);
9064 if (! bgp)
9065 {
9066 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
9067 return NULL;
9068 }
9069 }
paul5228ad22004-06-04 17:58:18 +00009070 else
paulbb46e942003-10-24 19:02:03 +00009071 {
9072 bgp = bgp_get_default ();
9073 if (! bgp)
9074 {
9075 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
9076 return NULL;
9077 }
9078 }
9079
9080 /* Get peer sockunion. */
9081 ret = str2sockunion (ip_str, &su);
9082 if (ret < 0)
9083 {
9084 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
9085 return NULL;
9086 }
9087
9088 /* Peer structure lookup. */
9089 peer = peer_lookup (bgp, &su);
9090 if (! peer)
9091 {
9092 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
9093 return NULL;
9094 }
9095
9096 return peer;
9097}
Paul Jakma2815e612006-09-14 02:56:07 +00009098
9099enum bgp_stats
9100{
9101 BGP_STATS_MAXBITLEN = 0,
9102 BGP_STATS_RIB,
9103 BGP_STATS_PREFIXES,
9104 BGP_STATS_TOTPLEN,
9105 BGP_STATS_UNAGGREGATEABLE,
9106 BGP_STATS_MAX_AGGREGATEABLE,
9107 BGP_STATS_AGGREGATES,
9108 BGP_STATS_SPACE,
9109 BGP_STATS_ASPATH_COUNT,
9110 BGP_STATS_ASPATH_MAXHOPS,
9111 BGP_STATS_ASPATH_TOTHOPS,
9112 BGP_STATS_ASPATH_MAXSIZE,
9113 BGP_STATS_ASPATH_TOTSIZE,
9114 BGP_STATS_ASN_HIGHEST,
9115 BGP_STATS_MAX,
9116};
paulbb46e942003-10-24 19:02:03 +00009117
Paul Jakma2815e612006-09-14 02:56:07 +00009118static const char *table_stats_strs[] =
9119{
9120 [BGP_STATS_PREFIXES] = "Total Prefixes",
9121 [BGP_STATS_TOTPLEN] = "Average prefix length",
9122 [BGP_STATS_RIB] = "Total Advertisements",
9123 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
9124 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
9125 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
9126 [BGP_STATS_SPACE] = "Address space advertised",
9127 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
9128 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
9129 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
9130 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
9131 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
9132 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
9133 [BGP_STATS_MAX] = NULL,
9134};
9135
9136struct bgp_table_stats
9137{
9138 struct bgp_table *table;
9139 unsigned long long counts[BGP_STATS_MAX];
9140};
9141
9142#if 0
9143#define TALLY_SIGFIG 100000
9144static unsigned long
9145ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9146{
9147 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9148 unsigned long res = (newtot * TALLY_SIGFIG) / count;
9149 unsigned long ret = newtot / count;
9150
9151 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9152 return ret + 1;
9153 else
9154 return ret;
9155}
9156#endif
9157
9158static int
9159bgp_table_stats_walker (struct thread *t)
9160{
9161 struct bgp_node *rn;
9162 struct bgp_node *top;
9163 struct bgp_table_stats *ts = THREAD_ARG (t);
9164 unsigned int space = 0;
9165
Paul Jakma53d9f672006-10-15 23:41:16 +00009166 if (!(top = bgp_table_top (ts->table)))
9167 return 0;
Paul Jakma2815e612006-09-14 02:56:07 +00009168
9169 switch (top->p.family)
9170 {
9171 case AF_INET:
9172 space = IPV4_MAX_BITLEN;
9173 break;
9174 case AF_INET6:
9175 space = IPV6_MAX_BITLEN;
9176 break;
9177 }
9178
9179 ts->counts[BGP_STATS_MAXBITLEN] = space;
9180
9181 for (rn = top; rn; rn = bgp_route_next (rn))
9182 {
9183 struct bgp_info *ri;
9184 struct bgp_node *prn = rn->parent;
9185 unsigned int rinum = 0;
9186
9187 if (rn == top)
9188 continue;
9189
9190 if (!rn->info)
9191 continue;
9192
9193 ts->counts[BGP_STATS_PREFIXES]++;
9194 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9195
9196#if 0
9197 ts->counts[BGP_STATS_AVGPLEN]
9198 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9199 ts->counts[BGP_STATS_AVGPLEN],
9200 rn->p.prefixlen);
9201#endif
9202
9203 /* check if the prefix is included by any other announcements */
9204 while (prn && !prn->info)
9205 prn = prn->parent;
9206
9207 if (prn == NULL || prn == top)
Paul Jakma8383a9b2006-09-14 03:06:54 +00009208 {
9209 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9210 /* announced address space */
9211 if (space)
9212 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9213 }
Paul Jakma2815e612006-09-14 02:56:07 +00009214 else if (prn->info)
9215 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9216
Paul Jakma2815e612006-09-14 02:56:07 +00009217 for (ri = rn->info; ri; ri = ri->next)
9218 {
9219 rinum++;
9220 ts->counts[BGP_STATS_RIB]++;
9221
9222 if (ri->attr &&
9223 (CHECK_FLAG (ri->attr->flag,
9224 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9225 ts->counts[BGP_STATS_AGGREGATES]++;
9226
9227 /* as-path stats */
9228 if (ri->attr && ri->attr->aspath)
9229 {
9230 unsigned int hops = aspath_count_hops (ri->attr->aspath);
9231 unsigned int size = aspath_size (ri->attr->aspath);
9232 as_t highest = aspath_highest (ri->attr->aspath);
9233
9234 ts->counts[BGP_STATS_ASPATH_COUNT]++;
9235
9236 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9237 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9238
9239 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9240 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9241
9242 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9243 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9244#if 0
9245 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9246 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9247 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9248 hops);
9249 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9250 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9251 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9252 size);
9253#endif
9254 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9255 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9256 }
9257 }
9258 }
9259 return 0;
9260}
9261
9262static int
9263bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9264{
9265 struct bgp_table_stats ts;
9266 unsigned int i;
9267
9268 if (!bgp->rib[afi][safi])
9269 {
9270 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9271 return CMD_WARNING;
9272 }
9273
9274 memset (&ts, 0, sizeof (ts));
9275 ts.table = bgp->rib[afi][safi];
9276 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9277
9278 vty_out (vty, "BGP %s RIB statistics%s%s",
9279 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9280
9281 for (i = 0; i < BGP_STATS_MAX; i++)
9282 {
9283 if (!table_stats_strs[i])
9284 continue;
9285
9286 switch (i)
9287 {
9288#if 0
9289 case BGP_STATS_ASPATH_AVGHOPS:
9290 case BGP_STATS_ASPATH_AVGSIZE:
9291 case BGP_STATS_AVGPLEN:
9292 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9293 vty_out (vty, "%12.2f",
9294 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9295 break;
9296#endif
9297 case BGP_STATS_ASPATH_TOTHOPS:
9298 case BGP_STATS_ASPATH_TOTSIZE:
9299 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9300 vty_out (vty, "%12.2f",
9301 ts.counts[i] ?
9302 (float)ts.counts[i] /
9303 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9304 : 0);
9305 break;
9306 case BGP_STATS_TOTPLEN:
9307 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9308 vty_out (vty, "%12.2f",
9309 ts.counts[i] ?
9310 (float)ts.counts[i] /
9311 (float)ts.counts[BGP_STATS_PREFIXES]
9312 : 0);
9313 break;
9314 case BGP_STATS_SPACE:
9315 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9316 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9317 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9318 break;
Paul Jakma30a22312008-08-15 14:05:22 +01009319 vty_out (vty, "%30s: ", "%% announced ");
Paul Jakma2815e612006-09-14 02:56:07 +00009320 vty_out (vty, "%12.2f%s",
9321 100 * (float)ts.counts[BGP_STATS_SPACE] /
Paul Jakma56395af2006-10-27 16:58:20 +00009322 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
Paul Jakma2815e612006-09-14 02:56:07 +00009323 VTY_NEWLINE);
9324 vty_out (vty, "%30s: ", "/8 equivalent ");
9325 vty_out (vty, "%12.2f%s",
9326 (float)ts.counts[BGP_STATS_SPACE] /
9327 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9328 VTY_NEWLINE);
9329 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9330 break;
9331 vty_out (vty, "%30s: ", "/24 equivalent ");
9332 vty_out (vty, "%12.2f",
9333 (float)ts.counts[BGP_STATS_SPACE] /
9334 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9335 break;
9336 default:
9337 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9338 vty_out (vty, "%12llu", ts.counts[i]);
9339 }
9340
9341 vty_out (vty, "%s", VTY_NEWLINE);
9342 }
9343 return CMD_SUCCESS;
9344}
9345
9346static int
9347bgp_table_stats_vty (struct vty *vty, const char *name,
9348 const char *afi_str, const char *safi_str)
9349{
9350 struct bgp *bgp;
9351 afi_t afi;
9352 safi_t safi;
9353
9354 if (name)
9355 bgp = bgp_lookup_by_name (name);
9356 else
9357 bgp = bgp_get_default ();
9358
9359 if (!bgp)
9360 {
9361 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9362 return CMD_WARNING;
9363 }
9364 if (strncmp (afi_str, "ipv", 3) == 0)
9365 {
9366 if (strncmp (afi_str, "ipv4", 4) == 0)
9367 afi = AFI_IP;
9368 else if (strncmp (afi_str, "ipv6", 4) == 0)
9369 afi = AFI_IP6;
9370 else
9371 {
9372 vty_out (vty, "%% Invalid address family %s%s",
9373 afi_str, VTY_NEWLINE);
9374 return CMD_WARNING;
9375 }
9376 if (strncmp (safi_str, "m", 1) == 0)
9377 safi = SAFI_MULTICAST;
9378 else if (strncmp (safi_str, "u", 1) == 0)
9379 safi = SAFI_UNICAST;
9380 else if (strncmp (safi_str, "vpnv4", 5) == 0)
9381 safi = BGP_SAFI_VPNV4;
9382 else if (strncmp (safi_str, "vpnv6", 6) == 0)
9383 safi = BGP_SAFI_VPNV6;
9384 else
9385 {
9386 vty_out (vty, "%% Invalid subsequent address family %s%s",
9387 safi_str, VTY_NEWLINE);
9388 return CMD_WARNING;
9389 }
9390 }
9391 else
9392 {
9393 vty_out (vty, "%% Invalid address family %s%s",
9394 afi_str, VTY_NEWLINE);
9395 return CMD_WARNING;
9396 }
9397
9398 if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
9399 || (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
9400 {
9401 vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
9402 afi_str, safi_str, VTY_NEWLINE);
9403 return CMD_WARNING;
9404 }
9405 return bgp_table_stats (vty, bgp, afi, safi);
9406}
9407
9408DEFUN (show_bgp_statistics,
9409 show_bgp_statistics_cmd,
9410 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9411 SHOW_STR
9412 BGP_STR
9413 "Address family\n"
9414 "Address family\n"
9415 "Address Family modifier\n"
9416 "Address Family modifier\n"
9417 "BGP RIB advertisement statistics\n")
9418{
9419 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9420}
9421
9422ALIAS (show_bgp_statistics,
9423 show_bgp_statistics_vpnv4_cmd,
9424 "show bgp (ipv4) (vpnv4) statistics",
9425 SHOW_STR
9426 BGP_STR
9427 "Address family\n"
9428 "Address Family modifier\n"
9429 "BGP RIB advertisement statistics\n")
9430
9431DEFUN (show_bgp_statistics_view,
9432 show_bgp_statistics_view_cmd,
9433 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9434 SHOW_STR
9435 BGP_STR
9436 "BGP view\n"
9437 "Address family\n"
9438 "Address family\n"
9439 "Address Family modifier\n"
9440 "Address Family modifier\n"
9441 "BGP RIB advertisement statistics\n")
9442{
9443 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9444}
9445
9446ALIAS (show_bgp_statistics_view,
9447 show_bgp_statistics_view_vpnv4_cmd,
9448 "show bgp view WORD (ipv4) (vpnv4) statistics",
9449 SHOW_STR
9450 BGP_STR
9451 "BGP view\n"
9452 "Address family\n"
9453 "Address Family modifier\n"
9454 "BGP RIB advertisement statistics\n")
9455
Paul Jakmaff7924f2006-09-04 01:10:36 +00009456enum bgp_pcounts
9457{
9458 PCOUNT_ADJ_IN = 0,
9459 PCOUNT_DAMPED,
9460 PCOUNT_REMOVED,
9461 PCOUNT_HISTORY,
9462 PCOUNT_STALE,
9463 PCOUNT_VALID,
9464 PCOUNT_ALL,
9465 PCOUNT_COUNTED,
9466 PCOUNT_PFCNT, /* the figure we display to users */
9467 PCOUNT_MAX,
9468};
9469
9470static const char *pcount_strs[] =
9471{
9472 [PCOUNT_ADJ_IN] = "Adj-in",
9473 [PCOUNT_DAMPED] = "Damped",
9474 [PCOUNT_REMOVED] = "Removed",
9475 [PCOUNT_HISTORY] = "History",
9476 [PCOUNT_STALE] = "Stale",
9477 [PCOUNT_VALID] = "Valid",
9478 [PCOUNT_ALL] = "All RIB",
9479 [PCOUNT_COUNTED] = "PfxCt counted",
9480 [PCOUNT_PFCNT] = "Useable",
9481 [PCOUNT_MAX] = NULL,
9482};
9483
Paul Jakma2815e612006-09-14 02:56:07 +00009484struct peer_pcounts
9485{
9486 unsigned int count[PCOUNT_MAX];
9487 const struct peer *peer;
9488 const struct bgp_table *table;
9489};
9490
Paul Jakmaff7924f2006-09-04 01:10:36 +00009491static int
Paul Jakma2815e612006-09-14 02:56:07 +00009492bgp_peer_count_walker (struct thread *t)
Paul Jakmaff7924f2006-09-04 01:10:36 +00009493{
9494 struct bgp_node *rn;
Paul Jakma2815e612006-09-14 02:56:07 +00009495 struct peer_pcounts *pc = THREAD_ARG (t);
9496 const struct peer *peer = pc->peer;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009497
Paul Jakma2815e612006-09-14 02:56:07 +00009498 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009499 {
9500 struct bgp_adj_in *ain;
Paul Jakma2815e612006-09-14 02:56:07 +00009501 struct bgp_info *ri;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009502
9503 for (ain = rn->adj_in; ain; ain = ain->next)
9504 if (ain->peer == peer)
Paul Jakma2815e612006-09-14 02:56:07 +00009505 pc->count[PCOUNT_ADJ_IN]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009506
Paul Jakmaff7924f2006-09-04 01:10:36 +00009507 for (ri = rn->info; ri; ri = ri->next)
9508 {
9509 char buf[SU_ADDRSTRLEN];
9510
9511 if (ri->peer != peer)
9512 continue;
9513
Paul Jakma2815e612006-09-14 02:56:07 +00009514 pc->count[PCOUNT_ALL]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009515
9516 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
Paul Jakma2815e612006-09-14 02:56:07 +00009517 pc->count[PCOUNT_DAMPED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009518 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
Paul Jakma2815e612006-09-14 02:56:07 +00009519 pc->count[PCOUNT_HISTORY]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009520 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
Paul Jakma2815e612006-09-14 02:56:07 +00009521 pc->count[PCOUNT_REMOVED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009522 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma2815e612006-09-14 02:56:07 +00009523 pc->count[PCOUNT_STALE]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009524 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
Paul Jakma2815e612006-09-14 02:56:07 +00009525 pc->count[PCOUNT_VALID]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009526 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakma2815e612006-09-14 02:56:07 +00009527 pc->count[PCOUNT_PFCNT]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009528
9529 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9530 {
Paul Jakma2815e612006-09-14 02:56:07 +00009531 pc->count[PCOUNT_COUNTED]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009532 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009533 plog_warn (peer->log,
9534 "%s [pcount] %s/%d is counted but flags 0x%x",
9535 peer->host,
9536 inet_ntop(rn->p.family, &rn->p.u.prefix,
9537 buf, SU_ADDRSTRLEN),
9538 rn->p.prefixlen,
9539 ri->flags);
9540 }
9541 else
9542 {
Paul Jakma1a392d42006-09-07 00:24:49 +00009543 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009544 plog_warn (peer->log,
9545 "%s [pcount] %s/%d not counted but flags 0x%x",
9546 peer->host,
9547 inet_ntop(rn->p.family, &rn->p.u.prefix,
9548 buf, SU_ADDRSTRLEN),
9549 rn->p.prefixlen,
9550 ri->flags);
9551 }
9552 }
9553 }
Paul Jakma2815e612006-09-14 02:56:07 +00009554 return 0;
9555}
Paul Jakmaff7924f2006-09-04 01:10:36 +00009556
Paul Jakma2815e612006-09-14 02:56:07 +00009557static int
9558bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9559{
9560 struct peer_pcounts pcounts = { .peer = peer };
9561 unsigned int i;
9562
9563 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9564 || !peer->bgp->rib[afi][safi])
9565 {
9566 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9567 return CMD_WARNING;
9568 }
9569
9570 memset (&pcounts, 0, sizeof(pcounts));
9571 pcounts.peer = peer;
9572 pcounts.table = peer->bgp->rib[afi][safi];
9573
9574 /* in-place call via thread subsystem so as to record execution time
9575 * stats for the thread-walk (i.e. ensure this can't be blamed on
9576 * on just vty_read()).
9577 */
9578 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9579
Paul Jakmaff7924f2006-09-04 01:10:36 +00009580 vty_out (vty, "Prefix counts for %s, %s%s",
9581 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9582 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9583 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9584 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9585
9586 for (i = 0; i < PCOUNT_MAX; i++)
Paul Jakma2815e612006-09-14 02:56:07 +00009587 vty_out (vty, "%20s: %-10d%s",
9588 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
Paul Jakmaff7924f2006-09-04 01:10:36 +00009589
Paul Jakma2815e612006-09-14 02:56:07 +00009590 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
Paul Jakmaff7924f2006-09-04 01:10:36 +00009591 {
9592 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9593 peer->host, VTY_NEWLINE);
9594 vty_out (vty, "Please report this bug, with the above command output%s",
9595 VTY_NEWLINE);
9596 }
9597
9598 return CMD_SUCCESS;
9599}
9600
9601DEFUN (show_ip_bgp_neighbor_prefix_counts,
9602 show_ip_bgp_neighbor_prefix_counts_cmd,
9603 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9604 SHOW_STR
9605 IP_STR
9606 BGP_STR
9607 "Detailed information on TCP and BGP neighbor connections\n"
9608 "Neighbor to display information about\n"
9609 "Neighbor to display information about\n"
9610 "Display detailed prefix count information\n")
9611{
9612 struct peer *peer;
9613
9614 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9615 if (! peer)
9616 return CMD_WARNING;
9617
9618 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9619}
9620
9621DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9622 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9623 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9624 SHOW_STR
9625 BGP_STR
9626 "Address family\n"
9627 "Detailed information on TCP and BGP neighbor connections\n"
9628 "Neighbor to display information about\n"
9629 "Neighbor to display information about\n"
9630 "Display detailed prefix count information\n")
9631{
9632 struct peer *peer;
9633
9634 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9635 if (! peer)
9636 return CMD_WARNING;
9637
9638 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9639}
9640
9641DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9642 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9643 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9644 SHOW_STR
9645 IP_STR
9646 BGP_STR
9647 "Address family\n"
9648 "Address Family modifier\n"
9649 "Address Family modifier\n"
9650 "Detailed information on TCP and BGP neighbor connections\n"
9651 "Neighbor to display information about\n"
9652 "Neighbor to display information about\n"
9653 "Display detailed prefix count information\n")
9654{
9655 struct peer *peer;
9656
9657 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9658 if (! peer)
9659 return CMD_WARNING;
9660
9661 if (strncmp (argv[0], "m", 1) == 0)
9662 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9663
9664 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9665}
9666
9667DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9668 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9669 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9670 SHOW_STR
9671 IP_STR
9672 BGP_STR
9673 "Address family\n"
9674 "Address Family modifier\n"
9675 "Address Family modifier\n"
9676 "Detailed information on TCP and BGP neighbor connections\n"
9677 "Neighbor to display information about\n"
9678 "Neighbor to display information about\n"
9679 "Display detailed prefix count information\n")
9680{
9681 struct peer *peer;
9682
9683 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9684 if (! peer)
9685 return CMD_WARNING;
9686
9687 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9688}
9689
9690
paul94f2b392005-06-28 12:44:16 +00009691static void
paul718e3742002-12-13 20:15:29 +00009692show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9693 int in)
9694{
9695 struct bgp_table *table;
9696 struct bgp_adj_in *ain;
9697 struct bgp_adj_out *adj;
9698 unsigned long output_count;
9699 struct bgp_node *rn;
9700 int header1 = 1;
9701 struct bgp *bgp;
9702 int header2 = 1;
9703
paulbb46e942003-10-24 19:02:03 +00009704 bgp = peer->bgp;
paul718e3742002-12-13 20:15:29 +00009705
9706 if (! bgp)
9707 return;
9708
9709 table = bgp->rib[afi][safi];
9710
9711 output_count = 0;
9712
9713 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9714 PEER_STATUS_DEFAULT_ORIGINATE))
9715 {
9716 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 +00009717 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9718 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009719
9720 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9721 VTY_NEWLINE, VTY_NEWLINE);
9722 header1 = 0;
9723 }
9724
9725 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9726 if (in)
9727 {
9728 for (ain = rn->adj_in; ain; ain = ain->next)
9729 if (ain->peer == peer)
9730 {
9731 if (header1)
9732 {
9733 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 +00009734 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9735 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009736 header1 = 0;
9737 }
9738 if (header2)
9739 {
9740 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9741 header2 = 0;
9742 }
9743 if (ain->attr)
9744 {
9745 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9746 output_count++;
9747 }
9748 }
9749 }
9750 else
9751 {
9752 for (adj = rn->adj_out; adj; adj = adj->next)
9753 if (adj->peer == peer)
9754 {
9755 if (header1)
9756 {
9757 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 +00009758 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9759 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009760 header1 = 0;
9761 }
9762 if (header2)
9763 {
9764 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9765 header2 = 0;
9766 }
9767 if (adj->attr)
9768 {
9769 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9770 output_count++;
9771 }
9772 }
9773 }
9774
9775 if (output_count != 0)
9776 vty_out (vty, "%sTotal number of prefixes %ld%s",
9777 VTY_NEWLINE, output_count, VTY_NEWLINE);
9778}
9779
paul94f2b392005-06-28 12:44:16 +00009780static int
paulbb46e942003-10-24 19:02:03 +00009781peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9782{
paul718e3742002-12-13 20:15:29 +00009783 if (! peer || ! peer->afc[afi][safi])
9784 {
9785 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9786 return CMD_WARNING;
9787 }
9788
9789 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9790 {
9791 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9792 VTY_NEWLINE);
9793 return CMD_WARNING;
9794 }
9795
9796 show_adj_route (vty, peer, afi, safi, in);
9797
9798 return CMD_SUCCESS;
9799}
9800
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009801DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9802 show_ip_bgp_view_neighbor_advertised_route_cmd,
9803 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9804 SHOW_STR
9805 IP_STR
9806 BGP_STR
9807 "BGP view\n"
9808 "View name\n"
9809 "Detailed information on TCP and BGP neighbor connections\n"
9810 "Neighbor to display information about\n"
9811 "Neighbor to display information about\n"
9812 "Display the routes advertised to a BGP neighbor\n")
9813{
9814 struct peer *peer;
9815
9816 if (argc == 2)
9817 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9818 else
9819 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9820
9821 if (! peer)
9822 return CMD_WARNING;
9823
9824 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9825}
9826
9827ALIAS (show_ip_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009828 show_ip_bgp_neighbor_advertised_route_cmd,
9829 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9830 SHOW_STR
9831 IP_STR
9832 BGP_STR
9833 "Detailed information on TCP and BGP neighbor connections\n"
9834 "Neighbor to display information about\n"
9835 "Neighbor to display information about\n"
9836 "Display the routes advertised to a BGP neighbor\n")
paul718e3742002-12-13 20:15:29 +00009837
9838DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9839 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9840 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9841 SHOW_STR
9842 IP_STR
9843 BGP_STR
9844 "Address family\n"
9845 "Address Family modifier\n"
9846 "Address Family modifier\n"
9847 "Detailed information on TCP and BGP neighbor connections\n"
9848 "Neighbor to display information about\n"
9849 "Neighbor to display information about\n"
9850 "Display the routes advertised to a BGP neighbor\n")
9851{
paulbb46e942003-10-24 19:02:03 +00009852 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00009853
paulbb46e942003-10-24 19:02:03 +00009854 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9855 if (! peer)
9856 return CMD_WARNING;
9857
9858 if (strncmp (argv[0], "m", 1) == 0)
9859 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9860
9861 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
paul718e3742002-12-13 20:15:29 +00009862}
9863
9864#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +00009865DEFUN (show_bgp_view_neighbor_advertised_route,
9866 show_bgp_view_neighbor_advertised_route_cmd,
9867 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9868 SHOW_STR
9869 BGP_STR
9870 "BGP view\n"
9871 "View name\n"
9872 "Detailed information on TCP and BGP neighbor connections\n"
9873 "Neighbor to display information about\n"
9874 "Neighbor to display information about\n"
9875 "Display the routes advertised to a BGP neighbor\n")
9876{
9877 struct peer *peer;
9878
9879 if (argc == 2)
9880 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9881 else
9882 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9883
9884 if (! peer)
9885 return CMD_WARNING;
9886
9887 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9888}
9889
9890ALIAS (show_bgp_view_neighbor_advertised_route,
9891 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9892 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9893 SHOW_STR
9894 BGP_STR
9895 "BGP view\n"
9896 "View name\n"
9897 "Address family\n"
9898 "Detailed information on TCP and BGP neighbor connections\n"
9899 "Neighbor to display information about\n"
9900 "Neighbor to display information about\n"
9901 "Display the routes advertised to a BGP neighbor\n")
9902
9903DEFUN (show_bgp_view_neighbor_received_routes,
9904 show_bgp_view_neighbor_received_routes_cmd,
9905 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9906 SHOW_STR
9907 BGP_STR
9908 "BGP view\n"
9909 "View name\n"
9910 "Detailed information on TCP and BGP neighbor connections\n"
9911 "Neighbor to display information about\n"
9912 "Neighbor to display information about\n"
9913 "Display the received routes from neighbor\n")
9914{
9915 struct peer *peer;
9916
9917 if (argc == 2)
9918 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9919 else
9920 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9921
9922 if (! peer)
9923 return CMD_WARNING;
9924
9925 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
9926}
9927
9928ALIAS (show_bgp_view_neighbor_received_routes,
9929 show_bgp_view_ipv6_neighbor_received_routes_cmd,
9930 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9931 SHOW_STR
9932 BGP_STR
9933 "BGP view\n"
9934 "View name\n"
9935 "Address family\n"
9936 "Detailed information on TCP and BGP neighbor connections\n"
9937 "Neighbor to display information about\n"
9938 "Neighbor to display information about\n"
9939 "Display the received routes from neighbor\n")
9940
9941ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009942 show_bgp_neighbor_advertised_route_cmd,
9943 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9944 SHOW_STR
9945 BGP_STR
9946 "Detailed information on TCP and BGP neighbor connections\n"
9947 "Neighbor to display information about\n"
9948 "Neighbor to display information about\n"
9949 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +00009950
9951ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009952 show_bgp_ipv6_neighbor_advertised_route_cmd,
9953 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9954 SHOW_STR
9955 BGP_STR
9956 "Address family\n"
9957 "Detailed information on TCP and BGP neighbor connections\n"
9958 "Neighbor to display information about\n"
9959 "Neighbor to display information about\n"
9960 "Display the routes advertised to a BGP neighbor\n")
9961
9962/* old command */
paulbb46e942003-10-24 19:02:03 +00009963ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009964 ipv6_bgp_neighbor_advertised_route_cmd,
9965 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9966 SHOW_STR
9967 IPV6_STR
9968 BGP_STR
9969 "Detailed information on TCP and BGP neighbor connections\n"
9970 "Neighbor to display information about\n"
9971 "Neighbor to display information about\n"
9972 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +00009973
paul718e3742002-12-13 20:15:29 +00009974/* old command */
9975DEFUN (ipv6_mbgp_neighbor_advertised_route,
9976 ipv6_mbgp_neighbor_advertised_route_cmd,
9977 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9978 SHOW_STR
9979 IPV6_STR
9980 MBGP_STR
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{
paulbb46e942003-10-24 19:02:03 +00009986 struct peer *peer;
9987
9988 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9989 if (! peer)
9990 return CMD_WARNING;
9991
9992 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
paul718e3742002-12-13 20:15:29 +00009993}
9994#endif /* HAVE_IPV6 */
9995
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009996DEFUN (show_ip_bgp_view_neighbor_received_routes,
9997 show_ip_bgp_view_neighbor_received_routes_cmd,
9998 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9999 SHOW_STR
10000 IP_STR
10001 BGP_STR
10002 "BGP view\n"
10003 "View name\n"
10004 "Detailed information on TCP and BGP neighbor connections\n"
10005 "Neighbor to display information about\n"
10006 "Neighbor to display information about\n"
10007 "Display the received routes from neighbor\n")
10008{
10009 struct peer *peer;
10010
10011 if (argc == 2)
10012 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10013 else
10014 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10015
10016 if (! peer)
10017 return CMD_WARNING;
10018
10019 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
10020}
10021
10022ALIAS (show_ip_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010023 show_ip_bgp_neighbor_received_routes_cmd,
10024 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10025 SHOW_STR
10026 IP_STR
10027 BGP_STR
10028 "Detailed information on TCP and BGP neighbor connections\n"
10029 "Neighbor to display information about\n"
10030 "Neighbor to display information about\n"
10031 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010032
10033DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
10034 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
10035 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
10036 SHOW_STR
10037 IP_STR
10038 BGP_STR
10039 "Address family\n"
10040 "Address Family modifier\n"
10041 "Address Family modifier\n"
10042 "Detailed information on TCP and BGP neighbor connections\n"
10043 "Neighbor to display information about\n"
10044 "Neighbor to display information about\n"
10045 "Display the received routes from neighbor\n")
10046{
paulbb46e942003-10-24 19:02:03 +000010047 struct peer *peer;
paul718e3742002-12-13 20:15:29 +000010048
paulbb46e942003-10-24 19:02:03 +000010049 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10050 if (! peer)
10051 return CMD_WARNING;
10052
10053 if (strncmp (argv[0], "m", 1) == 0)
10054 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
10055
10056 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
paul718e3742002-12-13 20:15:29 +000010057}
10058
Michael Lambert95cbbd22010-07-23 14:43:04 -040010059DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
10060 show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
10061#ifdef HAVE_IPV6
10062 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10063#else
10064 "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10065#endif
10066 SHOW_STR
10067 BGP_STR
10068 "BGP view\n"
10069 "BGP view name\n"
10070 "Address family\n"
10071#ifdef HAVE_IPV6
10072 "Address family\n"
10073#endif
10074 "Address family modifier\n"
10075 "Address family modifier\n"
10076 "Detailed information on TCP and BGP neighbor connections\n"
10077 "Neighbor to display information about\n"
10078 "Neighbor to display information about\n"
10079 "Display the advertised routes to neighbor\n"
10080 "Display the received routes from neighbor\n")
10081{
10082 int afi;
10083 int safi;
10084 int in;
10085 struct peer *peer;
10086
10087#ifdef HAVE_IPV6
10088 peer = peer_lookup_in_view (vty, argv[0], argv[3]);
10089#else
10090 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10091#endif
10092
10093 if (! peer)
10094 return CMD_WARNING;
10095
10096#ifdef HAVE_IPV6
10097 afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10098 safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10099 in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
10100#else
10101 afi = AFI_IP;
10102 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10103 in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
10104#endif
10105
10106 return peer_adj_routes (vty, peer, afi, safi, in);
10107}
10108
paul718e3742002-12-13 20:15:29 +000010109DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
10110 show_ip_bgp_neighbor_received_prefix_filter_cmd,
10111 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10112 SHOW_STR
10113 IP_STR
10114 BGP_STR
10115 "Detailed information on TCP and BGP neighbor connections\n"
10116 "Neighbor to display information about\n"
10117 "Neighbor to display information about\n"
10118 "Display information received from a BGP neighbor\n"
10119 "Display the prefixlist filter\n")
10120{
10121 char name[BUFSIZ];
10122 union sockunion *su;
10123 struct peer *peer;
10124 int count;
10125
10126 su = sockunion_str2su (argv[0]);
10127 if (su == NULL)
10128 return CMD_WARNING;
10129
10130 peer = peer_lookup (NULL, su);
10131 if (! peer)
10132 return CMD_WARNING;
10133
10134 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10135 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10136 if (count)
10137 {
10138 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10139 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10140 }
10141
10142 return CMD_SUCCESS;
10143}
10144
10145DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
10146 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
10147 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10148 SHOW_STR
10149 IP_STR
10150 BGP_STR
10151 "Address family\n"
10152 "Address Family modifier\n"
10153 "Address Family modifier\n"
10154 "Detailed information on TCP and BGP neighbor connections\n"
10155 "Neighbor to display information about\n"
10156 "Neighbor to display information about\n"
10157 "Display information received from a BGP neighbor\n"
10158 "Display the prefixlist filter\n")
10159{
10160 char name[BUFSIZ];
10161 union sockunion *su;
10162 struct peer *peer;
10163 int count;
10164
10165 su = sockunion_str2su (argv[1]);
10166 if (su == NULL)
10167 return CMD_WARNING;
10168
10169 peer = peer_lookup (NULL, su);
10170 if (! peer)
10171 return CMD_WARNING;
10172
10173 if (strncmp (argv[0], "m", 1) == 0)
10174 {
10175 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
10176 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10177 if (count)
10178 {
10179 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
10180 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10181 }
10182 }
10183 else
10184 {
10185 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10186 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10187 if (count)
10188 {
10189 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10190 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10191 }
10192 }
10193
10194 return CMD_SUCCESS;
10195}
10196
10197
10198#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010199ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010200 show_bgp_neighbor_received_routes_cmd,
10201 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10202 SHOW_STR
10203 BGP_STR
10204 "Detailed information on TCP and BGP neighbor connections\n"
10205 "Neighbor to display information about\n"
10206 "Neighbor to display information about\n"
10207 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010208
paulbb46e942003-10-24 19:02:03 +000010209ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010210 show_bgp_ipv6_neighbor_received_routes_cmd,
10211 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10212 SHOW_STR
10213 BGP_STR
10214 "Address family\n"
10215 "Detailed information on TCP and BGP neighbor connections\n"
10216 "Neighbor to display information about\n"
10217 "Neighbor to display information about\n"
10218 "Display the received routes from neighbor\n")
10219
10220DEFUN (show_bgp_neighbor_received_prefix_filter,
10221 show_bgp_neighbor_received_prefix_filter_cmd,
10222 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10223 SHOW_STR
10224 BGP_STR
10225 "Detailed information on TCP and BGP neighbor connections\n"
10226 "Neighbor to display information about\n"
10227 "Neighbor to display information about\n"
10228 "Display information received from a BGP neighbor\n"
10229 "Display the prefixlist filter\n")
10230{
10231 char name[BUFSIZ];
10232 union sockunion *su;
10233 struct peer *peer;
10234 int count;
10235
10236 su = sockunion_str2su (argv[0]);
10237 if (su == NULL)
10238 return CMD_WARNING;
10239
10240 peer = peer_lookup (NULL, su);
10241 if (! peer)
10242 return CMD_WARNING;
10243
10244 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10245 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10246 if (count)
10247 {
10248 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10249 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10250 }
10251
10252 return CMD_SUCCESS;
10253}
10254
10255ALIAS (show_bgp_neighbor_received_prefix_filter,
10256 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10257 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10258 SHOW_STR
10259 BGP_STR
10260 "Address family\n"
10261 "Detailed information on TCP and BGP neighbor connections\n"
10262 "Neighbor to display information about\n"
10263 "Neighbor to display information about\n"
10264 "Display information received from a BGP neighbor\n"
10265 "Display the prefixlist filter\n")
10266
10267/* old command */
paulbb46e942003-10-24 19:02:03 +000010268ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +000010269 ipv6_bgp_neighbor_received_routes_cmd,
10270 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10271 SHOW_STR
10272 IPV6_STR
10273 BGP_STR
10274 "Detailed information on TCP and BGP neighbor connections\n"
10275 "Neighbor to display information about\n"
10276 "Neighbor to display information about\n"
10277 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010278
10279/* old command */
10280DEFUN (ipv6_mbgp_neighbor_received_routes,
10281 ipv6_mbgp_neighbor_received_routes_cmd,
10282 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10283 SHOW_STR
10284 IPV6_STR
10285 MBGP_STR
10286 "Detailed information on TCP and BGP neighbor connections\n"
10287 "Neighbor to display information about\n"
10288 "Neighbor to display information about\n"
10289 "Display the received routes from neighbor\n")
10290{
paulbb46e942003-10-24 19:02:03 +000010291 struct peer *peer;
10292
10293 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10294 if (! peer)
10295 return CMD_WARNING;
10296
10297 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
paul718e3742002-12-13 20:15:29 +000010298}
paulbb46e942003-10-24 19:02:03 +000010299
10300DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10301 show_bgp_view_neighbor_received_prefix_filter_cmd,
10302 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10303 SHOW_STR
10304 BGP_STR
10305 "BGP view\n"
10306 "View name\n"
10307 "Detailed information on TCP and BGP neighbor connections\n"
10308 "Neighbor to display information about\n"
10309 "Neighbor to display information about\n"
10310 "Display information received from a BGP neighbor\n"
10311 "Display the prefixlist filter\n")
10312{
10313 char name[BUFSIZ];
10314 union sockunion *su;
10315 struct peer *peer;
10316 struct bgp *bgp;
10317 int count;
10318
10319 /* BGP structure lookup. */
10320 bgp = bgp_lookup_by_name (argv[0]);
10321 if (bgp == NULL)
10322 {
10323 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10324 return CMD_WARNING;
10325 }
10326
10327 su = sockunion_str2su (argv[1]);
10328 if (su == NULL)
10329 return CMD_WARNING;
10330
10331 peer = peer_lookup (bgp, su);
10332 if (! peer)
10333 return CMD_WARNING;
10334
10335 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10336 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10337 if (count)
10338 {
10339 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10340 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10341 }
10342
10343 return CMD_SUCCESS;
10344}
10345
10346ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10347 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10348 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10349 SHOW_STR
10350 BGP_STR
10351 "BGP view\n"
10352 "View name\n"
10353 "Address family\n"
10354 "Detailed information on TCP and BGP neighbor connections\n"
10355 "Neighbor to display information about\n"
10356 "Neighbor to display information about\n"
10357 "Display information received from a BGP neighbor\n"
10358 "Display the prefixlist filter\n")
paul718e3742002-12-13 20:15:29 +000010359#endif /* HAVE_IPV6 */
10360
paul94f2b392005-06-28 12:44:16 +000010361static int
paulbb46e942003-10-24 19:02:03 +000010362bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
paul718e3742002-12-13 20:15:29 +000010363 safi_t safi, enum bgp_show_type type)
10364{
paul718e3742002-12-13 20:15:29 +000010365 if (! peer || ! peer->afc[afi][safi])
10366 {
10367 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +000010368 return CMD_WARNING;
10369 }
10370
ajs5a646652004-11-05 01:25:55 +000010371 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
paul718e3742002-12-13 20:15:29 +000010372}
10373
10374DEFUN (show_ip_bgp_neighbor_routes,
10375 show_ip_bgp_neighbor_routes_cmd,
10376 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10377 SHOW_STR
10378 IP_STR
10379 BGP_STR
10380 "Detailed information on TCP and BGP neighbor connections\n"
10381 "Neighbor to display information about\n"
10382 "Neighbor to display information about\n"
10383 "Display routes learned from neighbor\n")
10384{
paulbb46e942003-10-24 19:02:03 +000010385 struct peer *peer;
10386
10387 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10388 if (! peer)
10389 return CMD_WARNING;
10390
10391 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010392 bgp_show_type_neighbor);
10393}
10394
10395DEFUN (show_ip_bgp_neighbor_flap,
10396 show_ip_bgp_neighbor_flap_cmd,
10397 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10398 SHOW_STR
10399 IP_STR
10400 BGP_STR
10401 "Detailed information on TCP and BGP neighbor connections\n"
10402 "Neighbor to display information about\n"
10403 "Neighbor to display information about\n"
10404 "Display flap statistics of the routes learned from neighbor\n")
10405{
paulbb46e942003-10-24 19:02:03 +000010406 struct peer *peer;
10407
10408 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10409 if (! peer)
10410 return CMD_WARNING;
10411
10412 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010413 bgp_show_type_flap_neighbor);
10414}
10415
10416DEFUN (show_ip_bgp_neighbor_damp,
10417 show_ip_bgp_neighbor_damp_cmd,
10418 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10419 SHOW_STR
10420 IP_STR
10421 BGP_STR
10422 "Detailed information on TCP and BGP neighbor connections\n"
10423 "Neighbor to display information about\n"
10424 "Neighbor to display information about\n"
10425 "Display the dampened routes received from neighbor\n")
10426{
paulbb46e942003-10-24 19:02:03 +000010427 struct peer *peer;
10428
10429 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10430 if (! peer)
10431 return CMD_WARNING;
10432
10433 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010434 bgp_show_type_damp_neighbor);
10435}
10436
10437DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10438 show_ip_bgp_ipv4_neighbor_routes_cmd,
10439 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10440 SHOW_STR
10441 IP_STR
10442 BGP_STR
10443 "Address family\n"
10444 "Address Family modifier\n"
10445 "Address Family modifier\n"
10446 "Detailed information on TCP and BGP neighbor connections\n"
10447 "Neighbor to display information about\n"
10448 "Neighbor to display information about\n"
10449 "Display routes learned from neighbor\n")
10450{
paulbb46e942003-10-24 19:02:03 +000010451 struct peer *peer;
10452
10453 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10454 if (! peer)
10455 return CMD_WARNING;
10456
paul718e3742002-12-13 20:15:29 +000010457 if (strncmp (argv[0], "m", 1) == 0)
paulbb46e942003-10-24 19:02:03 +000010458 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000010459 bgp_show_type_neighbor);
10460
paulbb46e942003-10-24 19:02:03 +000010461 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010462 bgp_show_type_neighbor);
10463}
paulbb46e942003-10-24 19:02:03 +000010464
paulfee0f4c2004-09-13 05:12:46 +000010465DEFUN (show_ip_bgp_view_rsclient,
10466 show_ip_bgp_view_rsclient_cmd,
10467 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10468 SHOW_STR
10469 IP_STR
10470 BGP_STR
10471 "BGP view\n"
10472 "BGP view name\n"
10473 "Information about Route Server Client\n"
10474 NEIGHBOR_ADDR_STR)
10475{
10476 struct bgp_table *table;
10477 struct peer *peer;
10478
10479 if (argc == 2)
10480 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10481 else
10482 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10483
10484 if (! peer)
10485 return CMD_WARNING;
10486
10487 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10488 {
10489 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10490 VTY_NEWLINE);
10491 return CMD_WARNING;
10492 }
10493
10494 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10495 PEER_FLAG_RSERVER_CLIENT))
10496 {
10497 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10498 VTY_NEWLINE);
10499 return CMD_WARNING;
10500 }
10501
10502 table = peer->rib[AFI_IP][SAFI_UNICAST];
10503
ajs5a646652004-11-05 01:25:55 +000010504 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000010505}
10506
10507ALIAS (show_ip_bgp_view_rsclient,
10508 show_ip_bgp_rsclient_cmd,
10509 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10510 SHOW_STR
10511 IP_STR
10512 BGP_STR
10513 "Information about Route Server Client\n"
10514 NEIGHBOR_ADDR_STR)
10515
Michael Lambert95cbbd22010-07-23 14:43:04 -040010516DEFUN (show_bgp_view_ipv4_safi_rsclient,
10517 show_bgp_view_ipv4_safi_rsclient_cmd,
10518 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10519 SHOW_STR
10520 BGP_STR
10521 "BGP view\n"
10522 "BGP view name\n"
10523 "Address family\n"
10524 "Address Family modifier\n"
10525 "Address Family modifier\n"
10526 "Information about Route Server Client\n"
10527 NEIGHBOR_ADDR_STR)
10528{
10529 struct bgp_table *table;
10530 struct peer *peer;
10531 safi_t safi;
10532
10533 if (argc == 3) {
10534 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10535 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10536 } else {
10537 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10538 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10539 }
10540
10541 if (! peer)
10542 return CMD_WARNING;
10543
10544 if (! peer->afc[AFI_IP][safi])
10545 {
10546 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10547 VTY_NEWLINE);
10548 return CMD_WARNING;
10549 }
10550
10551 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10552 PEER_FLAG_RSERVER_CLIENT))
10553 {
10554 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10555 VTY_NEWLINE);
10556 return CMD_WARNING;
10557 }
10558
10559 table = peer->rib[AFI_IP][safi];
10560
10561 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10562}
10563
10564ALIAS (show_bgp_view_ipv4_safi_rsclient,
10565 show_bgp_ipv4_safi_rsclient_cmd,
10566 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10567 SHOW_STR
10568 BGP_STR
10569 "Address family\n"
10570 "Address Family modifier\n"
10571 "Address Family modifier\n"
10572 "Information about Route Server Client\n"
10573 NEIGHBOR_ADDR_STR)
10574
paulfee0f4c2004-09-13 05:12:46 +000010575DEFUN (show_ip_bgp_view_rsclient_route,
10576 show_ip_bgp_view_rsclient_route_cmd,
Michael Lamberta8bf6f52008-09-24 17:23:11 +010010577 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
paulfee0f4c2004-09-13 05:12:46 +000010578 SHOW_STR
10579 IP_STR
10580 BGP_STR
10581 "BGP view\n"
10582 "BGP view name\n"
10583 "Information about Route Server Client\n"
10584 NEIGHBOR_ADDR_STR
10585 "Network in the BGP routing table to display\n")
10586{
10587 struct bgp *bgp;
10588 struct peer *peer;
10589
10590 /* BGP structure lookup. */
10591 if (argc == 3)
10592 {
10593 bgp = bgp_lookup_by_name (argv[0]);
10594 if (bgp == NULL)
10595 {
10596 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10597 return CMD_WARNING;
10598 }
10599 }
10600 else
10601 {
10602 bgp = bgp_get_default ();
10603 if (bgp == NULL)
10604 {
10605 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10606 return CMD_WARNING;
10607 }
10608 }
10609
10610 if (argc == 3)
10611 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10612 else
10613 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10614
10615 if (! peer)
10616 return CMD_WARNING;
10617
10618 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10619 {
10620 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10621 VTY_NEWLINE);
10622 return CMD_WARNING;
10623}
10624
10625 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10626 PEER_FLAG_RSERVER_CLIENT))
10627 {
10628 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10629 VTY_NEWLINE);
10630 return CMD_WARNING;
10631 }
10632
10633 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10634 (argc == 3) ? argv[2] : argv[1],
10635 AFI_IP, SAFI_UNICAST, NULL, 0);
10636}
10637
10638ALIAS (show_ip_bgp_view_rsclient_route,
10639 show_ip_bgp_rsclient_route_cmd,
10640 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10641 SHOW_STR
10642 IP_STR
10643 BGP_STR
10644 "Information about Route Server Client\n"
10645 NEIGHBOR_ADDR_STR
10646 "Network in the BGP routing table to display\n")
10647
Michael Lambert95cbbd22010-07-23 14:43:04 -040010648DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
10649 show_bgp_view_ipv4_safi_rsclient_route_cmd,
10650 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10651 SHOW_STR
10652 BGP_STR
10653 "BGP view\n"
10654 "BGP view name\n"
10655 "Address family\n"
10656 "Address Family modifier\n"
10657 "Address Family modifier\n"
10658 "Information about Route Server Client\n"
10659 NEIGHBOR_ADDR_STR
10660 "Network in the BGP routing table to display\n")
10661{
10662 struct bgp *bgp;
10663 struct peer *peer;
10664 safi_t safi;
10665
10666 /* BGP structure lookup. */
10667 if (argc == 4)
10668 {
10669 bgp = bgp_lookup_by_name (argv[0]);
10670 if (bgp == NULL)
10671 {
10672 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10673 return CMD_WARNING;
10674 }
10675 }
10676 else
10677 {
10678 bgp = bgp_get_default ();
10679 if (bgp == NULL)
10680 {
10681 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10682 return CMD_WARNING;
10683 }
10684 }
10685
10686 if (argc == 4) {
10687 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10688 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10689 } else {
10690 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10691 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10692 }
10693
10694 if (! peer)
10695 return CMD_WARNING;
10696
10697 if (! peer->afc[AFI_IP][safi])
10698 {
10699 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10700 VTY_NEWLINE);
10701 return CMD_WARNING;
10702}
10703
10704 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10705 PEER_FLAG_RSERVER_CLIENT))
10706 {
10707 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10708 VTY_NEWLINE);
10709 return CMD_WARNING;
10710 }
10711
10712 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10713 (argc == 4) ? argv[3] : argv[2],
10714 AFI_IP, safi, NULL, 0);
10715}
10716
10717ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
10718 show_bgp_ipv4_safi_rsclient_route_cmd,
10719 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10720 SHOW_STR
10721 BGP_STR
10722 "Address family\n"
10723 "Address Family modifier\n"
10724 "Address Family modifier\n"
10725 "Information about Route Server Client\n"
10726 NEIGHBOR_ADDR_STR
10727 "Network in the BGP routing table to display\n")
10728
paulfee0f4c2004-09-13 05:12:46 +000010729DEFUN (show_ip_bgp_view_rsclient_prefix,
10730 show_ip_bgp_view_rsclient_prefix_cmd,
10731 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10732 SHOW_STR
10733 IP_STR
10734 BGP_STR
10735 "BGP view\n"
10736 "BGP view name\n"
10737 "Information about Route Server Client\n"
10738 NEIGHBOR_ADDR_STR
10739 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10740{
10741 struct bgp *bgp;
10742 struct peer *peer;
10743
10744 /* BGP structure lookup. */
10745 if (argc == 3)
10746 {
10747 bgp = bgp_lookup_by_name (argv[0]);
10748 if (bgp == NULL)
10749 {
10750 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10751 return CMD_WARNING;
10752 }
10753 }
10754 else
10755 {
10756 bgp = bgp_get_default ();
10757 if (bgp == NULL)
10758 {
10759 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10760 return CMD_WARNING;
10761 }
10762 }
10763
10764 if (argc == 3)
10765 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10766 else
10767 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10768
10769 if (! peer)
10770 return CMD_WARNING;
10771
10772 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10773 {
10774 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10775 VTY_NEWLINE);
10776 return CMD_WARNING;
10777}
10778
10779 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10780 PEER_FLAG_RSERVER_CLIENT))
10781{
10782 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10783 VTY_NEWLINE);
10784 return CMD_WARNING;
10785 }
10786
10787 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10788 (argc == 3) ? argv[2] : argv[1],
10789 AFI_IP, SAFI_UNICAST, NULL, 1);
10790}
10791
10792ALIAS (show_ip_bgp_view_rsclient_prefix,
10793 show_ip_bgp_rsclient_prefix_cmd,
10794 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10795 SHOW_STR
10796 IP_STR
10797 BGP_STR
10798 "Information about Route Server Client\n"
10799 NEIGHBOR_ADDR_STR
10800 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10801
Michael Lambert95cbbd22010-07-23 14:43:04 -040010802DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
10803 show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
10804 "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10805 SHOW_STR
10806 BGP_STR
10807 "BGP view\n"
10808 "BGP view name\n"
10809 "Address family\n"
10810 "Address Family modifier\n"
10811 "Address Family modifier\n"
10812 "Information about Route Server Client\n"
10813 NEIGHBOR_ADDR_STR
10814 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10815{
10816 struct bgp *bgp;
10817 struct peer *peer;
10818 safi_t safi;
10819
10820 /* BGP structure lookup. */
10821 if (argc == 4)
10822 {
10823 bgp = bgp_lookup_by_name (argv[0]);
10824 if (bgp == NULL)
10825 {
10826 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10827 return CMD_WARNING;
10828 }
10829 }
10830 else
10831 {
10832 bgp = bgp_get_default ();
10833 if (bgp == NULL)
10834 {
10835 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10836 return CMD_WARNING;
10837 }
10838 }
10839
10840 if (argc == 4) {
10841 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10842 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10843 } else {
10844 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10845 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10846 }
10847
10848 if (! peer)
10849 return CMD_WARNING;
10850
10851 if (! peer->afc[AFI_IP][safi])
10852 {
10853 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10854 VTY_NEWLINE);
10855 return CMD_WARNING;
10856}
10857
10858 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10859 PEER_FLAG_RSERVER_CLIENT))
10860{
10861 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10862 VTY_NEWLINE);
10863 return CMD_WARNING;
10864 }
10865
10866 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10867 (argc == 4) ? argv[3] : argv[2],
10868 AFI_IP, safi, NULL, 1);
10869}
10870
10871ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
10872 show_bgp_ipv4_safi_rsclient_prefix_cmd,
10873 "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10874 SHOW_STR
10875 BGP_STR
10876 "Address family\n"
10877 "Address Family modifier\n"
10878 "Address Family modifier\n"
10879 "Information about Route Server Client\n"
10880 NEIGHBOR_ADDR_STR
10881 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
paulfee0f4c2004-09-13 05:12:46 +000010882
paul718e3742002-12-13 20:15:29 +000010883#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010884DEFUN (show_bgp_view_neighbor_routes,
10885 show_bgp_view_neighbor_routes_cmd,
10886 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10887 SHOW_STR
10888 BGP_STR
10889 "BGP view\n"
10890 "BGP view name\n"
10891 "Detailed information on TCP and BGP neighbor connections\n"
10892 "Neighbor to display information about\n"
10893 "Neighbor to display information about\n"
10894 "Display routes learned from neighbor\n")
10895{
10896 struct peer *peer;
10897
10898 if (argc == 2)
10899 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10900 else
10901 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10902
10903 if (! peer)
10904 return CMD_WARNING;
10905
10906 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10907 bgp_show_type_neighbor);
10908}
10909
10910ALIAS (show_bgp_view_neighbor_routes,
10911 show_bgp_view_ipv6_neighbor_routes_cmd,
10912 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10913 SHOW_STR
10914 BGP_STR
10915 "BGP view\n"
10916 "BGP view name\n"
10917 "Address family\n"
10918 "Detailed information on TCP and BGP neighbor connections\n"
10919 "Neighbor to display information about\n"
10920 "Neighbor to display information about\n"
10921 "Display routes learned from neighbor\n")
10922
10923DEFUN (show_bgp_view_neighbor_damp,
10924 show_bgp_view_neighbor_damp_cmd,
10925 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10926 SHOW_STR
10927 BGP_STR
10928 "BGP view\n"
10929 "BGP view name\n"
10930 "Detailed information on TCP and BGP neighbor connections\n"
10931 "Neighbor to display information about\n"
10932 "Neighbor to display information about\n"
10933 "Display the dampened routes received from neighbor\n")
10934{
10935 struct peer *peer;
10936
10937 if (argc == 2)
10938 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10939 else
10940 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10941
10942 if (! peer)
10943 return CMD_WARNING;
10944
10945 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10946 bgp_show_type_damp_neighbor);
10947}
10948
10949ALIAS (show_bgp_view_neighbor_damp,
10950 show_bgp_view_ipv6_neighbor_damp_cmd,
10951 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10952 SHOW_STR
10953 BGP_STR
10954 "BGP view\n"
10955 "BGP view name\n"
10956 "Address family\n"
10957 "Detailed information on TCP and BGP neighbor connections\n"
10958 "Neighbor to display information about\n"
10959 "Neighbor to display information about\n"
10960 "Display the dampened routes received from neighbor\n")
10961
10962DEFUN (show_bgp_view_neighbor_flap,
10963 show_bgp_view_neighbor_flap_cmd,
10964 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10965 SHOW_STR
10966 BGP_STR
10967 "BGP view\n"
10968 "BGP view name\n"
10969 "Detailed information on TCP and BGP neighbor connections\n"
10970 "Neighbor to display information about\n"
10971 "Neighbor to display information about\n"
10972 "Display flap statistics of the routes learned from neighbor\n")
10973{
10974 struct peer *peer;
10975
10976 if (argc == 2)
10977 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10978 else
10979 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10980
10981 if (! peer)
10982 return CMD_WARNING;
10983
10984 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10985 bgp_show_type_flap_neighbor);
10986}
10987
10988ALIAS (show_bgp_view_neighbor_flap,
10989 show_bgp_view_ipv6_neighbor_flap_cmd,
10990 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10991 SHOW_STR
10992 BGP_STR
10993 "BGP view\n"
10994 "BGP view name\n"
10995 "Address family\n"
10996 "Detailed information on TCP and BGP neighbor connections\n"
10997 "Neighbor to display information about\n"
10998 "Neighbor to display information about\n"
10999 "Display flap statistics of the routes learned from neighbor\n")
11000
11001ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011002 show_bgp_neighbor_routes_cmd,
11003 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
11004 SHOW_STR
11005 BGP_STR
11006 "Detailed information on TCP and BGP neighbor connections\n"
11007 "Neighbor to display information about\n"
11008 "Neighbor to display information about\n"
11009 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011010
paulbb46e942003-10-24 19:02:03 +000011011
11012ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011013 show_bgp_ipv6_neighbor_routes_cmd,
11014 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
11015 SHOW_STR
11016 BGP_STR
11017 "Address family\n"
11018 "Detailed information on TCP and BGP neighbor connections\n"
11019 "Neighbor to display information about\n"
11020 "Neighbor to display information about\n"
11021 "Display routes learned from neighbor\n")
11022
11023/* old command */
paulbb46e942003-10-24 19:02:03 +000011024ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000011025 ipv6_bgp_neighbor_routes_cmd,
11026 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
11027 SHOW_STR
11028 IPV6_STR
11029 BGP_STR
11030 "Detailed information on TCP and BGP neighbor connections\n"
11031 "Neighbor to display information about\n"
11032 "Neighbor to display information about\n"
11033 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000011034
11035/* old command */
11036DEFUN (ipv6_mbgp_neighbor_routes,
11037 ipv6_mbgp_neighbor_routes_cmd,
11038 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
11039 SHOW_STR
11040 IPV6_STR
11041 MBGP_STR
11042 "Detailed information on TCP and BGP neighbor connections\n"
11043 "Neighbor to display information about\n"
11044 "Neighbor to display information about\n"
11045 "Display routes learned from neighbor\n")
11046{
paulbb46e942003-10-24 19:02:03 +000011047 struct peer *peer;
11048
11049 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11050 if (! peer)
11051 return CMD_WARNING;
11052
11053 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000011054 bgp_show_type_neighbor);
11055}
paulbb46e942003-10-24 19:02:03 +000011056
11057ALIAS (show_bgp_view_neighbor_flap,
11058 show_bgp_neighbor_flap_cmd,
11059 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11060 SHOW_STR
11061 BGP_STR
11062 "Detailed information on TCP and BGP neighbor connections\n"
11063 "Neighbor to display information about\n"
11064 "Neighbor to display information about\n"
11065 "Display flap statistics of the routes learned from neighbor\n")
11066
11067ALIAS (show_bgp_view_neighbor_flap,
11068 show_bgp_ipv6_neighbor_flap_cmd,
11069 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11070 SHOW_STR
11071 BGP_STR
11072 "Address family\n"
11073 "Detailed information on TCP and BGP neighbor connections\n"
11074 "Neighbor to display information about\n"
11075 "Neighbor to display information about\n"
11076 "Display flap statistics of the routes learned from neighbor\n")
11077
11078ALIAS (show_bgp_view_neighbor_damp,
11079 show_bgp_neighbor_damp_cmd,
11080 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11081 SHOW_STR
11082 BGP_STR
11083 "Detailed information on TCP and BGP neighbor connections\n"
11084 "Neighbor to display information about\n"
11085 "Neighbor to display information about\n"
11086 "Display the dampened routes received from neighbor\n")
11087
11088ALIAS (show_bgp_view_neighbor_damp,
11089 show_bgp_ipv6_neighbor_damp_cmd,
11090 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11091 SHOW_STR
11092 BGP_STR
11093 "Address family\n"
11094 "Detailed information on TCP and BGP neighbor connections\n"
11095 "Neighbor to display information about\n"
11096 "Neighbor to display information about\n"
paulc001ae62003-11-03 12:37:43 +000011097 "Display the dampened routes received from neighbor\n")
paulfee0f4c2004-09-13 05:12:46 +000011098
11099DEFUN (show_bgp_view_rsclient,
11100 show_bgp_view_rsclient_cmd,
11101 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
11102 SHOW_STR
11103 BGP_STR
11104 "BGP view\n"
11105 "BGP view name\n"
11106 "Information about Route Server Client\n"
11107 NEIGHBOR_ADDR_STR)
11108{
11109 struct bgp_table *table;
11110 struct peer *peer;
11111
11112 if (argc == 2)
11113 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11114 else
11115 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11116
11117 if (! peer)
11118 return CMD_WARNING;
11119
11120 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11121 {
11122 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11123 VTY_NEWLINE);
11124 return CMD_WARNING;
11125 }
11126
11127 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11128 PEER_FLAG_RSERVER_CLIENT))
11129 {
11130 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11131 VTY_NEWLINE);
11132 return CMD_WARNING;
11133 }
11134
11135 table = peer->rib[AFI_IP6][SAFI_UNICAST];
11136
ajs5a646652004-11-05 01:25:55 +000011137 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000011138}
11139
11140ALIAS (show_bgp_view_rsclient,
11141 show_bgp_rsclient_cmd,
11142 "show bgp rsclient (A.B.C.D|X:X::X:X)",
11143 SHOW_STR
11144 BGP_STR
11145 "Information about Route Server Client\n"
11146 NEIGHBOR_ADDR_STR)
11147
Michael Lambert95cbbd22010-07-23 14:43:04 -040011148DEFUN (show_bgp_view_ipv6_safi_rsclient,
11149 show_bgp_view_ipv6_safi_rsclient_cmd,
11150 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11151 SHOW_STR
11152 BGP_STR
11153 "BGP view\n"
11154 "BGP view name\n"
11155 "Address family\n"
11156 "Address Family modifier\n"
11157 "Address Family modifier\n"
11158 "Information about Route Server Client\n"
11159 NEIGHBOR_ADDR_STR)
11160{
11161 struct bgp_table *table;
11162 struct peer *peer;
11163 safi_t safi;
11164
11165 if (argc == 3) {
11166 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11167 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11168 } else {
11169 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11170 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11171 }
11172
11173 if (! peer)
11174 return CMD_WARNING;
11175
11176 if (! peer->afc[AFI_IP6][safi])
11177 {
11178 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11179 VTY_NEWLINE);
11180 return CMD_WARNING;
11181 }
11182
11183 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11184 PEER_FLAG_RSERVER_CLIENT))
11185 {
11186 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11187 VTY_NEWLINE);
11188 return CMD_WARNING;
11189 }
11190
11191 table = peer->rib[AFI_IP6][safi];
11192
11193 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
11194}
11195
11196ALIAS (show_bgp_view_ipv6_safi_rsclient,
11197 show_bgp_ipv6_safi_rsclient_cmd,
11198 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11199 SHOW_STR
11200 BGP_STR
11201 "Address family\n"
11202 "Address Family modifier\n"
11203 "Address Family modifier\n"
11204 "Information about Route Server Client\n"
11205 NEIGHBOR_ADDR_STR)
11206
paulfee0f4c2004-09-13 05:12:46 +000011207DEFUN (show_bgp_view_rsclient_route,
11208 show_bgp_view_rsclient_route_cmd,
11209 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11210 SHOW_STR
11211 BGP_STR
11212 "BGP view\n"
11213 "BGP view name\n"
11214 "Information about Route Server Client\n"
11215 NEIGHBOR_ADDR_STR
11216 "Network in the BGP routing table to display\n")
11217{
11218 struct bgp *bgp;
11219 struct peer *peer;
11220
11221 /* BGP structure lookup. */
11222 if (argc == 3)
11223 {
11224 bgp = bgp_lookup_by_name (argv[0]);
11225 if (bgp == NULL)
11226 {
11227 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11228 return CMD_WARNING;
11229 }
11230 }
11231 else
11232 {
11233 bgp = bgp_get_default ();
11234 if (bgp == NULL)
11235 {
11236 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11237 return CMD_WARNING;
11238 }
11239 }
11240
11241 if (argc == 3)
11242 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11243 else
11244 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11245
11246 if (! peer)
11247 return CMD_WARNING;
11248
11249 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11250 {
11251 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11252 VTY_NEWLINE);
11253 return CMD_WARNING;
11254 }
11255
11256 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11257 PEER_FLAG_RSERVER_CLIENT))
11258 {
11259 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11260 VTY_NEWLINE);
11261 return CMD_WARNING;
11262 }
11263
11264 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11265 (argc == 3) ? argv[2] : argv[1],
11266 AFI_IP6, SAFI_UNICAST, NULL, 0);
11267}
11268
11269ALIAS (show_bgp_view_rsclient_route,
11270 show_bgp_rsclient_route_cmd,
11271 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11272 SHOW_STR
11273 BGP_STR
11274 "Information about Route Server Client\n"
11275 NEIGHBOR_ADDR_STR
11276 "Network in the BGP routing table to display\n")
11277
Michael Lambert95cbbd22010-07-23 14:43:04 -040011278DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
11279 show_bgp_view_ipv6_safi_rsclient_route_cmd,
11280 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11281 SHOW_STR
11282 BGP_STR
11283 "BGP view\n"
11284 "BGP view name\n"
11285 "Address family\n"
11286 "Address Family modifier\n"
11287 "Address Family modifier\n"
11288 "Information about Route Server Client\n"
11289 NEIGHBOR_ADDR_STR
11290 "Network in the BGP routing table to display\n")
11291{
11292 struct bgp *bgp;
11293 struct peer *peer;
11294 safi_t safi;
11295
11296 /* BGP structure lookup. */
11297 if (argc == 4)
11298 {
11299 bgp = bgp_lookup_by_name (argv[0]);
11300 if (bgp == NULL)
11301 {
11302 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11303 return CMD_WARNING;
11304 }
11305 }
11306 else
11307 {
11308 bgp = bgp_get_default ();
11309 if (bgp == NULL)
11310 {
11311 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11312 return CMD_WARNING;
11313 }
11314 }
11315
11316 if (argc == 4) {
11317 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11318 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11319 } else {
11320 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11321 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11322 }
11323
11324 if (! peer)
11325 return CMD_WARNING;
11326
11327 if (! peer->afc[AFI_IP6][safi])
11328 {
11329 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11330 VTY_NEWLINE);
11331 return CMD_WARNING;
11332}
11333
11334 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11335 PEER_FLAG_RSERVER_CLIENT))
11336 {
11337 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11338 VTY_NEWLINE);
11339 return CMD_WARNING;
11340 }
11341
11342 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11343 (argc == 4) ? argv[3] : argv[2],
11344 AFI_IP6, safi, NULL, 0);
11345}
11346
11347ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
11348 show_bgp_ipv6_safi_rsclient_route_cmd,
11349 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11350 SHOW_STR
11351 BGP_STR
11352 "Address family\n"
11353 "Address Family modifier\n"
11354 "Address Family modifier\n"
11355 "Information about Route Server Client\n"
11356 NEIGHBOR_ADDR_STR
11357 "Network in the BGP routing table to display\n")
11358
paulfee0f4c2004-09-13 05:12:46 +000011359DEFUN (show_bgp_view_rsclient_prefix,
11360 show_bgp_view_rsclient_prefix_cmd,
11361 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11362 SHOW_STR
11363 BGP_STR
11364 "BGP view\n"
11365 "BGP view name\n"
11366 "Information about Route Server Client\n"
11367 NEIGHBOR_ADDR_STR
11368 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11369{
11370 struct bgp *bgp;
11371 struct peer *peer;
11372
11373 /* BGP structure lookup. */
11374 if (argc == 3)
11375 {
11376 bgp = bgp_lookup_by_name (argv[0]);
11377 if (bgp == NULL)
11378 {
11379 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11380 return CMD_WARNING;
11381 }
11382 }
11383 else
11384 {
11385 bgp = bgp_get_default ();
11386 if (bgp == NULL)
11387 {
11388 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11389 return CMD_WARNING;
11390 }
11391 }
11392
11393 if (argc == 3)
11394 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11395 else
11396 peer = peer_lookup_in_view (vty, NULL, argv[0]);
11397
11398 if (! peer)
11399 return CMD_WARNING;
11400
11401 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11402 {
11403 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11404 VTY_NEWLINE);
11405 return CMD_WARNING;
11406 }
11407
11408 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11409 PEER_FLAG_RSERVER_CLIENT))
11410 {
11411 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11412 VTY_NEWLINE);
11413 return CMD_WARNING;
11414 }
11415
11416 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11417 (argc == 3) ? argv[2] : argv[1],
11418 AFI_IP6, SAFI_UNICAST, NULL, 1);
11419}
11420
11421ALIAS (show_bgp_view_rsclient_prefix,
11422 show_bgp_rsclient_prefix_cmd,
11423 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11424 SHOW_STR
11425 BGP_STR
11426 "Information about Route Server Client\n"
11427 NEIGHBOR_ADDR_STR
11428 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11429
Michael Lambert95cbbd22010-07-23 14:43:04 -040011430DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
11431 show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
11432 "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11433 SHOW_STR
11434 BGP_STR
11435 "BGP view\n"
11436 "BGP view name\n"
11437 "Address family\n"
11438 "Address Family modifier\n"
11439 "Address Family modifier\n"
11440 "Information about Route Server Client\n"
11441 NEIGHBOR_ADDR_STR
11442 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11443{
11444 struct bgp *bgp;
11445 struct peer *peer;
11446 safi_t safi;
11447
11448 /* BGP structure lookup. */
11449 if (argc == 4)
11450 {
11451 bgp = bgp_lookup_by_name (argv[0]);
11452 if (bgp == NULL)
11453 {
11454 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11455 return CMD_WARNING;
11456 }
11457 }
11458 else
11459 {
11460 bgp = bgp_get_default ();
11461 if (bgp == NULL)
11462 {
11463 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11464 return CMD_WARNING;
11465 }
11466 }
11467
11468 if (argc == 4) {
11469 peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11470 safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11471 } else {
11472 peer = peer_lookup_in_view (vty, NULL, argv[1]);
11473 safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11474 }
11475
11476 if (! peer)
11477 return CMD_WARNING;
11478
11479 if (! peer->afc[AFI_IP6][safi])
11480 {
11481 vty_out (vty, "%% Activate the neighbor for the address family first%s",
11482 VTY_NEWLINE);
11483 return CMD_WARNING;
11484}
11485
11486 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11487 PEER_FLAG_RSERVER_CLIENT))
11488{
11489 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11490 VTY_NEWLINE);
11491 return CMD_WARNING;
11492 }
11493
11494 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11495 (argc == 4) ? argv[3] : argv[2],
11496 AFI_IP6, safi, NULL, 1);
11497}
11498
11499ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
11500 show_bgp_ipv6_safi_rsclient_prefix_cmd,
11501 "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11502 SHOW_STR
11503 BGP_STR
11504 "Address family\n"
11505 "Address Family modifier\n"
11506 "Address Family modifier\n"
11507 "Information about Route Server Client\n"
11508 NEIGHBOR_ADDR_STR
11509 "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11510
paul718e3742002-12-13 20:15:29 +000011511#endif /* HAVE_IPV6 */
11512
11513struct bgp_table *bgp_distance_table;
11514
11515struct bgp_distance
11516{
11517 /* Distance value for the IP source prefix. */
11518 u_char distance;
11519
11520 /* Name of the access-list to be matched. */
11521 char *access_list;
11522};
11523
paul94f2b392005-06-28 12:44:16 +000011524static struct bgp_distance *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080011525bgp_distance_new (void)
paul718e3742002-12-13 20:15:29 +000011526{
Stephen Hemminger393deb92008-08-18 14:13:29 -070011527 return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
paul718e3742002-12-13 20:15:29 +000011528}
11529
paul94f2b392005-06-28 12:44:16 +000011530static void
paul718e3742002-12-13 20:15:29 +000011531bgp_distance_free (struct bgp_distance *bdistance)
11532{
11533 XFREE (MTYPE_BGP_DISTANCE, bdistance);
11534}
11535
paul94f2b392005-06-28 12:44:16 +000011536static int
paulfd79ac92004-10-13 05:06:08 +000011537bgp_distance_set (struct vty *vty, const char *distance_str,
11538 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011539{
11540 int ret;
11541 struct prefix_ipv4 p;
11542 u_char distance;
11543 struct bgp_node *rn;
11544 struct bgp_distance *bdistance;
11545
11546 ret = str2prefix_ipv4 (ip_str, &p);
11547 if (ret == 0)
11548 {
11549 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11550 return CMD_WARNING;
11551 }
11552
11553 distance = atoi (distance_str);
11554
11555 /* Get BGP distance node. */
11556 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
11557 if (rn->info)
11558 {
11559 bdistance = rn->info;
11560 bgp_unlock_node (rn);
11561 }
11562 else
11563 {
11564 bdistance = bgp_distance_new ();
11565 rn->info = bdistance;
11566 }
11567
11568 /* Set distance value. */
11569 bdistance->distance = distance;
11570
11571 /* Reset access-list configuration. */
11572 if (bdistance->access_list)
11573 {
11574 free (bdistance->access_list);
11575 bdistance->access_list = NULL;
11576 }
11577 if (access_list_str)
11578 bdistance->access_list = strdup (access_list_str);
11579
11580 return CMD_SUCCESS;
11581}
11582
paul94f2b392005-06-28 12:44:16 +000011583static int
paulfd79ac92004-10-13 05:06:08 +000011584bgp_distance_unset (struct vty *vty, const char *distance_str,
11585 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000011586{
11587 int ret;
11588 struct prefix_ipv4 p;
11589 u_char distance;
11590 struct bgp_node *rn;
11591 struct bgp_distance *bdistance;
11592
11593 ret = str2prefix_ipv4 (ip_str, &p);
11594 if (ret == 0)
11595 {
11596 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11597 return CMD_WARNING;
11598 }
11599
11600 distance = atoi (distance_str);
11601
11602 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
11603 if (! rn)
11604 {
11605 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
11606 return CMD_WARNING;
11607 }
11608
11609 bdistance = rn->info;
11610
11611 if (bdistance->access_list)
11612 free (bdistance->access_list);
11613 bgp_distance_free (bdistance);
11614
11615 rn->info = NULL;
11616 bgp_unlock_node (rn);
11617 bgp_unlock_node (rn);
11618
11619 return CMD_SUCCESS;
11620}
11621
paul718e3742002-12-13 20:15:29 +000011622/* Apply BGP information to distance method. */
11623u_char
11624bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
11625{
11626 struct bgp_node *rn;
11627 struct prefix_ipv4 q;
11628 struct peer *peer;
11629 struct bgp_distance *bdistance;
11630 struct access_list *alist;
11631 struct bgp_static *bgp_static;
11632
11633 if (! bgp)
11634 return 0;
11635
11636 if (p->family != AF_INET)
11637 return 0;
11638
11639 peer = rinfo->peer;
11640
11641 if (peer->su.sa.sa_family != AF_INET)
11642 return 0;
11643
11644 memset (&q, 0, sizeof (struct prefix_ipv4));
11645 q.family = AF_INET;
11646 q.prefix = peer->su.sin.sin_addr;
11647 q.prefixlen = IPV4_MAX_BITLEN;
11648
11649 /* Check source address. */
11650 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11651 if (rn)
11652 {
11653 bdistance = rn->info;
11654 bgp_unlock_node (rn);
11655
11656 if (bdistance->access_list)
11657 {
11658 alist = access_list_lookup (AFI_IP, bdistance->access_list);
11659 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11660 return bdistance->distance;
11661 }
11662 else
11663 return bdistance->distance;
11664 }
11665
11666 /* Backdoor check. */
11667 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11668 if (rn)
11669 {
11670 bgp_static = rn->info;
11671 bgp_unlock_node (rn);
11672
11673 if (bgp_static->backdoor)
11674 {
11675 if (bgp->distance_local)
11676 return bgp->distance_local;
11677 else
11678 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11679 }
11680 }
11681
11682 if (peer_sort (peer) == BGP_PEER_EBGP)
11683 {
11684 if (bgp->distance_ebgp)
11685 return bgp->distance_ebgp;
11686 return ZEBRA_EBGP_DISTANCE_DEFAULT;
11687 }
11688 else
11689 {
11690 if (bgp->distance_ibgp)
11691 return bgp->distance_ibgp;
11692 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11693 }
11694}
11695
11696DEFUN (bgp_distance,
11697 bgp_distance_cmd,
11698 "distance bgp <1-255> <1-255> <1-255>",
11699 "Define an administrative distance\n"
11700 "BGP distance\n"
11701 "Distance for routes external to the AS\n"
11702 "Distance for routes internal to the AS\n"
11703 "Distance for local routes\n")
11704{
11705 struct bgp *bgp;
11706
11707 bgp = vty->index;
11708
11709 bgp->distance_ebgp = atoi (argv[0]);
11710 bgp->distance_ibgp = atoi (argv[1]);
11711 bgp->distance_local = atoi (argv[2]);
11712 return CMD_SUCCESS;
11713}
11714
11715DEFUN (no_bgp_distance,
11716 no_bgp_distance_cmd,
11717 "no distance bgp <1-255> <1-255> <1-255>",
11718 NO_STR
11719 "Define an administrative distance\n"
11720 "BGP distance\n"
11721 "Distance for routes external to the AS\n"
11722 "Distance for routes internal to the AS\n"
11723 "Distance for local routes\n")
11724{
11725 struct bgp *bgp;
11726
11727 bgp = vty->index;
11728
11729 bgp->distance_ebgp= 0;
11730 bgp->distance_ibgp = 0;
11731 bgp->distance_local = 0;
11732 return CMD_SUCCESS;
11733}
11734
11735ALIAS (no_bgp_distance,
11736 no_bgp_distance2_cmd,
11737 "no distance bgp",
11738 NO_STR
11739 "Define an administrative distance\n"
11740 "BGP distance\n")
11741
11742DEFUN (bgp_distance_source,
11743 bgp_distance_source_cmd,
11744 "distance <1-255> A.B.C.D/M",
11745 "Define an administrative distance\n"
11746 "Administrative distance\n"
11747 "IP source prefix\n")
11748{
11749 bgp_distance_set (vty, argv[0], argv[1], NULL);
11750 return CMD_SUCCESS;
11751}
11752
11753DEFUN (no_bgp_distance_source,
11754 no_bgp_distance_source_cmd,
11755 "no distance <1-255> A.B.C.D/M",
11756 NO_STR
11757 "Define an administrative distance\n"
11758 "Administrative distance\n"
11759 "IP source prefix\n")
11760{
11761 bgp_distance_unset (vty, argv[0], argv[1], NULL);
11762 return CMD_SUCCESS;
11763}
11764
11765DEFUN (bgp_distance_source_access_list,
11766 bgp_distance_source_access_list_cmd,
11767 "distance <1-255> A.B.C.D/M WORD",
11768 "Define an administrative distance\n"
11769 "Administrative distance\n"
11770 "IP source prefix\n"
11771 "Access list name\n")
11772{
11773 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11774 return CMD_SUCCESS;
11775}
11776
11777DEFUN (no_bgp_distance_source_access_list,
11778 no_bgp_distance_source_access_list_cmd,
11779 "no distance <1-255> A.B.C.D/M WORD",
11780 NO_STR
11781 "Define an administrative distance\n"
11782 "Administrative distance\n"
11783 "IP source prefix\n"
11784 "Access list name\n")
11785{
11786 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11787 return CMD_SUCCESS;
11788}
11789
11790DEFUN (bgp_damp_set,
11791 bgp_damp_set_cmd,
11792 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11793 "BGP Specific commands\n"
11794 "Enable route-flap dampening\n"
11795 "Half-life time for the penalty\n"
11796 "Value to start reusing a route\n"
11797 "Value to start suppressing a route\n"
11798 "Maximum duration to suppress a stable route\n")
11799{
11800 struct bgp *bgp;
11801 int half = DEFAULT_HALF_LIFE * 60;
11802 int reuse = DEFAULT_REUSE;
11803 int suppress = DEFAULT_SUPPRESS;
11804 int max = 4 * half;
11805
11806 if (argc == 4)
11807 {
11808 half = atoi (argv[0]) * 60;
11809 reuse = atoi (argv[1]);
11810 suppress = atoi (argv[2]);
11811 max = atoi (argv[3]) * 60;
11812 }
11813 else if (argc == 1)
11814 {
11815 half = atoi (argv[0]) * 60;
11816 max = 4 * half;
11817 }
11818
11819 bgp = vty->index;
11820 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11821 half, reuse, suppress, max);
11822}
11823
11824ALIAS (bgp_damp_set,
11825 bgp_damp_set2_cmd,
11826 "bgp dampening <1-45>",
11827 "BGP Specific commands\n"
11828 "Enable route-flap dampening\n"
11829 "Half-life time for the penalty\n")
11830
11831ALIAS (bgp_damp_set,
11832 bgp_damp_set3_cmd,
11833 "bgp dampening",
11834 "BGP Specific commands\n"
11835 "Enable route-flap dampening\n")
11836
11837DEFUN (bgp_damp_unset,
11838 bgp_damp_unset_cmd,
11839 "no bgp dampening",
11840 NO_STR
11841 "BGP Specific commands\n"
11842 "Enable route-flap dampening\n")
11843{
11844 struct bgp *bgp;
11845
11846 bgp = vty->index;
11847 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11848}
11849
11850ALIAS (bgp_damp_unset,
11851 bgp_damp_unset2_cmd,
11852 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11853 NO_STR
11854 "BGP Specific commands\n"
11855 "Enable route-flap dampening\n"
11856 "Half-life time for the penalty\n"
11857 "Value to start reusing a route\n"
11858 "Value to start suppressing a route\n"
11859 "Maximum duration to suppress a stable route\n")
11860
11861DEFUN (show_ip_bgp_dampened_paths,
11862 show_ip_bgp_dampened_paths_cmd,
11863 "show ip bgp dampened-paths",
11864 SHOW_STR
11865 IP_STR
11866 BGP_STR
11867 "Display paths suppressed due to dampening\n")
11868{
ajs5a646652004-11-05 01:25:55 +000011869 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11870 NULL);
paul718e3742002-12-13 20:15:29 +000011871}
11872
11873DEFUN (show_ip_bgp_flap_statistics,
11874 show_ip_bgp_flap_statistics_cmd,
11875 "show ip bgp flap-statistics",
11876 SHOW_STR
11877 IP_STR
11878 BGP_STR
11879 "Display flap statistics of routes\n")
11880{
ajs5a646652004-11-05 01:25:55 +000011881 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11882 bgp_show_type_flap_statistics, NULL);
paul718e3742002-12-13 20:15:29 +000011883}
11884
11885/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +000011886static int
paulfd79ac92004-10-13 05:06:08 +000011887bgp_clear_damp_route (struct vty *vty, const char *view_name,
11888 const char *ip_str, afi_t afi, safi_t safi,
11889 struct prefix_rd *prd, int prefix_check)
paul718e3742002-12-13 20:15:29 +000011890{
11891 int ret;
11892 struct prefix match;
11893 struct bgp_node *rn;
11894 struct bgp_node *rm;
11895 struct bgp_info *ri;
11896 struct bgp_info *ri_temp;
11897 struct bgp *bgp;
11898 struct bgp_table *table;
11899
11900 /* BGP structure lookup. */
11901 if (view_name)
11902 {
11903 bgp = bgp_lookup_by_name (view_name);
11904 if (bgp == NULL)
11905 {
11906 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11907 return CMD_WARNING;
11908 }
11909 }
11910 else
11911 {
11912 bgp = bgp_get_default ();
11913 if (bgp == NULL)
11914 {
11915 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11916 return CMD_WARNING;
11917 }
11918 }
11919
11920 /* Check IP address argument. */
11921 ret = str2prefix (ip_str, &match);
11922 if (! ret)
11923 {
11924 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
11925 return CMD_WARNING;
11926 }
11927
11928 match.family = afi2family (afi);
11929
11930 if (safi == SAFI_MPLS_VPN)
11931 {
11932 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
11933 {
11934 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
11935 continue;
11936
11937 if ((table = rn->info) != NULL)
11938 if ((rm = bgp_node_match (table, &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000011939 {
11940 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
11941 {
11942 ri = rm->info;
11943 while (ri)
11944 {
11945 if (ri->extra && ri->extra->damp_info)
11946 {
11947 ri_temp = ri->next;
11948 bgp_damp_info_free (ri->extra->damp_info, 1);
11949 ri = ri_temp;
11950 }
11951 else
11952 ri = ri->next;
11953 }
11954 }
11955
11956 bgp_unlock_node (rm);
11957 }
paul718e3742002-12-13 20:15:29 +000011958 }
11959 }
11960 else
11961 {
11962 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
Chris Caputo6c88b442010-07-27 16:28:55 +000011963 {
11964 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
11965 {
11966 ri = rn->info;
11967 while (ri)
11968 {
11969 if (ri->extra && ri->extra->damp_info)
11970 {
11971 ri_temp = ri->next;
11972 bgp_damp_info_free (ri->extra->damp_info, 1);
11973 ri = ri_temp;
11974 }
11975 else
11976 ri = ri->next;
11977 }
11978 }
11979
11980 bgp_unlock_node (rn);
11981 }
paul718e3742002-12-13 20:15:29 +000011982 }
11983
11984 return CMD_SUCCESS;
11985}
11986
11987DEFUN (clear_ip_bgp_dampening,
11988 clear_ip_bgp_dampening_cmd,
11989 "clear ip bgp dampening",
11990 CLEAR_STR
11991 IP_STR
11992 BGP_STR
11993 "Clear route flap dampening information\n")
11994{
11995 bgp_damp_info_clean ();
11996 return CMD_SUCCESS;
11997}
11998
11999DEFUN (clear_ip_bgp_dampening_prefix,
12000 clear_ip_bgp_dampening_prefix_cmd,
12001 "clear ip bgp dampening A.B.C.D/M",
12002 CLEAR_STR
12003 IP_STR
12004 BGP_STR
12005 "Clear route flap dampening information\n"
12006 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
12007{
12008 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12009 SAFI_UNICAST, NULL, 1);
12010}
12011
12012DEFUN (clear_ip_bgp_dampening_address,
12013 clear_ip_bgp_dampening_address_cmd,
12014 "clear ip bgp dampening A.B.C.D",
12015 CLEAR_STR
12016 IP_STR
12017 BGP_STR
12018 "Clear route flap dampening information\n"
12019 "Network to clear damping information\n")
12020{
12021 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12022 SAFI_UNICAST, NULL, 0);
12023}
12024
12025DEFUN (clear_ip_bgp_dampening_address_mask,
12026 clear_ip_bgp_dampening_address_mask_cmd,
12027 "clear ip bgp dampening A.B.C.D A.B.C.D",
12028 CLEAR_STR
12029 IP_STR
12030 BGP_STR
12031 "Clear route flap dampening information\n"
12032 "Network to clear damping information\n"
12033 "Network mask\n")
12034{
12035 int ret;
12036 char prefix_str[BUFSIZ];
12037
12038 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
12039 if (! ret)
12040 {
12041 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
12042 return CMD_WARNING;
12043 }
12044
12045 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
12046 SAFI_UNICAST, NULL, 0);
12047}
12048
paul94f2b392005-06-28 12:44:16 +000012049static int
paul718e3742002-12-13 20:15:29 +000012050bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
12051 afi_t afi, safi_t safi, int *write)
12052{
12053 struct bgp_node *prn;
12054 struct bgp_node *rn;
12055 struct bgp_table *table;
12056 struct prefix *p;
12057 struct prefix_rd *prd;
12058 struct bgp_static *bgp_static;
12059 u_int32_t label;
12060 char buf[SU_ADDRSTRLEN];
12061 char rdbuf[RD_ADDRSTRLEN];
12062
12063 /* Network configuration. */
12064 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
12065 if ((table = prn->info) != NULL)
12066 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
12067 if ((bgp_static = rn->info) != NULL)
12068 {
12069 p = &rn->p;
12070 prd = (struct prefix_rd *) &prn->p;
12071
12072 /* "address-family" display. */
12073 bgp_config_write_family_header (vty, afi, safi, write);
12074
12075 /* "network" configuration display. */
12076 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
12077 label = decode_label (bgp_static->tag);
12078
12079 vty_out (vty, " network %s/%d rd %s tag %d",
12080 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12081 p->prefixlen,
12082 rdbuf, label);
12083 vty_out (vty, "%s", VTY_NEWLINE);
12084 }
12085 return 0;
12086}
12087
12088/* Configuration of static route announcement and aggregate
12089 information. */
12090int
12091bgp_config_write_network (struct vty *vty, struct bgp *bgp,
12092 afi_t afi, safi_t safi, int *write)
12093{
12094 struct bgp_node *rn;
12095 struct prefix *p;
12096 struct bgp_static *bgp_static;
12097 struct bgp_aggregate *bgp_aggregate;
12098 char buf[SU_ADDRSTRLEN];
12099
12100 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
12101 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
12102
12103 /* Network configuration. */
12104 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
12105 if ((bgp_static = rn->info) != NULL)
12106 {
12107 p = &rn->p;
12108
12109 /* "address-family" display. */
12110 bgp_config_write_family_header (vty, afi, safi, write);
12111
12112 /* "network" configuration display. */
12113 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12114 {
12115 u_int32_t destination;
12116 struct in_addr netmask;
12117
12118 destination = ntohl (p->u.prefix4.s_addr);
12119 masklen2ip (p->prefixlen, &netmask);
12120 vty_out (vty, " network %s",
12121 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
12122
12123 if ((IN_CLASSC (destination) && p->prefixlen == 24)
12124 || (IN_CLASSB (destination) && p->prefixlen == 16)
12125 || (IN_CLASSA (destination) && p->prefixlen == 8)
12126 || p->u.prefix4.s_addr == 0)
12127 {
12128 /* Natural mask is not display. */
12129 }
12130 else
12131 vty_out (vty, " mask %s", inet_ntoa (netmask));
12132 }
12133 else
12134 {
12135 vty_out (vty, " network %s/%d",
12136 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12137 p->prefixlen);
12138 }
12139
12140 if (bgp_static->rmap.name)
12141 vty_out (vty, " route-map %s", bgp_static->rmap.name);
Paul Jakma41367172007-08-06 15:24:51 +000012142 else
12143 {
12144 if (bgp_static->backdoor)
12145 vty_out (vty, " backdoor");
Paul Jakma41367172007-08-06 15:24:51 +000012146 }
paul718e3742002-12-13 20:15:29 +000012147
12148 vty_out (vty, "%s", VTY_NEWLINE);
12149 }
12150
12151 /* Aggregate-address configuration. */
12152 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
12153 if ((bgp_aggregate = rn->info) != NULL)
12154 {
12155 p = &rn->p;
12156
12157 /* "address-family" display. */
12158 bgp_config_write_family_header (vty, afi, safi, write);
12159
12160 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12161 {
12162 struct in_addr netmask;
12163
12164 masklen2ip (p->prefixlen, &netmask);
12165 vty_out (vty, " aggregate-address %s %s",
12166 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12167 inet_ntoa (netmask));
12168 }
12169 else
12170 {
12171 vty_out (vty, " aggregate-address %s/%d",
12172 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12173 p->prefixlen);
12174 }
12175
12176 if (bgp_aggregate->as_set)
12177 vty_out (vty, " as-set");
12178
12179 if (bgp_aggregate->summary_only)
12180 vty_out (vty, " summary-only");
12181
12182 vty_out (vty, "%s", VTY_NEWLINE);
12183 }
12184
12185 return 0;
12186}
12187
12188int
12189bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
12190{
12191 struct bgp_node *rn;
12192 struct bgp_distance *bdistance;
12193
12194 /* Distance configuration. */
12195 if (bgp->distance_ebgp
12196 && bgp->distance_ibgp
12197 && bgp->distance_local
12198 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
12199 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
12200 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
12201 vty_out (vty, " distance bgp %d %d %d%s",
12202 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
12203 VTY_NEWLINE);
12204
12205 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
12206 if ((bdistance = rn->info) != NULL)
12207 {
12208 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
12209 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
12210 bdistance->access_list ? bdistance->access_list : "",
12211 VTY_NEWLINE);
12212 }
12213
12214 return 0;
12215}
12216
12217/* Allocate routing table structure and install commands. */
12218void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080012219bgp_route_init (void)
paul718e3742002-12-13 20:15:29 +000012220{
12221 /* Init BGP distance table. */
Paul Jakma64e580a2006-02-21 01:09:01 +000012222 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +000012223
12224 /* IPv4 BGP commands. */
12225 install_element (BGP_NODE, &bgp_network_cmd);
12226 install_element (BGP_NODE, &bgp_network_mask_cmd);
12227 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
12228 install_element (BGP_NODE, &bgp_network_route_map_cmd);
12229 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
12230 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
12231 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
12232 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
12233 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
12234 install_element (BGP_NODE, &no_bgp_network_cmd);
12235 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
12236 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
12237 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
12238 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
12239 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12240 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
12241 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
12242 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
12243
12244 install_element (BGP_NODE, &aggregate_address_cmd);
12245 install_element (BGP_NODE, &aggregate_address_mask_cmd);
12246 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
12247 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
12248 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
12249 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
12250 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
12251 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
12252 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
12253 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
12254 install_element (BGP_NODE, &no_aggregate_address_cmd);
12255 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
12256 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
12257 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
12258 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
12259 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
12260 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
12261 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
12262 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12263 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12264
12265 /* IPv4 unicast configuration. */
12266 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
12267 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
12268 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
12269 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
12270 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
12271 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012272 install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
paul718e3742002-12-13 20:15:29 +000012273 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
12274 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
12275 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
12276 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
12277 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012278
paul718e3742002-12-13 20:15:29 +000012279 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
12280 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
12281 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
12282 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
12283 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
12284 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
12285 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
12286 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
12287 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
12288 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
12289 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
12290 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
12291 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
12292 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
12293 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
12294 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
12295 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
12296 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
12297 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12298 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12299
12300 /* IPv4 multicast configuration. */
12301 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
12302 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
12303 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
12304 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
12305 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
12306 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
12307 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
12308 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
12309 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
12310 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
12311 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
12312 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12313 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
12314 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
12315 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
12316 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
12317 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
12318 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
12319 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
12320 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
12321 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
12322 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
12323 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
12324 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
12325 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
12326 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
12327 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
12328 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
12329 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
12330 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
12331 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12332 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12333
12334 install_element (VIEW_NODE, &show_ip_bgp_cmd);
12335 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012336 install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012337 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
12338 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012339 install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012340 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12341 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12342 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
12343 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012344 install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012345 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12346 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12347 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
12348 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
12349 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
12350 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
12351 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12352 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
12353 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12354 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
12355 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12356 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
12357 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12358 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
12359 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12360 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
12361 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12362 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
12363 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
12364 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
12365 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
12366 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
12367 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
12368 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
12369 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012370 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12371 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
12372 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
12373 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
12374 install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012375 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
12376 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
12377 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
12378 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
12379 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12380 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12381 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12382 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12383 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
12384 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12385 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
12386 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12387 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
12388 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12389 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12390 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12391 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12392 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012393 install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012394 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
12395 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12396 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12397 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12398 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
12399 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
12400 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
12401 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
12402 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12403 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
12404 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
12405 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12406 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12407 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
12408 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
12409 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012410 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012411 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012412 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012413 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012414 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012415 install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012416 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12417 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012418 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012419 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012420 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012421 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012422 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012423 install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012424
12425 /* Restricted node: VIEW_NODE - (set of dangerous commands) */
12426 install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
12427 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012428 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012429 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12430 install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
12431 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012432 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012433 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12434 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12435 install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
12436 install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
12437 install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
12438 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
12439 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
12440 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
12441 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
12442 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
12443 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
12444 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012445 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12446 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
12447 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
12448 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
12449 install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012450 install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
12451 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
12452 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
12453 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
12454 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12455 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12456 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12457 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12458 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012459 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012460 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012461 install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012462 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012463 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012464 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012465 install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012466
12467 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
12468 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012469 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012470 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
12471 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012472 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012473 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12474 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12475 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
12476 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012477 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012478 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12479 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12480 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
12481 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
12482 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
12483 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
12484 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12485 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
12486 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12487 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
12488 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12489 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
12490 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12491 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
12492 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12493 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
12494 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12495 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
12496 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
12497 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
12498 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
12499 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
12500 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
12501 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
12502 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012503 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12504 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
12505 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
12506 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
12507 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
paul718e3742002-12-13 20:15:29 +000012508 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
12509 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
12510 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
12511 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
12512 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12513 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12514 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12515 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12516 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
12517 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12518 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
12519 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12520 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
12521 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12522 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12523 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12524 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12525 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012526 install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
paul718e3742002-12-13 20:15:29 +000012527 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
12528 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12529 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12530 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12531 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
12532 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
12533 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
12534 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
12535 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12536 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
12537 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
12538 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12539 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12540 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
12541 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
12542 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012543 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012544 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012545 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012546 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012547 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012548 install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010012549 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12550 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012551 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012552 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012553 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012554 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012555 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012556 install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012557
12558 /* BGP dampening clear commands */
12559 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
12560 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
12561 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
12562 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
12563
Paul Jakmaff7924f2006-09-04 01:10:36 +000012564 /* prefix count */
12565 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
12566 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
12567 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
paul718e3742002-12-13 20:15:29 +000012568#ifdef HAVE_IPV6
Paul Jakmaff7924f2006-09-04 01:10:36 +000012569 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
12570
paul718e3742002-12-13 20:15:29 +000012571 /* New config IPv6 BGP commands. */
12572 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
12573 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
12574 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
12575 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
12576
12577 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
12578 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
12579 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
12580 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
12581
12582 /* Old config IPv6 BGP commands. */
12583 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
12584 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
12585
12586 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
12587 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
12588 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
12589 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
12590
12591 install_element (VIEW_NODE, &show_bgp_cmd);
12592 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012593 install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012594 install_element (VIEW_NODE, &show_bgp_route_cmd);
12595 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012596 install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012597 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
12598 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012599 install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012600 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
12601 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
12602 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
12603 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
12604 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
12605 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
12606 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
12607 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
12608 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
12609 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
12610 install_element (VIEW_NODE, &show_bgp_community_cmd);
12611 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
12612 install_element (VIEW_NODE, &show_bgp_community2_cmd);
12613 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
12614 install_element (VIEW_NODE, &show_bgp_community3_cmd);
12615 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
12616 install_element (VIEW_NODE, &show_bgp_community4_cmd);
12617 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
12618 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
12619 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
12620 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
12621 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
12622 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
12623 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
12624 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
12625 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
12626 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
12627 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
12628 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
12629 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12630 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
12631 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12632 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
12633 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12634 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
12635 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12636 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
12637 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12638 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12639 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012640 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
12641 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12642 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
12643 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012644 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012645 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012646 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012647 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012648 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012649 install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012650 install_element (VIEW_NODE, &show_bgp_view_cmd);
12651 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
12652 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
12653 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
12654 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
12655 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
12656 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12657 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12658 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12659 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12660 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
12661 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12662 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12663 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12664 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
12665 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12666 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
12667 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012668 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012669 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012670 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012671 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012672 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012673 install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012674
12675 /* Restricted:
12676 * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
12677 */
12678 install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
12679 install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012680 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012681 install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
12682 install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012683 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012684 install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
12685 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
12686 install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
12687 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
12688 install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
12689 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
12690 install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
12691 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
12692 install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
12693 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
12694 install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
12695 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
12696 install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
12697 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
12698 install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
12699 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
12700 install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012701 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012702 install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012703 install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012704 install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
12705 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
12706 install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
12707 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
12708 install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12709 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12710 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012711 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010012712 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012713 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012714
12715 install_element (ENABLE_NODE, &show_bgp_cmd);
12716 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012717 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
paul718e3742002-12-13 20:15:29 +000012718 install_element (ENABLE_NODE, &show_bgp_route_cmd);
12719 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012720 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
paul718e3742002-12-13 20:15:29 +000012721 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
12722 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012723 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000012724 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
12725 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
12726 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
12727 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
12728 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
12729 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
12730 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
12731 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
12732 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
12733 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
12734 install_element (ENABLE_NODE, &show_bgp_community_cmd);
12735 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
12736 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
12737 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
12738 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
12739 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
12740 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
12741 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
12742 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12743 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12744 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12745 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12746 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12747 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12748 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12749 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12750 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12751 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12752 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12753 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12754 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12755 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12756 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12757 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12758 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12759 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12760 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12761 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12762 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12763 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000012764 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12765 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12766 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12767 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012768 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012769 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012770 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012771 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012772 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012773 install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000012774 install_element (ENABLE_NODE, &show_bgp_view_cmd);
12775 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12776 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12777 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12778 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12779 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12780 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12781 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12782 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12783 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12784 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12785 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12786 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12787 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12788 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12789 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12790 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12791 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012792 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012793 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012794 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012795 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
paulfee0f4c2004-09-13 05:12:46 +000012796 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
Michael Lambert95cbbd22010-07-23 14:43:04 -040012797 install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
Paul Jakma2815e612006-09-14 02:56:07 +000012798
12799 /* Statistics */
12800 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12801 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12802 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12803 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12804
paul718e3742002-12-13 20:15:29 +000012805 /* old command */
12806 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12807 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12808 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12809 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12810 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12811 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12812 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12813 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12814 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12815 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12816 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12817 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12818 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12819 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12820 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12821 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12822 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12823 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12824 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12825 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12826 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12827 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12828 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12829 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12830 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12831 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12832 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12833 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12834 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12835 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12836 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12837 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12838 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12839 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12840 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12841 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
paulbb46e942003-10-24 19:02:03 +000012842
paul718e3742002-12-13 20:15:29 +000012843 /* old command */
12844 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12845 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12846 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12847 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12848 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12849 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12850 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12851 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12852 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12853 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12854 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12855 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12856 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12857 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12858 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12859 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12860 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12861 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12862 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12863 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12864 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12865 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12866 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12867 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12868 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12869 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12870 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12871 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12872 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12873 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12874 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12875 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12876 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12877 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12878 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12879 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12880
12881 /* old command */
12882 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12883 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12884 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12885 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12886
12887 /* old command */
12888 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12889 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12890 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12891 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12892
12893 /* old command */
12894 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12895 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12896 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12897 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12898#endif /* HAVE_IPV6 */
12899
12900 install_element (BGP_NODE, &bgp_distance_cmd);
12901 install_element (BGP_NODE, &no_bgp_distance_cmd);
12902 install_element (BGP_NODE, &no_bgp_distance2_cmd);
12903 install_element (BGP_NODE, &bgp_distance_source_cmd);
12904 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12905 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12906 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12907
12908 install_element (BGP_NODE, &bgp_damp_set_cmd);
12909 install_element (BGP_NODE, &bgp_damp_set2_cmd);
12910 install_element (BGP_NODE, &bgp_damp_set3_cmd);
12911 install_element (BGP_NODE, &bgp_damp_unset_cmd);
12912 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12913 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
12914 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
12915 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
12916 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
12917 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
Paul Jakmac8f3fe32010-12-05 20:28:02 +000012918
12919 /* Deprecated AS-Pathlimit commands */
12920 install_element (BGP_NODE, &bgp_network_ttl_cmd);
12921 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
12922 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
12923 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
12924 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12925 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12926
12927 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
12928 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
12929 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12930 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
12931 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12932 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12933
12934 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
12935 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
12936 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
12937 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
12938 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12939 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12940
12941 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
12942 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
12943 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12944 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
12945 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12946 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12947
12948 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
12949 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
12950 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
12951 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
12952 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12953 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12954
12955 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
12956 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
12957 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12958 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
12959 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12960 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12961
12962 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
12963 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
paul718e3742002-12-13 20:15:29 +000012964}
Chris Caputo228da422009-07-18 05:44:03 +000012965
12966void
12967bgp_route_finish (void)
12968{
12969 bgp_table_unlock (bgp_distance_table);
12970 bgp_distance_table = NULL;
12971}