blob: 7a57e13f0947291c20af6b07a2b834bea47af1e8 [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;
1571 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
1572 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
1573 bm->process_rsclient_queue->spec.del_item_data
1574 = bm->process_main_queue->spec.del_item_data;
1575 bm->process_main_queue->spec.max_retries
1576 = bm->process_main_queue->spec.max_retries = 0;
1577 bm->process_rsclient_queue->spec.hold
Paul Jakma09dd5612006-09-14 03:38:16 +00001578 = bm->process_main_queue->spec.hold = 50;
paul200df112005-06-01 11:17:05 +00001579}
1580
1581void
paulfee0f4c2004-09-13 05:12:46 +00001582bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1583{
paul200df112005-06-01 11:17:05 +00001584 struct bgp_process_queue *pqnode;
1585
1586 /* already scheduled for processing? */
1587 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1588 return;
1589
1590 if ( (bm->process_main_queue == NULL) ||
1591 (bm->process_rsclient_queue == NULL) )
1592 bgp_process_queue_init ();
1593
1594 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1595 sizeof (struct bgp_process_queue));
1596 if (!pqnode)
1597 return;
Chris Caputo228da422009-07-18 05:44:03 +00001598
1599 /* all unlocked in bgp_processq_del */
1600 bgp_table_lock (rn->table);
1601 pqnode->rn = bgp_lock_node (rn);
paul200df112005-06-01 11:17:05 +00001602 pqnode->bgp = bgp;
Chris Caputo228da422009-07-18 05:44:03 +00001603 bgp_lock (bgp);
paul200df112005-06-01 11:17:05 +00001604 pqnode->afi = afi;
1605 pqnode->safi = safi;
1606
paulfee0f4c2004-09-13 05:12:46 +00001607 switch (rn->table->type)
1608 {
paul200df112005-06-01 11:17:05 +00001609 case BGP_TABLE_MAIN:
1610 work_queue_add (bm->process_main_queue, pqnode);
1611 break;
1612 case BGP_TABLE_RSCLIENT:
1613 work_queue_add (bm->process_rsclient_queue, pqnode);
1614 break;
paulfee0f4c2004-09-13 05:12:46 +00001615 }
paul200df112005-06-01 11:17:05 +00001616
1617 return;
paulfee0f4c2004-09-13 05:12:46 +00001618}
hasso0a486e52005-02-01 20:57:17 +00001619
paul94f2b392005-06-28 12:44:16 +00001620static int
hasso0a486e52005-02-01 20:57:17 +00001621bgp_maximum_prefix_restart_timer (struct thread *thread)
1622{
1623 struct peer *peer;
1624
1625 peer = THREAD_ARG (thread);
1626 peer->t_pmax_restart = NULL;
1627
1628 if (BGP_DEBUG (events, EVENTS))
1629 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1630 peer->host);
1631
1632 peer_clear (peer);
1633
1634 return 0;
1635}
1636
paulfee0f4c2004-09-13 05:12:46 +00001637int
paul5228ad22004-06-04 17:58:18 +00001638bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1639 safi_t safi, int always)
paul718e3742002-12-13 20:15:29 +00001640{
hassoe0701b72004-05-20 09:19:34 +00001641 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1642 return 0;
1643
1644 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
paul718e3742002-12-13 20:15:29 +00001645 {
hassoe0701b72004-05-20 09:19:34 +00001646 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1647 && ! always)
1648 return 0;
paul718e3742002-12-13 20:15:29 +00001649
hassoe0701b72004-05-20 09:19:34 +00001650 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001651 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1652 "limit %ld", afi_safi_print (afi, safi), peer->host,
1653 peer->pcount[afi][safi], peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001654 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
paul718e3742002-12-13 20:15:29 +00001655
hassoe0701b72004-05-20 09:19:34 +00001656 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1657 return 0;
paul718e3742002-12-13 20:15:29 +00001658
hassoe0701b72004-05-20 09:19:34 +00001659 {
paul5228ad22004-06-04 17:58:18 +00001660 u_int8_t ndata[7];
hassoe0701b72004-05-20 09:19:34 +00001661
1662 if (safi == SAFI_MPLS_VPN)
Denis Ovsienkoe81537d2011-07-14 12:36:19 +04001663 safi = SAFI_MPLS_LABELED_VPN;
paul5228ad22004-06-04 17:58:18 +00001664
1665 ndata[0] = (afi >> 8);
1666 ndata[1] = afi;
1667 ndata[2] = safi;
1668 ndata[3] = (peer->pmax[afi][safi] >> 24);
1669 ndata[4] = (peer->pmax[afi][safi] >> 16);
1670 ndata[5] = (peer->pmax[afi][safi] >> 8);
1671 ndata[6] = (peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001672
1673 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1674 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1675 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1676 }
hasso0a486e52005-02-01 20:57:17 +00001677
1678 /* restart timer start */
1679 if (peer->pmax_restart[afi][safi])
1680 {
1681 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1682
1683 if (BGP_DEBUG (events, EVENTS))
1684 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1685 peer->host, peer->v_pmax_restart);
1686
1687 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1688 peer->v_pmax_restart);
1689 }
1690
hassoe0701b72004-05-20 09:19:34 +00001691 return 1;
paul718e3742002-12-13 20:15:29 +00001692 }
hassoe0701b72004-05-20 09:19:34 +00001693 else
1694 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1695
1696 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1697 {
1698 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1699 && ! always)
1700 return 0;
1701
1702 zlog (peer->log, LOG_INFO,
hasso0a486e52005-02-01 20:57:17 +00001703 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1704 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1705 peer->pmax[afi][safi]);
hassoe0701b72004-05-20 09:19:34 +00001706 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1707 }
1708 else
1709 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
paul718e3742002-12-13 20:15:29 +00001710 return 0;
1711}
1712
paulb40d9392005-08-22 22:34:41 +00001713/* Unconditionally remove the route from the RIB, without taking
1714 * damping into consideration (eg, because the session went down)
1715 */
paul94f2b392005-06-28 12:44:16 +00001716static void
paul718e3742002-12-13 20:15:29 +00001717bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1718 afi_t afi, safi_t safi)
1719{
paul902212c2006-02-05 17:51:19 +00001720 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1721
1722 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1723 bgp_info_delete (rn, ri); /* keep historical info */
1724
paulb40d9392005-08-22 22:34:41 +00001725 bgp_process (peer->bgp, rn, afi, safi);
paul718e3742002-12-13 20:15:29 +00001726}
1727
paul94f2b392005-06-28 12:44:16 +00001728static void
paul718e3742002-12-13 20:15:29 +00001729bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
paulb40d9392005-08-22 22:34:41 +00001730 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00001731{
paul718e3742002-12-13 20:15:29 +00001732 int status = BGP_DAMP_NONE;
1733
paulb40d9392005-08-22 22:34:41 +00001734 /* apply dampening, if result is suppressed, we'll be retaining
1735 * the bgp_info in the RIB for historical reference.
1736 */
1737 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1738 && peer_sort (peer) == BGP_PEER_EBGP)
1739 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1740 == BGP_DAMP_SUPPRESSED)
paul902212c2006-02-05 17:51:19 +00001741 {
paul902212c2006-02-05 17:51:19 +00001742 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1743 return;
1744 }
1745
1746 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00001747}
1748
paul94f2b392005-06-28 12:44:16 +00001749static void
paulfee0f4c2004-09-13 05:12:46 +00001750bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1751 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1752 int sub_type, struct prefix_rd *prd, u_char *tag)
1753{
1754 struct bgp_node *rn;
1755 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00001756 struct attr new_attr = { 0 };
paulfee0f4c2004-09-13 05:12:46 +00001757 struct attr *attr_new;
1758 struct attr *attr_new2;
1759 struct bgp_info *ri;
1760 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001761 const char *reason;
paulfee0f4c2004-09-13 05:12:46 +00001762 char buf[SU_ADDRSTRLEN];
1763
1764 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1765 if (peer == rsclient)
1766 return;
1767
1768 bgp = peer->bgp;
1769 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1770
1771 /* Check previously received route. */
1772 for (ri = rn->info; ri; ri = ri->next)
1773 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1774 break;
1775
1776 /* AS path loop check. */
1777 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1778 {
1779 reason = "as-path contains our own AS;";
1780 goto filtered;
1781 }
1782
1783 /* Route reflector originator ID check. */
1784 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00001785 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
paulfee0f4c2004-09-13 05:12:46 +00001786 {
1787 reason = "originator is us;";
1788 goto filtered;
1789 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001790
1791 bgp_attr_dup (&new_attr, attr);
paulfee0f4c2004-09-13 05:12:46 +00001792
1793 /* Apply export policy. */
1794 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1795 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1796 {
1797 reason = "export-policy;";
1798 goto filtered;
1799 }
1800
1801 attr_new2 = bgp_attr_intern (&new_attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00001802
paulfee0f4c2004-09-13 05:12:46 +00001803 /* Apply import policy. */
1804 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1805 {
1806 bgp_attr_unintern (attr_new2);
1807
1808 reason = "import-policy;";
1809 goto filtered;
1810 }
1811
1812 attr_new = bgp_attr_intern (&new_attr);
1813 bgp_attr_unintern (attr_new2);
1814
1815 /* IPv4 unicast next hop check. */
1816 if (afi == AFI_IP && safi == SAFI_UNICAST)
1817 {
1818 /* Next hop must not be 0.0.0.0 nor Class E address. */
1819 if (new_attr.nexthop.s_addr == 0
1820 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
1821 {
1822 bgp_attr_unintern (attr_new);
1823
1824 reason = "martian next-hop;";
1825 goto filtered;
1826 }
1827 }
Paul Jakmafb982c22007-05-04 20:15:47 +00001828
1829 /* new_attr isn't passed to any functions after here */
1830 bgp_attr_extra_free (&new_attr);
1831
paulfee0f4c2004-09-13 05:12:46 +00001832 /* If the update is implicit withdraw. */
1833 if (ri)
1834 {
Stephen Hemminger65957882010-01-15 16:22:10 +03001835 ri->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001836
1837 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00001838 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1839 && attrhash_cmp (ri->attr, attr_new))
paulfee0f4c2004-09-13 05:12:46 +00001840 {
1841
Paul Jakma1a392d42006-09-07 00:24:49 +00001842 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001843
1844 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001845 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001846 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1847 peer->host,
1848 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1849 p->prefixlen, rsclient->host);
1850
Chris Caputo228da422009-07-18 05:44:03 +00001851 bgp_unlock_node (rn);
1852 bgp_attr_unintern (attr_new);
paulfee0f4c2004-09-13 05:12:46 +00001853
Chris Caputo228da422009-07-18 05:44:03 +00001854 return;
paulfee0f4c2004-09-13 05:12:46 +00001855 }
1856
Paul Jakma16d2e242007-04-10 19:32:10 +00001857 /* Withdraw/Announce before we fully processed the withdraw */
1858 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1859 bgp_info_restore (rn, ri);
1860
paulfee0f4c2004-09-13 05:12:46 +00001861 /* Received Logging. */
1862 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001863 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001864 peer->host,
1865 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1866 p->prefixlen, rsclient->host);
1867
1868 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00001869 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paulfee0f4c2004-09-13 05:12:46 +00001870
1871 /* Update to new attribute. */
1872 bgp_attr_unintern (ri->attr);
1873 ri->attr = attr_new;
1874
1875 /* Update MPLS tag. */
1876 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001877 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001878
Paul Jakma1a392d42006-09-07 00:24:49 +00001879 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001880
1881 /* Process change. */
1882 bgp_process (bgp, rn, afi, safi);
1883 bgp_unlock_node (rn);
1884
1885 return;
1886 }
1887
1888 /* Received Logging. */
1889 if (BGP_DEBUG (update, UPDATE_IN))
1890 {
ajsd2c1f162004-12-08 21:10:20 +00001891 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
paulfee0f4c2004-09-13 05:12:46 +00001892 peer->host,
1893 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1894 p->prefixlen, rsclient->host);
1895 }
1896
1897 /* Make new BGP info. */
1898 new = bgp_info_new ();
1899 new->type = type;
1900 new->sub_type = sub_type;
1901 new->peer = peer;
1902 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03001903 new->uptime = bgp_clock ();
paulfee0f4c2004-09-13 05:12:46 +00001904
1905 /* Update MPLS tag. */
1906 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00001907 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paulfee0f4c2004-09-13 05:12:46 +00001908
Paul Jakma1a392d42006-09-07 00:24:49 +00001909 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paulfee0f4c2004-09-13 05:12:46 +00001910
1911 /* Register new BGP information. */
1912 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00001913
1914 /* route_node_get lock */
1915 bgp_unlock_node (rn);
1916
paulfee0f4c2004-09-13 05:12:46 +00001917 /* Process change. */
1918 bgp_process (bgp, rn, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00001919
1920 bgp_attr_extra_free (&new_attr);
1921
paulfee0f4c2004-09-13 05:12:46 +00001922 return;
1923
1924 filtered:
1925
1926 /* This BGP update is filtered. Log the reason then update BGP entry. */
1927 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001928 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001929 "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
1930 peer->host,
1931 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1932 p->prefixlen, rsclient->host, reason);
1933
1934 if (ri)
paulb40d9392005-08-22 22:34:41 +00001935 bgp_rib_remove (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001936
1937 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00001938
1939 if (new_attr.extra)
1940 bgp_attr_extra_free (&new_attr);
1941
paulfee0f4c2004-09-13 05:12:46 +00001942 return;
1943}
1944
paul94f2b392005-06-28 12:44:16 +00001945static void
paulfee0f4c2004-09-13 05:12:46 +00001946bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1947 struct peer *peer, struct prefix *p, int type, int sub_type,
1948 struct prefix_rd *prd, u_char *tag)
Chris Caputo228da422009-07-18 05:44:03 +00001949{
paulfee0f4c2004-09-13 05:12:46 +00001950 struct bgp_node *rn;
1951 struct bgp_info *ri;
1952 char buf[SU_ADDRSTRLEN];
1953
1954 if (rsclient == peer)
Chris Caputo228da422009-07-18 05:44:03 +00001955 return;
paulfee0f4c2004-09-13 05:12:46 +00001956
1957 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1958
1959 /* Lookup withdrawn route. */
1960 for (ri = rn->info; ri; ri = ri->next)
1961 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1962 break;
1963
1964 /* Withdraw specified route from routing table. */
1965 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00001966 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00001967 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00001968 zlog (peer->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00001969 "%s Can't find the route %s/%d", peer->host,
1970 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1971 p->prefixlen);
1972
1973 /* Unlock bgp_node_get() lock. */
Chris Caputo228da422009-07-18 05:44:03 +00001974 bgp_unlock_node (rn);
1975}
paulfee0f4c2004-09-13 05:12:46 +00001976
paul94f2b392005-06-28 12:44:16 +00001977static int
paulfee0f4c2004-09-13 05:12:46 +00001978bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
paul718e3742002-12-13 20:15:29 +00001979 afi_t afi, safi_t safi, int type, int sub_type,
1980 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
1981{
1982 int ret;
1983 int aspath_loop_count = 0;
1984 struct bgp_node *rn;
1985 struct bgp *bgp;
Paul Jakmafb982c22007-05-04 20:15:47 +00001986 struct attr new_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00001987 struct attr *attr_new;
1988 struct bgp_info *ri;
1989 struct bgp_info *new;
paulfd79ac92004-10-13 05:06:08 +00001990 const char *reason;
paul718e3742002-12-13 20:15:29 +00001991 char buf[SU_ADDRSTRLEN];
1992
1993 bgp = peer->bgp;
paulfee0f4c2004-09-13 05:12:46 +00001994 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
Paul Jakmafb982c22007-05-04 20:15:47 +00001995
paul718e3742002-12-13 20:15:29 +00001996 /* When peer's soft reconfiguration enabled. Record input packet in
1997 Adj-RIBs-In. */
1998 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
1999 && peer != bgp->peer_self && ! soft_reconfig)
2000 bgp_adj_in_set (rn, peer, attr);
2001
2002 /* Check previously received route. */
2003 for (ri = rn->info; ri; ri = ri->next)
2004 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2005 break;
2006
2007 /* AS path local-as loop check. */
2008 if (peer->change_local_as)
2009 {
2010 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2011 aspath_loop_count = 1;
2012
2013 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2014 {
2015 reason = "as-path contains our own AS;";
2016 goto filtered;
2017 }
2018 }
2019
2020 /* AS path loop check. */
2021 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2022 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2023 && aspath_loop_check(attr->aspath, bgp->confed_id)
2024 > peer->allowas_in[afi][safi]))
2025 {
2026 reason = "as-path contains our own AS;";
2027 goto filtered;
2028 }
2029
2030 /* Route reflector originator ID check. */
2031 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
Paul Jakmafb982c22007-05-04 20:15:47 +00002032 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
paul718e3742002-12-13 20:15:29 +00002033 {
2034 reason = "originator is us;";
2035 goto filtered;
2036 }
2037
2038 /* Route reflector cluster ID check. */
2039 if (bgp_cluster_filter (peer, attr))
2040 {
2041 reason = "reflected from the same cluster;";
2042 goto filtered;
2043 }
2044
2045 /* Apply incoming filter. */
2046 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2047 {
2048 reason = "filter;";
2049 goto filtered;
2050 }
2051
2052 /* Apply incoming route-map. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002053 bgp_attr_dup (&new_attr, attr);
paul718e3742002-12-13 20:15:29 +00002054
2055 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2056 {
2057 reason = "route-map;";
2058 goto filtered;
2059 }
2060
2061 /* IPv4 unicast next hop check. */
2062 if (afi == AFI_IP && safi == SAFI_UNICAST)
2063 {
2064 /* If the peer is EBGP and nexthop is not on connected route,
2065 discard it. */
2066 if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
2067 && ! bgp_nexthop_check_ebgp (afi, &new_attr)
hasso6ffd2072005-02-02 14:50:11 +00002068 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
paul718e3742002-12-13 20:15:29 +00002069 {
2070 reason = "non-connected next-hop;";
2071 goto filtered;
2072 }
2073
2074 /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
2075 must not be my own address. */
2076 if (bgp_nexthop_self (afi, &new_attr)
2077 || new_attr.nexthop.s_addr == 0
2078 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
2079 {
2080 reason = "martian next-hop;";
2081 goto filtered;
2082 }
2083 }
2084
2085 attr_new = bgp_attr_intern (&new_attr);
2086
2087 /* If the update is implicit withdraw. */
2088 if (ri)
2089 {
Stephen Hemminger65957882010-01-15 16:22:10 +03002090 ri->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002091
2092 /* Same attribute comes in. */
Paul Jakma16d2e242007-04-10 19:32:10 +00002093 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2094 && attrhash_cmp (ri->attr, attr_new))
paul718e3742002-12-13 20:15:29 +00002095 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002096 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00002097
2098 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2099 && peer_sort (peer) == BGP_PEER_EBGP
2100 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2101 {
2102 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002103 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002104 peer->host,
2105 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2106 p->prefixlen);
2107
paul902212c2006-02-05 17:51:19 +00002108 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2109 {
2110 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2111 bgp_process (bgp, rn, afi, safi);
2112 }
paul718e3742002-12-13 20:15:29 +00002113 }
Paul Jakma16d2e242007-04-10 19:32:10 +00002114 else /* Duplicate - odd */
paul718e3742002-12-13 20:15:29 +00002115 {
2116 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002117 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002118 "%s rcvd %s/%d...duplicate ignored",
2119 peer->host,
2120 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2121 p->prefixlen);
hasso93406d82005-02-02 14:40:33 +00002122
2123 /* graceful restart STALE flag unset. */
2124 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2125 {
Paul Jakma1a392d42006-09-07 00:24:49 +00002126 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
paul902212c2006-02-05 17:51:19 +00002127 bgp_process (bgp, rn, afi, safi);
hasso93406d82005-02-02 14:40:33 +00002128 }
paul718e3742002-12-13 20:15:29 +00002129 }
2130
2131 bgp_unlock_node (rn);
2132 bgp_attr_unintern (attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00002133 bgp_attr_extra_free (&new_attr);
2134
paul718e3742002-12-13 20:15:29 +00002135 return 0;
2136 }
2137
Paul Jakma16d2e242007-04-10 19:32:10 +00002138 /* Withdraw/Announce before we fully processed the withdraw */
2139 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2140 {
2141 if (BGP_DEBUG (update, UPDATE_IN))
2142 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2143 peer->host,
2144 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2145 p->prefixlen);
2146 bgp_info_restore (rn, ri);
2147 }
2148
paul718e3742002-12-13 20:15:29 +00002149 /* Received Logging. */
2150 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002151 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002152 peer->host,
2153 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2154 p->prefixlen);
2155
hasso93406d82005-02-02 14:40:33 +00002156 /* graceful restart STALE flag unset. */
2157 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma1a392d42006-09-07 00:24:49 +00002158 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
hasso93406d82005-02-02 14:40:33 +00002159
paul718e3742002-12-13 20:15:29 +00002160 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00002161 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
paul902212c2006-02-05 17:51:19 +00002162
2163 /* implicit withdraw, decrement aggregate and pcount here.
2164 * only if update is accepted, they'll increment below.
2165 */
paul902212c2006-02-05 17:51:19 +00002166 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2167
paul718e3742002-12-13 20:15:29 +00002168 /* Update bgp route dampening information. */
2169 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2170 && peer_sort (peer) == BGP_PEER_EBGP)
2171 {
2172 /* This is implicit withdraw so we should update dampening
2173 information. */
2174 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2175 bgp_damp_withdraw (ri, rn, afi, safi, 1);
paul718e3742002-12-13 20:15:29 +00002176 }
2177
paul718e3742002-12-13 20:15:29 +00002178 /* Update to new attribute. */
2179 bgp_attr_unintern (ri->attr);
2180 ri->attr = attr_new;
2181
2182 /* Update MPLS tag. */
2183 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002184 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002185
2186 /* Update bgp route dampening information. */
2187 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2188 && peer_sort (peer) == BGP_PEER_EBGP)
2189 {
2190 /* Now we do normal update dampening. */
2191 ret = bgp_damp_update (ri, rn, afi, safi);
2192 if (ret == BGP_DAMP_SUPPRESSED)
2193 {
2194 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002195 bgp_attr_extra_free (&new_attr);
paul718e3742002-12-13 20:15:29 +00002196 return 0;
2197 }
2198 }
2199
2200 /* Nexthop reachability check. */
2201 if ((afi == AFI_IP || afi == AFI_IP6)
2202 && safi == SAFI_UNICAST
2203 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002204 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002205 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002206 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002207 {
2208 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002209 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002210 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002211 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002212 }
2213 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002214 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002215
2216 /* Process change. */
2217 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2218
2219 bgp_process (bgp, rn, afi, safi);
2220 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002221 bgp_attr_extra_free (&new_attr);
2222
paul718e3742002-12-13 20:15:29 +00002223 return 0;
2224 }
2225
2226 /* Received Logging. */
2227 if (BGP_DEBUG (update, UPDATE_IN))
2228 {
ajsd2c1f162004-12-08 21:10:20 +00002229 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
paul718e3742002-12-13 20:15:29 +00002230 peer->host,
2231 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2232 p->prefixlen);
2233 }
2234
paul718e3742002-12-13 20:15:29 +00002235 /* Make new BGP info. */
2236 new = bgp_info_new ();
2237 new->type = type;
2238 new->sub_type = sub_type;
2239 new->peer = peer;
2240 new->attr = attr_new;
Stephen Hemminger65957882010-01-15 16:22:10 +03002241 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00002242
2243 /* Update MPLS tag. */
2244 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00002245 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
paul718e3742002-12-13 20:15:29 +00002246
2247 /* Nexthop reachability check. */
2248 if ((afi == AFI_IP || afi == AFI_IP6)
2249 && safi == SAFI_UNICAST
2250 && (peer_sort (peer) == BGP_PEER_IBGP
Vasilis Tsiligiannis638b70b2009-07-20 01:25:16 +03002251 || peer_sort (peer) == BGP_PEER_CONFED
paul718e3742002-12-13 20:15:29 +00002252 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
hasso6ffd2072005-02-02 14:50:11 +00002253 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
paul718e3742002-12-13 20:15:29 +00002254 {
2255 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
Paul Jakma1a392d42006-09-07 00:24:49 +00002256 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002257 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002258 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002259 }
2260 else
Paul Jakma1a392d42006-09-07 00:24:49 +00002261 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
paul718e3742002-12-13 20:15:29 +00002262
paul902212c2006-02-05 17:51:19 +00002263 /* Increment prefix */
paul718e3742002-12-13 20:15:29 +00002264 bgp_aggregate_increment (bgp, p, new, afi, safi);
2265
2266 /* Register new BGP information. */
2267 bgp_info_add (rn, new);
paul200df112005-06-01 11:17:05 +00002268
2269 /* route_node_get lock */
2270 bgp_unlock_node (rn);
2271
Paul Jakmafb982c22007-05-04 20:15:47 +00002272 bgp_attr_extra_free (&new_attr);
2273
paul718e3742002-12-13 20:15:29 +00002274 /* If maximum prefix count is configured and current prefix
2275 count exeed it. */
hassoe0701b72004-05-20 09:19:34 +00002276 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2277 return -1;
paul718e3742002-12-13 20:15:29 +00002278
2279 /* Process change. */
2280 bgp_process (bgp, rn, afi, safi);
2281
2282 return 0;
2283
2284 /* This BGP update is filtered. Log the reason then update BGP
2285 entry. */
2286 filtered:
2287 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002288 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002289 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2290 peer->host,
2291 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2292 p->prefixlen, reason);
2293
2294 if (ri)
paulb40d9392005-08-22 22:34:41 +00002295 bgp_rib_remove (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002296
2297 bgp_unlock_node (rn);
Paul Jakmafb982c22007-05-04 20:15:47 +00002298
2299 bgp_attr_extra_free (&new_attr);
2300
paul718e3742002-12-13 20:15:29 +00002301 return 0;
2302}
2303
2304int
paulfee0f4c2004-09-13 05:12:46 +00002305bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2306 afi_t afi, safi_t safi, int type, int sub_type,
2307 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2308{
2309 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002310 struct listnode *node, *nnode;
paulfee0f4c2004-09-13 05:12:46 +00002311 struct bgp *bgp;
2312 int ret;
2313
2314 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2315 soft_reconfig);
2316
2317 bgp = peer->bgp;
2318
2319 /* Process the update for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002320 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002321 {
2322 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2323 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2324 sub_type, prd, tag);
2325 }
2326
2327 return ret;
2328}
2329
2330int
paul718e3742002-12-13 20:15:29 +00002331bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
paul94f2b392005-06-28 12:44:16 +00002332 afi_t afi, safi_t safi, int type, int sub_type,
2333 struct prefix_rd *prd, u_char *tag)
paul718e3742002-12-13 20:15:29 +00002334{
2335 struct bgp *bgp;
2336 char buf[SU_ADDRSTRLEN];
2337 struct bgp_node *rn;
2338 struct bgp_info *ri;
paulfee0f4c2004-09-13 05:12:46 +00002339 struct peer *rsclient;
paul1eb8ef22005-04-07 07:30:20 +00002340 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002341
2342 bgp = peer->bgp;
2343
paulfee0f4c2004-09-13 05:12:46 +00002344 /* Process the withdraw for each RS-client. */
paul1eb8ef22005-04-07 07:30:20 +00002345 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
paulfee0f4c2004-09-13 05:12:46 +00002346 {
2347 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2348 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2349 }
2350
paul718e3742002-12-13 20:15:29 +00002351 /* Logging. */
2352 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002353 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
paul718e3742002-12-13 20:15:29 +00002354 peer->host,
2355 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2356 p->prefixlen);
2357
2358 /* Lookup node. */
paulfee0f4c2004-09-13 05:12:46 +00002359 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
paul718e3742002-12-13 20:15:29 +00002360
2361 /* If peer is soft reconfiguration enabled. Record input packet for
2362 further calculation. */
2363 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2364 && peer != bgp->peer_self)
2365 bgp_adj_in_unset (rn, peer);
2366
2367 /* Lookup withdrawn route. */
2368 for (ri = rn->info; ri; ri = ri->next)
2369 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2370 break;
2371
2372 /* Withdraw specified route from routing table. */
2373 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
paulb40d9392005-08-22 22:34:41 +00002374 bgp_rib_withdraw (rn, ri, peer, afi, safi);
paul718e3742002-12-13 20:15:29 +00002375 else if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00002376 zlog (peer->log, LOG_DEBUG,
paul718e3742002-12-13 20:15:29 +00002377 "%s Can't find the route %s/%d", peer->host,
2378 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2379 p->prefixlen);
2380
2381 /* Unlock bgp_node_get() lock. */
2382 bgp_unlock_node (rn);
2383
2384 return 0;
2385}
2386
2387void
2388bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2389{
2390 struct bgp *bgp;
Chris Caputo228da422009-07-18 05:44:03 +00002391 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002392 struct aspath *aspath = { 0 };
paul718e3742002-12-13 20:15:29 +00002393 struct prefix p;
2394 struct bgp_info binfo;
2395 struct peer *from;
2396 int ret = RMAP_DENYMATCH;
Paul Jakmafb982c22007-05-04 20:15:47 +00002397
Paul Jakmab2497022007-06-14 11:17:58 +00002398 if (!(afi == AFI_IP || afi == AFI_IP6))
Paul Jakmafb982c22007-05-04 20:15:47 +00002399 return;
2400
paul718e3742002-12-13 20:15:29 +00002401 bgp = peer->bgp;
2402 from = bgp->peer_self;
Paul Jakmafb982c22007-05-04 20:15:47 +00002403
paul718e3742002-12-13 20:15:29 +00002404 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2405 aspath = attr.aspath;
2406 attr.local_pref = bgp->default_local_pref;
2407 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2408
2409 if (afi == AFI_IP)
2410 str2prefix ("0.0.0.0/0", &p);
2411#ifdef HAVE_IPV6
2412 else if (afi == AFI_IP6)
2413 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002414 struct attr_extra *ae;
2415 attr.extra = NULL;
2416
2417 ae = bgp_attr_extra_get (&attr);
2418 attr.extra = ae;
2419
paul718e3742002-12-13 20:15:29 +00002420 str2prefix ("::/0", &p);
2421
2422 /* IPv6 global nexthop must be included. */
Paul Jakmafb982c22007-05-04 20:15:47 +00002423 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
paul718e3742002-12-13 20:15:29 +00002424 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002425 ae->mp_nexthop_len = 16;
paul718e3742002-12-13 20:15:29 +00002426
2427 /* If the peer is on shared nextwork and we have link-local
2428 nexthop set it. */
2429 if (peer->shared_network
2430 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2431 {
Paul Jakmafb982c22007-05-04 20:15:47 +00002432 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
paul718e3742002-12-13 20:15:29 +00002433 IPV6_MAX_BYTELEN);
Paul Jakmafb982c22007-05-04 20:15:47 +00002434 ae->mp_nexthop_len = 32;
paul718e3742002-12-13 20:15:29 +00002435 }
2436 }
2437#endif /* HAVE_IPV6 */
paul718e3742002-12-13 20:15:29 +00002438
2439 if (peer->default_rmap[afi][safi].name)
2440 {
2441 binfo.peer = bgp->peer_self;
2442 binfo.attr = &attr;
2443
paulfee0f4c2004-09-13 05:12:46 +00002444 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2445
paul718e3742002-12-13 20:15:29 +00002446 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2447 RMAP_BGP, &binfo);
2448
paulfee0f4c2004-09-13 05:12:46 +00002449 bgp->peer_self->rmap_type = 0;
2450
paul718e3742002-12-13 20:15:29 +00002451 if (ret == RMAP_DENYMATCH)
2452 {
2453 bgp_attr_flush (&attr);
2454 withdraw = 1;
2455 }
2456 }
2457
2458 if (withdraw)
2459 {
2460 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2461 bgp_default_withdraw_send (peer, afi, safi);
2462 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2463 }
2464 else
2465 {
2466 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2467 bgp_default_update_send (peer, &attr, afi, safi, from);
2468 }
Paul Jakmafb982c22007-05-04 20:15:47 +00002469
2470 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00002471 aspath_unintern (aspath);
2472}
2473
2474static void
2475bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
paulfee0f4c2004-09-13 05:12:46 +00002476 struct bgp_table *table, int rsclient)
paul718e3742002-12-13 20:15:29 +00002477{
2478 struct bgp_node *rn;
2479 struct bgp_info *ri;
Chris Caputo228da422009-07-18 05:44:03 +00002480 struct attr attr = { 0 };
Paul Jakmafb982c22007-05-04 20:15:47 +00002481
paul718e3742002-12-13 20:15:29 +00002482 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002483 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
paul718e3742002-12-13 20:15:29 +00002484
2485 if (safi != SAFI_MPLS_VPN
2486 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2487 bgp_default_originate (peer, afi, safi, 0);
2488
2489 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2490 for (ri = rn->info; ri; ri = ri->next)
2491 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2492 {
paulfee0f4c2004-09-13 05:12:46 +00002493 if ( (rsclient) ?
2494 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2495 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
paul718e3742002-12-13 20:15:29 +00002496 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2497 else
2498 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00002499
2500 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00002501 }
2502}
2503
2504void
2505bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2506{
2507 struct bgp_node *rn;
2508 struct bgp_table *table;
2509
2510 if (peer->status != Established)
2511 return;
2512
2513 if (! peer->afc_nego[afi][safi])
2514 return;
2515
2516 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2517 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2518 return;
2519
2520 if (safi != SAFI_MPLS_VPN)
paulfee0f4c2004-09-13 05:12:46 +00002521 bgp_announce_table (peer, afi, safi, NULL, 0);
paul718e3742002-12-13 20:15:29 +00002522 else
2523 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2524 rn = bgp_route_next(rn))
2525 if ((table = (rn->info)) != NULL)
paulfee0f4c2004-09-13 05:12:46 +00002526 bgp_announce_table (peer, afi, safi, table, 0);
2527
2528 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2529 bgp_announce_table (peer, afi, safi, NULL, 1);
paul718e3742002-12-13 20:15:29 +00002530}
2531
2532void
2533bgp_announce_route_all (struct peer *peer)
2534{
2535 afi_t afi;
2536 safi_t safi;
2537
2538 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2539 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2540 bgp_announce_route (peer, afi, safi);
2541}
2542
2543static void
paulfee0f4c2004-09-13 05:12:46 +00002544bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2545 safi_t safi, struct bgp_table *table)
2546{
2547 struct bgp_node *rn;
2548 struct bgp_adj_in *ain;
2549
2550 if (! table)
2551 table = rsclient->bgp->rib[afi][safi];
2552
2553 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2554 for (ain = rn->adj_in; ain; ain = ain->next)
2555 {
2556 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2557 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2558 }
2559}
2560
2561void
2562bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2563{
2564 struct bgp_table *table;
2565 struct bgp_node *rn;
2566
2567 if (safi != SAFI_MPLS_VPN)
2568 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2569
2570 else
2571 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2572 rn = bgp_route_next (rn))
2573 if ((table = rn->info) != NULL)
2574 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2575}
2576
2577static void
paul718e3742002-12-13 20:15:29 +00002578bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2579 struct bgp_table *table)
2580{
2581 int ret;
2582 struct bgp_node *rn;
2583 struct bgp_adj_in *ain;
2584
2585 if (! table)
2586 table = peer->bgp->rib[afi][safi];
2587
2588 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2589 for (ain = rn->adj_in; ain; ain = ain->next)
2590 {
2591 if (ain->peer == peer)
2592 {
2593 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2594 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2595 NULL, NULL, 1);
2596 if (ret < 0)
2597 {
2598 bgp_unlock_node (rn);
2599 return;
2600 }
2601 continue;
2602 }
2603 }
2604}
2605
2606void
2607bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2608{
2609 struct bgp_node *rn;
2610 struct bgp_table *table;
2611
2612 if (peer->status != Established)
2613 return;
2614
2615 if (safi != SAFI_MPLS_VPN)
2616 bgp_soft_reconfig_table (peer, afi, safi, NULL);
2617 else
2618 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2619 rn = bgp_route_next (rn))
2620 if ((table = rn->info) != NULL)
2621 bgp_soft_reconfig_table (peer, afi, safi, table);
2622}
2623
Chris Caputo228da422009-07-18 05:44:03 +00002624
2625struct bgp_clear_node_queue
2626{
2627 struct bgp_node *rn;
2628 enum bgp_clear_route_type purpose;
2629};
2630
paul200df112005-06-01 11:17:05 +00002631static wq_item_status
paul0fb58d52005-11-14 14:31:49 +00002632bgp_clear_route_node (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002633{
Chris Caputo228da422009-07-18 05:44:03 +00002634 struct bgp_clear_node_queue *cnq = data;
2635 struct bgp_node *rn = cnq->rn;
Paul Jakma64e580a2006-02-21 01:09:01 +00002636 struct peer *peer = wq->spec.data;
paul200df112005-06-01 11:17:05 +00002637 struct bgp_info *ri;
Paul Jakma64e580a2006-02-21 01:09:01 +00002638 afi_t afi = rn->table->afi;
2639 safi_t safi = rn->table->safi;
paul200df112005-06-01 11:17:05 +00002640
Paul Jakma64e580a2006-02-21 01:09:01 +00002641 assert (rn && peer);
paul200df112005-06-01 11:17:05 +00002642
Paul Jakma64e580a2006-02-21 01:09:01 +00002643 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002644 if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
paul200df112005-06-01 11:17:05 +00002645 {
2646 /* graceful restart STALE flag set. */
Paul Jakma64e580a2006-02-21 01:09:01 +00002647 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2648 && peer->nsf[afi][safi]
paul200df112005-06-01 11:17:05 +00002649 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
Paul Jakma1a392d42006-09-07 00:24:49 +00002650 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2651 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
paul200df112005-06-01 11:17:05 +00002652 else
Paul Jakma64e580a2006-02-21 01:09:01 +00002653 bgp_rib_remove (rn, ri, peer, afi, safi);
paul200df112005-06-01 11:17:05 +00002654 break;
2655 }
paul200df112005-06-01 11:17:05 +00002656 return WQ_SUCCESS;
2657}
2658
2659static void
paul0fb58d52005-11-14 14:31:49 +00002660bgp_clear_node_queue_del (struct work_queue *wq, void *data)
paul200df112005-06-01 11:17:05 +00002661{
Chris Caputo228da422009-07-18 05:44:03 +00002662 struct bgp_clear_node_queue *cnq = data;
2663 struct bgp_node *rn = cnq->rn;
2664 struct bgp_table *table = rn->table;
Paul Jakma64e580a2006-02-21 01:09:01 +00002665
2666 bgp_unlock_node (rn);
Chris Caputo228da422009-07-18 05:44:03 +00002667 bgp_table_unlock (table);
2668 XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
paul200df112005-06-01 11:17:05 +00002669}
2670
2671static void
paul94f2b392005-06-28 12:44:16 +00002672bgp_clear_node_complete (struct work_queue *wq)
paul200df112005-06-01 11:17:05 +00002673{
Paul Jakma64e580a2006-02-21 01:09:01 +00002674 struct peer *peer = wq->spec.data;
2675
Paul Jakma3e0c78e2006-03-06 18:06:53 +00002676 /* Tickle FSM to start moving again */
Paul Jakmaca058a32006-09-14 02:58:49 +00002677 BGP_EVENT_ADD (peer, Clearing_Completed);
Chris Caputo228da422009-07-18 05:44:03 +00002678
2679 peer_unlock (peer); /* bgp_clear_route */
paul200df112005-06-01 11:17:05 +00002680}
2681
2682static void
Paul Jakma64e580a2006-02-21 01:09:01 +00002683bgp_clear_node_queue_init (struct peer *peer)
paul200df112005-06-01 11:17:05 +00002684{
Paul Jakmaa2943652009-07-21 14:02:04 +01002685 char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
Paul Jakma64e580a2006-02-21 01:09:01 +00002686
Paul Jakmaa2943652009-07-21 14:02:04 +01002687 snprintf (wname, sizeof(wname), "clear %s", peer->host);
Paul Jakma64e580a2006-02-21 01:09:01 +00002688#undef CLEAR_QUEUE_NAME_LEN
2689
2690 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
paul200df112005-06-01 11:17:05 +00002691 {
2692 zlog_err ("%s: Failed to allocate work queue", __func__);
2693 exit (1);
2694 }
Paul Jakma64e580a2006-02-21 01:09:01 +00002695 peer->clear_node_queue->spec.hold = 10;
2696 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2697 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2698 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2699 peer->clear_node_queue->spec.max_retries = 0;
2700
2701 /* we only 'lock' this peer reference when the queue is actually active */
2702 peer->clear_node_queue->spec.data = peer;
paul200df112005-06-01 11:17:05 +00002703}
2704
paul718e3742002-12-13 20:15:29 +00002705static void
2706bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
Chris Caputo228da422009-07-18 05:44:03 +00002707 struct bgp_table *table, struct peer *rsclient,
2708 enum bgp_clear_route_type purpose)
paul718e3742002-12-13 20:15:29 +00002709{
2710 struct bgp_node *rn;
paul200df112005-06-01 11:17:05 +00002711
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002712
paul718e3742002-12-13 20:15:29 +00002713 if (! table)
paulfee0f4c2004-09-13 05:12:46 +00002714 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
Paul Jakma64e580a2006-02-21 01:09:01 +00002715
hasso6cf159b2005-03-21 10:28:14 +00002716 /* If still no table => afi/safi isn't configured at all or smth. */
2717 if (! table)
2718 return;
Paul Jakma65ca75e2006-05-04 08:08:15 +00002719
2720 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2721 {
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002722 struct bgp_info *ri;
2723 struct bgp_adj_in *ain;
2724 struct bgp_adj_out *aout;
2725
Paul Jakma65ca75e2006-05-04 08:08:15 +00002726 if (rn->info == NULL)
2727 continue;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002728
2729 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2730 * queued for every clearing peer, regardless of whether it is
2731 * relevant to the peer at hand.
2732 *
2733 * Overview: There are 3 different indices which need to be
2734 * scrubbed, potentially, when a peer is removed:
2735 *
2736 * 1 peer's routes visible via the RIB (ie accepted routes)
2737 * 2 peer's routes visible by the (optional) peer's adj-in index
2738 * 3 other routes visible by the peer's adj-out index
2739 *
2740 * 3 there is no hurry in scrubbing, once the struct peer is
2741 * removed from bgp->peer, we could just GC such deleted peer's
2742 * adj-outs at our leisure.
2743 *
2744 * 1 and 2 must be 'scrubbed' in some way, at least made
2745 * invisible via RIB index before peer session is allowed to be
2746 * brought back up. So one needs to know when such a 'search' is
2747 * complete.
2748 *
2749 * Ideally:
2750 *
2751 * - there'd be a single global queue or a single RIB walker
2752 * - rather than tracking which route_nodes still need to be
2753 * examined on a peer basis, we'd track which peers still
2754 * aren't cleared
2755 *
2756 * Given that our per-peer prefix-counts now should be reliable,
2757 * this may actually be achievable. It doesn't seem to be a huge
2758 * problem at this time,
2759 */
2760 for (ri = rn->info; ri; ri = ri->next)
Chris Caputo228da422009-07-18 05:44:03 +00002761 if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002762 {
Chris Caputo228da422009-07-18 05:44:03 +00002763 struct bgp_clear_node_queue *cnq;
2764
2765 /* both unlocked in bgp_clear_node_queue_del */
2766 bgp_table_lock (rn->table);
2767 bgp_lock_node (rn);
2768 cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2769 sizeof (struct bgp_clear_node_queue));
2770 cnq->rn = rn;
2771 cnq->purpose = purpose;
2772 work_queue_add (peer->clear_node_queue, cnq);
2773 break;
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002774 }
2775
2776 for (ain = rn->adj_in; ain; ain = ain->next)
Chris Caputo228da422009-07-18 05:44:03 +00002777 if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002778 {
2779 bgp_adj_in_remove (rn, ain);
2780 bgp_unlock_node (rn);
2781 break;
2782 }
2783 for (aout = rn->adj_out; aout; aout = aout->next)
Chris Caputo228da422009-07-18 05:44:03 +00002784 if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002785 {
2786 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2787 bgp_unlock_node (rn);
2788 break;
2789 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002790 }
2791 return;
2792}
2793
2794void
Chris Caputo228da422009-07-18 05:44:03 +00002795bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2796 enum bgp_clear_route_type purpose)
Paul Jakma65ca75e2006-05-04 08:08:15 +00002797{
2798 struct bgp_node *rn;
2799 struct bgp_table *table;
2800 struct peer *rsclient;
2801 struct listnode *node, *nnode;
hasso6cf159b2005-03-21 10:28:14 +00002802
Paul Jakma64e580a2006-02-21 01:09:01 +00002803 if (peer->clear_node_queue == NULL)
2804 bgp_clear_node_queue_init (peer);
paul200df112005-06-01 11:17:05 +00002805
Paul Jakmaca058a32006-09-14 02:58:49 +00002806 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2807 * Idle until it receives a Clearing_Completed event. This protects
2808 * against peers which flap faster than we can we clear, which could
2809 * lead to:
Paul Jakma64e580a2006-02-21 01:09:01 +00002810 *
2811 * a) race with routes from the new session being installed before
2812 * clear_route_node visits the node (to delete the route of that
2813 * peer)
2814 * b) resource exhaustion, clear_route_node likely leads to an entry
2815 * on the process_main queue. Fast-flapping could cause that queue
2816 * to grow and grow.
paul200df112005-06-01 11:17:05 +00002817 */
Paul Jakmaca058a32006-09-14 02:58:49 +00002818 if (!peer->clear_node_queue->thread)
2819 peer_lock (peer); /* bgp_clear_node_complete */
paulfee0f4c2004-09-13 05:12:46 +00002820
Chris Caputo228da422009-07-18 05:44:03 +00002821 switch (purpose)
paulfee0f4c2004-09-13 05:12:46 +00002822 {
Chris Caputo228da422009-07-18 05:44:03 +00002823 case BGP_CLEAR_ROUTE_NORMAL:
2824 if (safi != SAFI_MPLS_VPN)
2825 bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2826 else
2827 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2828 rn = bgp_route_next (rn))
2829 if ((table = rn->info) != NULL)
2830 bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2831
2832 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2833 if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2834 PEER_FLAG_RSERVER_CLIENT))
2835 bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2836 break;
2837
2838 case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2839 bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2840 break;
2841
2842 default:
2843 assert (0);
2844 break;
paulfee0f4c2004-09-13 05:12:46 +00002845 }
Paul Jakma65ca75e2006-05-04 08:08:15 +00002846
Paul Jakmaca058a32006-09-14 02:58:49 +00002847 /* If no routes were cleared, nothing was added to workqueue, the
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002848 * completion function won't be run by workqueue code - call it here.
2849 * XXX: Actually, this assumption doesn't hold, see
2850 * bgp_clear_route_table(), we queue all non-empty nodes.
Paul Jakmaca058a32006-09-14 02:58:49 +00002851 *
2852 * Additionally, there is a presumption in FSM that clearing is only
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002853 * really needed if peer state is Established - peers in
2854 * pre-Established states shouldn't have any route-update state
2855 * associated with them (in or out).
Paul Jakmaca058a32006-09-14 02:58:49 +00002856 *
Paul Jakmaf2c31ac2007-02-22 17:48:42 +00002857 * We still can get here in pre-Established though, through
2858 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2859 * check to ensure the assumption above holds.
Paul Jakmaca058a32006-09-14 02:58:49 +00002860 *
2861 * At some future point, this check could be move to the top of the
2862 * function, and do a quick early-return when state is
2863 * pre-Established, avoiding above list and table scans. Once we're
2864 * sure it is safe..
Paul Jakma65ca75e2006-05-04 08:08:15 +00002865 */
2866 if (!peer->clear_node_queue->thread)
2867 bgp_clear_node_complete (peer->clear_node_queue);
paul718e3742002-12-13 20:15:29 +00002868}
2869
2870void
2871bgp_clear_route_all (struct peer *peer)
2872{
2873 afi_t afi;
2874 safi_t safi;
2875
2876 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2877 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
Chris Caputo228da422009-07-18 05:44:03 +00002878 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
paul718e3742002-12-13 20:15:29 +00002879}
2880
2881void
2882bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2883{
2884 struct bgp_table *table;
2885 struct bgp_node *rn;
2886 struct bgp_adj_in *ain;
2887
2888 table = peer->bgp->rib[afi][safi];
2889
2890 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2891 for (ain = rn->adj_in; ain ; ain = ain->next)
2892 if (ain->peer == peer)
2893 {
2894 bgp_adj_in_remove (rn, ain);
2895 bgp_unlock_node (rn);
2896 break;
2897 }
2898}
hasso93406d82005-02-02 14:40:33 +00002899
2900void
2901bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2902{
2903 struct bgp_node *rn;
2904 struct bgp_info *ri;
2905 struct bgp_table *table;
2906
2907 table = peer->bgp->rib[afi][safi];
2908
2909 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2910 {
2911 for (ri = rn->info; ri; ri = ri->next)
2912 if (ri->peer == peer)
2913 {
2914 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2915 bgp_rib_remove (rn, ri, peer, afi, safi);
2916 break;
2917 }
2918 }
2919}
paul718e3742002-12-13 20:15:29 +00002920
2921/* Delete all kernel routes. */
2922void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08002923bgp_cleanup_routes (void)
paul718e3742002-12-13 20:15:29 +00002924{
2925 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00002926 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002927 struct bgp_node *rn;
2928 struct bgp_table *table;
2929 struct bgp_info *ri;
2930
paul1eb8ef22005-04-07 07:30:20 +00002931 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00002932 {
2933 table = bgp->rib[AFI_IP][SAFI_UNICAST];
2934
2935 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2936 for (ri = rn->info; ri; ri = ri->next)
2937 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2938 && ri->type == ZEBRA_ROUTE_BGP
2939 && ri->sub_type == BGP_ROUTE_NORMAL)
2940 bgp_zebra_withdraw (&rn->p, ri);
2941
2942 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
2943
2944 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2945 for (ri = rn->info; ri; ri = ri->next)
2946 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2947 && ri->type == ZEBRA_ROUTE_BGP
2948 && ri->sub_type == BGP_ROUTE_NORMAL)
2949 bgp_zebra_withdraw (&rn->p, ri);
2950 }
2951}
2952
2953void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08002954bgp_reset (void)
paul718e3742002-12-13 20:15:29 +00002955{
2956 vty_reset ();
2957 bgp_zclient_reset ();
2958 access_list_reset ();
2959 prefix_list_reset ();
2960}
2961
2962/* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
2963 value. */
2964int
2965bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
2966{
2967 u_char *pnt;
2968 u_char *lim;
2969 struct prefix p;
2970 int psize;
2971 int ret;
2972
2973 /* Check peer status. */
2974 if (peer->status != Established)
2975 return 0;
2976
2977 pnt = packet->nlri;
2978 lim = pnt + packet->length;
2979
2980 for (; pnt < lim; pnt += psize)
2981 {
2982 /* Clear prefix structure. */
2983 memset (&p, 0, sizeof (struct prefix));
2984
2985 /* Fetch prefix length. */
2986 p.prefixlen = *pnt++;
2987 p.family = afi2family (packet->afi);
2988
2989 /* Already checked in nlri_sanity_check(). We do double check
2990 here. */
2991 if ((packet->afi == AFI_IP && p.prefixlen > 32)
2992 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
2993 return -1;
2994
2995 /* Packet size overflow check. */
2996 psize = PSIZE (p.prefixlen);
2997
2998 /* When packet overflow occur return immediately. */
2999 if (pnt + psize > lim)
3000 return -1;
3001
3002 /* Fetch prefix from NLRI packet. */
3003 memcpy (&p.u.prefix, pnt, psize);
3004
3005 /* Check address. */
3006 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3007 {
3008 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3009 {
paulf5ba3872004-07-09 12:11:31 +00003010 /*
3011 * From draft-ietf-idr-bgp4-22, Section 6.3:
3012 * If a BGP router receives an UPDATE message with a
3013 * semantically incorrect NLRI field, in which a prefix is
3014 * semantically incorrect (eg. an unexpected multicast IP
3015 * address), it should ignore the prefix.
3016 */
paul718e3742002-12-13 20:15:29 +00003017 zlog (peer->log, LOG_ERR,
3018 "IPv4 unicast NLRI is multicast address %s",
3019 inet_ntoa (p.u.prefix4));
paulf5ba3872004-07-09 12:11:31 +00003020
paul718e3742002-12-13 20:15:29 +00003021 return -1;
3022 }
3023 }
3024
3025#ifdef HAVE_IPV6
3026 /* Check address. */
3027 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3028 {
3029 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3030 {
3031 char buf[BUFSIZ];
3032
3033 zlog (peer->log, LOG_WARNING,
3034 "IPv6 link-local NLRI received %s ignore this NLRI",
3035 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3036
3037 continue;
3038 }
3039 }
3040#endif /* HAVE_IPV6 */
3041
3042 /* Normal process. */
3043 if (attr)
3044 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3045 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3046 else
3047 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3048 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3049
3050 /* Address family configuration mismatch or maximum-prefix count
3051 overflow. */
3052 if (ret < 0)
3053 return -1;
3054 }
3055
3056 /* Packet length consistency check. */
3057 if (pnt != lim)
3058 return -1;
3059
3060 return 0;
3061}
3062
3063/* NLRI encode syntax check routine. */
3064int
3065bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3066 bgp_size_t length)
3067{
3068 u_char *end;
3069 u_char prefixlen;
3070 int psize;
3071
3072 end = pnt + length;
3073
3074 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3075 syntactic validity. If the field is syntactically incorrect,
3076 then the Error Subcode is set to Invalid Network Field. */
3077
3078 while (pnt < end)
3079 {
3080 prefixlen = *pnt++;
3081
3082 /* Prefix length check. */
3083 if ((afi == AFI_IP && prefixlen > 32)
3084 || (afi == AFI_IP6 && prefixlen > 128))
3085 {
3086 plog_err (peer->log,
3087 "%s [Error] Update packet error (wrong prefix length %d)",
3088 peer->host, prefixlen);
3089 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3090 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3091 return -1;
3092 }
3093
3094 /* Packet size overflow check. */
3095 psize = PSIZE (prefixlen);
3096
3097 if (pnt + psize > end)
3098 {
3099 plog_err (peer->log,
3100 "%s [Error] Update packet error"
3101 " (prefix data overflow prefix size is %d)",
3102 peer->host, psize);
3103 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3104 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3105 return -1;
3106 }
3107
3108 pnt += psize;
3109 }
3110
3111 /* Packet length consistency check. */
3112 if (pnt != end)
3113 {
3114 plog_err (peer->log,
3115 "%s [Error] Update packet error"
3116 " (prefix length mismatch with total length)",
3117 peer->host);
3118 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3119 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3120 return -1;
3121 }
3122 return 0;
3123}
3124
paul94f2b392005-06-28 12:44:16 +00003125static struct bgp_static *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -08003126bgp_static_new (void)
paul718e3742002-12-13 20:15:29 +00003127{
Stephen Hemminger393deb92008-08-18 14:13:29 -07003128 return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
paul718e3742002-12-13 20:15:29 +00003129}
3130
paul94f2b392005-06-28 12:44:16 +00003131static void
paul718e3742002-12-13 20:15:29 +00003132bgp_static_free (struct bgp_static *bgp_static)
3133{
3134 if (bgp_static->rmap.name)
3135 free (bgp_static->rmap.name);
3136 XFREE (MTYPE_BGP_STATIC, bgp_static);
3137}
3138
paul94f2b392005-06-28 12:44:16 +00003139static void
paulfee0f4c2004-09-13 05:12:46 +00003140bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3141 struct prefix *p, afi_t afi, safi_t safi)
3142{
3143 struct bgp_node *rn;
3144 struct bgp_info *ri;
3145
3146 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3147
3148 /* Check selected route and self inserted route. */
3149 for (ri = rn->info; ri; ri = ri->next)
3150 if (ri->peer == bgp->peer_self
3151 && ri->type == ZEBRA_ROUTE_BGP
3152 && ri->sub_type == BGP_ROUTE_STATIC)
3153 break;
3154
3155 /* Withdraw static BGP route from routing table. */
3156 if (ri)
3157 {
paulfee0f4c2004-09-13 05:12:46 +00003158 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00003159 bgp_process (bgp, rn, afi, safi);
paulfee0f4c2004-09-13 05:12:46 +00003160 }
3161
3162 /* Unlock bgp_node_lookup. */
3163 bgp_unlock_node (rn);
3164}
3165
paul94f2b392005-06-28 12:44:16 +00003166static void
paulfee0f4c2004-09-13 05:12:46 +00003167bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
Paul Jakmafb982c22007-05-04 20:15:47 +00003168 struct bgp_static *bgp_static,
3169 afi_t afi, safi_t safi)
paulfee0f4c2004-09-13 05:12:46 +00003170{
3171 struct bgp_node *rn;
3172 struct bgp_info *ri;
3173 struct bgp_info *new;
3174 struct bgp_info info;
paulfee0f4c2004-09-13 05:12:46 +00003175 struct attr *attr_new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003176 struct attr attr = {0 };
3177 struct attr new_attr = { .extra = 0 };
paulfee0f4c2004-09-13 05:12:46 +00003178 struct bgp *bgp;
3179 int ret;
3180 char buf[SU_ADDRSTRLEN];
3181
3182 bgp = rsclient->bgp;
3183
Paul Jakma06e110f2006-05-12 23:29:22 +00003184 assert (bgp_static);
3185 if (!bgp_static)
3186 return;
3187
paulfee0f4c2004-09-13 05:12:46 +00003188 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3189
3190 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
Paul Jakma06e110f2006-05-12 23:29:22 +00003191
3192 attr.nexthop = bgp_static->igpnexthop;
3193 attr.med = bgp_static->igpmetric;
3194 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
Paul Jakma41367172007-08-06 15:24:51 +00003195
Paul Jakma41367172007-08-06 15:24:51 +00003196 if (bgp_static->atomic)
3197 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3198
paulfee0f4c2004-09-13 05:12:46 +00003199 /* Apply network route-map for export to this rsclient. */
3200 if (bgp_static->rmap.name)
3201 {
Paul Jakmafb982c22007-05-04 20:15:47 +00003202 struct attr attr_tmp = attr;
paulfee0f4c2004-09-13 05:12:46 +00003203 info.peer = rsclient;
Paul Jakmafb982c22007-05-04 20:15:47 +00003204 info.attr = &attr_tmp;
3205
paulfee0f4c2004-09-13 05:12:46 +00003206 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3207 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3208
3209 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3210
3211 rsclient->rmap_type = 0;
3212
3213 if (ret == RMAP_DENYMATCH)
3214 {
3215 /* Free uninterned attribute. */
Paul Jakmafb982c22007-05-04 20:15:47 +00003216 bgp_attr_flush (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003217
3218 /* Unintern original. */
3219 aspath_unintern (attr.aspath);
3220 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
Paul Jakmafb982c22007-05-04 20:15:47 +00003221 bgp_attr_extra_free (&attr);
3222
paulfee0f4c2004-09-13 05:12:46 +00003223 return;
3224 }
Paul Jakmafb982c22007-05-04 20:15:47 +00003225 attr_new = bgp_attr_intern (&attr_tmp);
paulfee0f4c2004-09-13 05:12:46 +00003226 }
3227 else
3228 attr_new = bgp_attr_intern (&attr);
Paul Jakmafb982c22007-05-04 20:15:47 +00003229
paulfee0f4c2004-09-13 05:12:46 +00003230 new_attr = *attr_new;
Paul Jakmafb982c22007-05-04 20:15:47 +00003231
paulfee0f4c2004-09-13 05:12:46 +00003232 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3233
Paul Jakmafb982c22007-05-04 20:15:47 +00003234 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3235 == RMAP_DENY)
3236 {
paulfee0f4c2004-09-13 05:12:46 +00003237 /* This BGP update is filtered. Log the reason then update BGP entry. */
3238 if (BGP_DEBUG (update, UPDATE_IN))
ajsd2c1f162004-12-08 21:10:20 +00003239 zlog (rsclient->log, LOG_DEBUG,
paulfee0f4c2004-09-13 05:12:46 +00003240 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3241 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3242 p->prefixlen, rsclient->host);
3243
3244 bgp->peer_self->rmap_type = 0;
3245
3246 bgp_attr_unintern (attr_new);
3247 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00003248 bgp_attr_extra_free (&attr);
paulfee0f4c2004-09-13 05:12:46 +00003249
3250 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3251
3252 return;
Paul Jakmafb982c22007-05-04 20:15:47 +00003253 }
paulfee0f4c2004-09-13 05:12:46 +00003254
3255 bgp->peer_self->rmap_type = 0;
3256
3257 bgp_attr_unintern (attr_new);
3258 attr_new = bgp_attr_intern (&new_attr);
3259
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 Jakmae70e5752011-07-05 00:41:59 +04003571 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 Jakmae70e5752011-07-05 00:41:59 +04003606 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 Jakmae70e5752011-07-05 00:41:59 +04003897 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 Jakmae70e5752011-07-05 00:41:59 +04003909 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 Jakmae70e5752011-07-05 00:41:59 +04003920 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 Jakmae70e5752011-07-05 00:41:59 +04003942 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 Jakmae70e5752011-07-05 00:41:59 +04003966 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 Jakmae70e5752011-07-05 00:41:59 +04003989 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 Jakmae70e5752011-07-05 00:41:59 +04004009 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 Jakmae70e5752011-07-05 00:41:59 +04004031 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 Jakmae70e5752011-07-05 00:41:59 +04004052 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 Jakmae70e5752011-07-05 00:41:59 +04004173 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 Jakmae70e5752011-07-05 00:41:59 +04004185 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 Jakmae70e5752011-07-05 00:41:59 +04004224
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
paulfd79ac92004-10-13 05:06:08 +00004807bgp_aggregate_set (struct vty *vty, const char *prefix_str,
4808 afi_t afi, safi_t safi,
paul718e3742002-12-13 20:15:29 +00004809 u_char summary_only, u_char as_set)
4810{
4811 int ret;
4812 struct prefix p;
4813 struct bgp_node *rn;
4814 struct bgp *bgp;
4815 struct bgp_aggregate *aggregate;
4816
4817 /* Convert string to prefix structure. */
4818 ret = str2prefix (prefix_str, &p);
4819 if (!ret)
4820 {
4821 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4822 return CMD_WARNING;
4823 }
4824 apply_mask (&p);
4825
4826 /* Get BGP structure. */
4827 bgp = vty->index;
4828
4829 /* Old configuration check. */
4830 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4831
4832 if (rn->info)
4833 {
4834 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
4835 bgp_unlock_node (rn);
4836 return CMD_WARNING;
4837 }
4838
4839 /* Make aggregate address structure. */
4840 aggregate = bgp_aggregate_new ();
4841 aggregate->summary_only = summary_only;
4842 aggregate->as_set = as_set;
4843 aggregate->safi = safi;
4844 rn->info = aggregate;
4845
4846 /* Aggregate address insert into BGP routing table. */
4847 if (safi & SAFI_UNICAST)
4848 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
4849 if (safi & SAFI_MULTICAST)
4850 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4851
4852 return CMD_SUCCESS;
4853}
4854
paul94f2b392005-06-28 12:44:16 +00004855static int
paulfd79ac92004-10-13 05:06:08 +00004856bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4857 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00004858{
4859 int ret;
4860 struct prefix p;
4861 struct bgp_node *rn;
4862 struct bgp *bgp;
4863 struct bgp_aggregate *aggregate;
4864
4865 /* Convert string to prefix structure. */
4866 ret = str2prefix (prefix_str, &p);
4867 if (!ret)
4868 {
4869 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4870 return CMD_WARNING;
4871 }
4872 apply_mask (&p);
4873
4874 /* Get BGP structure. */
4875 bgp = vty->index;
4876
4877 /* Old configuration check. */
4878 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
4879 if (! rn)
4880 {
4881 vty_out (vty, "%% There is no aggregate-address configuration.%s",
4882 VTY_NEWLINE);
4883 return CMD_WARNING;
4884 }
4885
4886 aggregate = rn->info;
4887 if (aggregate->safi & SAFI_UNICAST)
4888 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
4889 if (aggregate->safi & SAFI_MULTICAST)
4890 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4891
4892 /* Unlock aggregate address configuration. */
4893 rn->info = NULL;
4894 bgp_aggregate_free (aggregate);
4895 bgp_unlock_node (rn);
4896 bgp_unlock_node (rn);
4897
4898 return CMD_SUCCESS;
4899}
4900
4901DEFUN (aggregate_address,
4902 aggregate_address_cmd,
4903 "aggregate-address A.B.C.D/M",
4904 "Configure BGP aggregate entries\n"
4905 "Aggregate prefix\n")
4906{
4907 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
4908}
4909
4910DEFUN (aggregate_address_mask,
4911 aggregate_address_mask_cmd,
4912 "aggregate-address A.B.C.D A.B.C.D",
4913 "Configure BGP aggregate entries\n"
4914 "Aggregate address\n"
4915 "Aggregate mask\n")
4916{
4917 int ret;
4918 char prefix_str[BUFSIZ];
4919
4920 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4921
4922 if (! ret)
4923 {
4924 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4925 return CMD_WARNING;
4926 }
4927
4928 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4929 0, 0);
4930}
4931
4932DEFUN (aggregate_address_summary_only,
4933 aggregate_address_summary_only_cmd,
4934 "aggregate-address A.B.C.D/M summary-only",
4935 "Configure BGP aggregate entries\n"
4936 "Aggregate prefix\n"
4937 "Filter more specific routes from updates\n")
4938{
4939 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4940 AGGREGATE_SUMMARY_ONLY, 0);
4941}
4942
4943DEFUN (aggregate_address_mask_summary_only,
4944 aggregate_address_mask_summary_only_cmd,
4945 "aggregate-address A.B.C.D A.B.C.D summary-only",
4946 "Configure BGP aggregate entries\n"
4947 "Aggregate address\n"
4948 "Aggregate mask\n"
4949 "Filter more specific routes from updates\n")
4950{
4951 int ret;
4952 char prefix_str[BUFSIZ];
4953
4954 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4955
4956 if (! ret)
4957 {
4958 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4959 return CMD_WARNING;
4960 }
4961
4962 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4963 AGGREGATE_SUMMARY_ONLY, 0);
4964}
4965
4966DEFUN (aggregate_address_as_set,
4967 aggregate_address_as_set_cmd,
4968 "aggregate-address A.B.C.D/M as-set",
4969 "Configure BGP aggregate entries\n"
4970 "Aggregate prefix\n"
4971 "Generate AS set path information\n")
4972{
4973 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4974 0, AGGREGATE_AS_SET);
4975}
4976
4977DEFUN (aggregate_address_mask_as_set,
4978 aggregate_address_mask_as_set_cmd,
4979 "aggregate-address A.B.C.D A.B.C.D as-set",
4980 "Configure BGP aggregate entries\n"
4981 "Aggregate address\n"
4982 "Aggregate mask\n"
4983 "Generate AS set path information\n")
4984{
4985 int ret;
4986 char prefix_str[BUFSIZ];
4987
4988 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4989
4990 if (! ret)
4991 {
4992 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4993 return CMD_WARNING;
4994 }
4995
4996 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4997 0, AGGREGATE_AS_SET);
4998}
4999
5000
5001DEFUN (aggregate_address_as_set_summary,
5002 aggregate_address_as_set_summary_cmd,
5003 "aggregate-address A.B.C.D/M as-set summary-only",
5004 "Configure BGP aggregate entries\n"
5005 "Aggregate prefix\n"
5006 "Generate AS set path information\n"
5007 "Filter more specific routes from updates\n")
5008{
5009 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5010 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5011}
5012
5013ALIAS (aggregate_address_as_set_summary,
5014 aggregate_address_summary_as_set_cmd,
5015 "aggregate-address A.B.C.D/M summary-only as-set",
5016 "Configure BGP aggregate entries\n"
5017 "Aggregate prefix\n"
5018 "Filter more specific routes from updates\n"
5019 "Generate AS set path information\n")
5020
5021DEFUN (aggregate_address_mask_as_set_summary,
5022 aggregate_address_mask_as_set_summary_cmd,
5023 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5024 "Configure BGP aggregate entries\n"
5025 "Aggregate address\n"
5026 "Aggregate mask\n"
5027 "Generate AS set path information\n"
5028 "Filter more specific routes from updates\n")
5029{
5030 int ret;
5031 char prefix_str[BUFSIZ];
5032
5033 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5034
5035 if (! ret)
5036 {
5037 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5038 return CMD_WARNING;
5039 }
5040
5041 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5042 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5043}
5044
5045ALIAS (aggregate_address_mask_as_set_summary,
5046 aggregate_address_mask_summary_as_set_cmd,
5047 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5048 "Configure BGP aggregate entries\n"
5049 "Aggregate address\n"
5050 "Aggregate mask\n"
5051 "Filter more specific routes from updates\n"
5052 "Generate AS set path information\n")
5053
5054DEFUN (no_aggregate_address,
5055 no_aggregate_address_cmd,
5056 "no aggregate-address A.B.C.D/M",
5057 NO_STR
5058 "Configure BGP aggregate entries\n"
5059 "Aggregate prefix\n")
5060{
5061 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5062}
5063
5064ALIAS (no_aggregate_address,
5065 no_aggregate_address_summary_only_cmd,
5066 "no aggregate-address A.B.C.D/M summary-only",
5067 NO_STR
5068 "Configure BGP aggregate entries\n"
5069 "Aggregate prefix\n"
5070 "Filter more specific routes from updates\n")
5071
5072ALIAS (no_aggregate_address,
5073 no_aggregate_address_as_set_cmd,
5074 "no aggregate-address A.B.C.D/M as-set",
5075 NO_STR
5076 "Configure BGP aggregate entries\n"
5077 "Aggregate prefix\n"
5078 "Generate AS set path information\n")
5079
5080ALIAS (no_aggregate_address,
5081 no_aggregate_address_as_set_summary_cmd,
5082 "no aggregate-address A.B.C.D/M as-set summary-only",
5083 NO_STR
5084 "Configure BGP aggregate entries\n"
5085 "Aggregate prefix\n"
5086 "Generate AS set path information\n"
5087 "Filter more specific routes from updates\n")
5088
5089ALIAS (no_aggregate_address,
5090 no_aggregate_address_summary_as_set_cmd,
5091 "no aggregate-address A.B.C.D/M summary-only as-set",
5092 NO_STR
5093 "Configure BGP aggregate entries\n"
5094 "Aggregate prefix\n"
5095 "Filter more specific routes from updates\n"
5096 "Generate AS set path information\n")
5097
5098DEFUN (no_aggregate_address_mask,
5099 no_aggregate_address_mask_cmd,
5100 "no aggregate-address A.B.C.D A.B.C.D",
5101 NO_STR
5102 "Configure BGP aggregate entries\n"
5103 "Aggregate address\n"
5104 "Aggregate mask\n")
5105{
5106 int ret;
5107 char prefix_str[BUFSIZ];
5108
5109 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5110
5111 if (! ret)
5112 {
5113 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5114 return CMD_WARNING;
5115 }
5116
5117 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5118}
5119
5120ALIAS (no_aggregate_address_mask,
5121 no_aggregate_address_mask_summary_only_cmd,
5122 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5123 NO_STR
5124 "Configure BGP aggregate entries\n"
5125 "Aggregate address\n"
5126 "Aggregate mask\n"
5127 "Filter more specific routes from updates\n")
5128
5129ALIAS (no_aggregate_address_mask,
5130 no_aggregate_address_mask_as_set_cmd,
5131 "no aggregate-address A.B.C.D A.B.C.D as-set",
5132 NO_STR
5133 "Configure BGP aggregate entries\n"
5134 "Aggregate address\n"
5135 "Aggregate mask\n"
5136 "Generate AS set path information\n")
5137
5138ALIAS (no_aggregate_address_mask,
5139 no_aggregate_address_mask_as_set_summary_cmd,
5140 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5141 NO_STR
5142 "Configure BGP aggregate entries\n"
5143 "Aggregate address\n"
5144 "Aggregate mask\n"
5145 "Generate AS set path information\n"
5146 "Filter more specific routes from updates\n")
5147
5148ALIAS (no_aggregate_address_mask,
5149 no_aggregate_address_mask_summary_as_set_cmd,
5150 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5151 NO_STR
5152 "Configure BGP aggregate entries\n"
5153 "Aggregate address\n"
5154 "Aggregate mask\n"
5155 "Filter more specific routes from updates\n"
5156 "Generate AS set path information\n")
5157
5158#ifdef HAVE_IPV6
5159DEFUN (ipv6_aggregate_address,
5160 ipv6_aggregate_address_cmd,
5161 "aggregate-address X:X::X:X/M",
5162 "Configure BGP aggregate entries\n"
5163 "Aggregate prefix\n")
5164{
5165 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5166}
5167
5168DEFUN (ipv6_aggregate_address_summary_only,
5169 ipv6_aggregate_address_summary_only_cmd,
5170 "aggregate-address X:X::X:X/M summary-only",
5171 "Configure BGP aggregate entries\n"
5172 "Aggregate prefix\n"
5173 "Filter more specific routes from updates\n")
5174{
5175 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5176 AGGREGATE_SUMMARY_ONLY, 0);
5177}
5178
5179DEFUN (no_ipv6_aggregate_address,
5180 no_ipv6_aggregate_address_cmd,
5181 "no aggregate-address X:X::X:X/M",
5182 NO_STR
5183 "Configure BGP aggregate entries\n"
5184 "Aggregate prefix\n")
5185{
5186 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5187}
5188
5189DEFUN (no_ipv6_aggregate_address_summary_only,
5190 no_ipv6_aggregate_address_summary_only_cmd,
5191 "no aggregate-address X:X::X:X/M summary-only",
5192 NO_STR
5193 "Configure BGP aggregate entries\n"
5194 "Aggregate prefix\n"
5195 "Filter more specific routes from updates\n")
5196{
5197 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5198}
5199
5200ALIAS (ipv6_aggregate_address,
5201 old_ipv6_aggregate_address_cmd,
5202 "ipv6 bgp aggregate-address X:X::X:X/M",
5203 IPV6_STR
5204 BGP_STR
5205 "Configure BGP aggregate entries\n"
5206 "Aggregate prefix\n")
5207
5208ALIAS (ipv6_aggregate_address_summary_only,
5209 old_ipv6_aggregate_address_summary_only_cmd,
5210 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5211 IPV6_STR
5212 BGP_STR
5213 "Configure BGP aggregate entries\n"
5214 "Aggregate prefix\n"
5215 "Filter more specific routes from updates\n")
5216
5217ALIAS (no_ipv6_aggregate_address,
5218 old_no_ipv6_aggregate_address_cmd,
5219 "no ipv6 bgp aggregate-address X:X::X:X/M",
5220 NO_STR
5221 IPV6_STR
5222 BGP_STR
5223 "Configure BGP aggregate entries\n"
5224 "Aggregate prefix\n")
5225
5226ALIAS (no_ipv6_aggregate_address_summary_only,
5227 old_no_ipv6_aggregate_address_summary_only_cmd,
5228 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5229 NO_STR
5230 IPV6_STR
5231 BGP_STR
5232 "Configure BGP aggregate entries\n"
5233 "Aggregate prefix\n"
5234 "Filter more specific routes from updates\n")
5235#endif /* HAVE_IPV6 */
5236
5237/* Redistribute route treatment. */
5238void
5239bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
5240 u_int32_t metric, u_char type)
5241{
5242 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005243 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005244 struct bgp_info *new;
5245 struct bgp_info *bi;
5246 struct bgp_info info;
5247 struct bgp_node *bn;
Paul Jakmafb982c22007-05-04 20:15:47 +00005248 struct attr attr = { 0 };
5249 struct attr attr_new = { 0 };
paul718e3742002-12-13 20:15:29 +00005250 struct attr *new_attr;
5251 afi_t afi;
5252 int ret;
5253
5254 /* Make default attribute. */
5255 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5256 if (nexthop)
5257 attr.nexthop = *nexthop;
5258
5259 attr.med = metric;
5260 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5261
paul1eb8ef22005-04-07 07:30:20 +00005262 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005263 {
5264 afi = family2afi (p->family);
5265
5266 if (bgp->redist[afi][type])
5267 {
5268 /* Copy attribute for modification. */
Paul Jakmafb982c22007-05-04 20:15:47 +00005269 bgp_attr_dup (&attr_new, &attr);
paul718e3742002-12-13 20:15:29 +00005270
5271 if (bgp->redist_metric_flag[afi][type])
5272 attr_new.med = bgp->redist_metric[afi][type];
5273
5274 /* Apply route-map. */
5275 if (bgp->rmap[afi][type].map)
5276 {
5277 info.peer = bgp->peer_self;
5278 info.attr = &attr_new;
5279
paulfee0f4c2004-09-13 05:12:46 +00005280 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5281
paul718e3742002-12-13 20:15:29 +00005282 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5283 &info);
paulfee0f4c2004-09-13 05:12:46 +00005284
5285 bgp->peer_self->rmap_type = 0;
5286
paul718e3742002-12-13 20:15:29 +00005287 if (ret == RMAP_DENYMATCH)
5288 {
5289 /* Free uninterned attribute. */
5290 bgp_attr_flush (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005291 bgp_attr_extra_free (&attr_new);
5292
paul718e3742002-12-13 20:15:29 +00005293 /* Unintern original. */
5294 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005295 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005296 bgp_redistribute_delete (p, type);
5297 return;
5298 }
5299 }
5300
Paul Jakmafb982c22007-05-04 20:15:47 +00005301 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5302 afi, SAFI_UNICAST, p, NULL);
5303
paul718e3742002-12-13 20:15:29 +00005304 new_attr = bgp_attr_intern (&attr_new);
Paul Jakmafb982c22007-05-04 20:15:47 +00005305 bgp_attr_extra_free (&attr_new);
5306
paul718e3742002-12-13 20:15:29 +00005307 for (bi = bn->info; bi; bi = bi->next)
5308 if (bi->peer == bgp->peer_self
5309 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5310 break;
5311
5312 if (bi)
5313 {
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005314 if (attrhash_cmp (bi->attr, new_attr) &&
5315 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
paul718e3742002-12-13 20:15:29 +00005316 {
5317 bgp_attr_unintern (new_attr);
5318 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005319 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005320 bgp_unlock_node (bn);
5321 return;
5322 }
5323 else
5324 {
5325 /* The attribute is changed. */
Paul Jakma1a392d42006-09-07 00:24:49 +00005326 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
paul718e3742002-12-13 20:15:29 +00005327
5328 /* Rewrite BGP route information. */
Andrew J. Schorr8d452102006-11-28 19:50:46 +00005329 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5330 bgp_info_restore(bn, bi);
5331 else
5332 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005333 bgp_attr_unintern (bi->attr);
5334 bi->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005335 bi->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005336
5337 /* Process change. */
5338 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5339 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5340 bgp_unlock_node (bn);
5341 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005342 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005343 return;
5344 }
5345 }
5346
5347 new = bgp_info_new ();
5348 new->type = type;
5349 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5350 new->peer = bgp->peer_self;
5351 SET_FLAG (new->flags, BGP_INFO_VALID);
5352 new->attr = new_attr;
Stephen Hemminger65957882010-01-15 16:22:10 +03005353 new->uptime = bgp_clock ();
paul718e3742002-12-13 20:15:29 +00005354
5355 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5356 bgp_info_add (bn, new);
paul200df112005-06-01 11:17:05 +00005357 bgp_unlock_node (bn);
paul718e3742002-12-13 20:15:29 +00005358 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5359 }
5360 }
5361
5362 /* Unintern original. */
5363 aspath_unintern (attr.aspath);
Paul Jakmafb982c22007-05-04 20:15:47 +00005364 bgp_attr_extra_free (&attr);
paul718e3742002-12-13 20:15:29 +00005365}
5366
5367void
5368bgp_redistribute_delete (struct prefix *p, u_char type)
5369{
5370 struct bgp *bgp;
paul1eb8ef22005-04-07 07:30:20 +00005371 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00005372 afi_t afi;
5373 struct bgp_node *rn;
5374 struct bgp_info *ri;
5375
paul1eb8ef22005-04-07 07:30:20 +00005376 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
paul718e3742002-12-13 20:15:29 +00005377 {
5378 afi = family2afi (p->family);
5379
5380 if (bgp->redist[afi][type])
5381 {
paulfee0f4c2004-09-13 05:12:46 +00005382 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
paul718e3742002-12-13 20:15:29 +00005383
5384 for (ri = rn->info; ri; ri = ri->next)
5385 if (ri->peer == bgp->peer_self
5386 && ri->type == type)
5387 break;
5388
5389 if (ri)
5390 {
5391 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005392 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005393 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005394 }
5395 bgp_unlock_node (rn);
5396 }
5397 }
5398}
5399
5400/* Withdraw specified route type's route. */
5401void
5402bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5403{
5404 struct bgp_node *rn;
5405 struct bgp_info *ri;
5406 struct bgp_table *table;
5407
5408 table = bgp->rib[afi][SAFI_UNICAST];
5409
5410 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5411 {
5412 for (ri = rn->info; ri; ri = ri->next)
5413 if (ri->peer == bgp->peer_self
5414 && ri->type == type)
5415 break;
5416
5417 if (ri)
5418 {
5419 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005420 bgp_info_delete (rn, ri);
Paul Jakma1a392d42006-09-07 00:24:49 +00005421 bgp_process (bgp, rn, afi, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00005422 }
5423 }
5424}
5425
5426/* Static function to display route. */
paul94f2b392005-06-28 12:44:16 +00005427static void
paul718e3742002-12-13 20:15:29 +00005428route_vty_out_route (struct prefix *p, struct vty *vty)
5429{
5430 int len;
5431 u_int32_t destination;
5432 char buf[BUFSIZ];
5433
5434 if (p->family == AF_INET)
5435 {
5436 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5437 destination = ntohl (p->u.prefix4.s_addr);
5438
5439 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5440 || (IN_CLASSB (destination) && p->prefixlen == 16)
5441 || (IN_CLASSA (destination) && p->prefixlen == 8)
5442 || p->u.prefix4.s_addr == 0)
5443 {
5444 /* When mask is natural, mask is not displayed. */
5445 }
5446 else
5447 len += vty_out (vty, "/%d", p->prefixlen);
5448 }
5449 else
5450 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5451 p->prefixlen);
5452
5453 len = 17 - len;
5454 if (len < 1)
5455 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5456 else
5457 vty_out (vty, "%*s", len, " ");
5458}
5459
paul718e3742002-12-13 20:15:29 +00005460enum bgp_display_type
5461{
5462 normal_list,
5463};
5464
paulb40d9392005-08-22 22:34:41 +00005465/* Print the short form route status for a bgp_info */
5466static void
5467route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
paul718e3742002-12-13 20:15:29 +00005468{
paulb40d9392005-08-22 22:34:41 +00005469 /* Route status display. */
5470 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5471 vty_out (vty, "R");
5472 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
hasso93406d82005-02-02 14:40:33 +00005473 vty_out (vty, "S");
Paul Jakmafb982c22007-05-04 20:15:47 +00005474 else if (binfo->extra && binfo->extra->suppress)
paul718e3742002-12-13 20:15:29 +00005475 vty_out (vty, "s");
5476 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5477 vty_out (vty, "*");
5478 else
5479 vty_out (vty, " ");
5480
5481 /* Selected */
5482 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5483 vty_out (vty, "h");
5484 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5485 vty_out (vty, "d");
5486 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5487 vty_out (vty, ">");
5488 else
5489 vty_out (vty, " ");
5490
5491 /* Internal route. */
5492 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5493 vty_out (vty, "i");
5494 else
paulb40d9392005-08-22 22:34:41 +00005495 vty_out (vty, " ");
5496}
5497
5498/* called from terminal list command */
5499void
5500route_vty_out (struct vty *vty, struct prefix *p,
5501 struct bgp_info *binfo, int display, safi_t safi)
5502{
5503 struct attr *attr;
5504
5505 /* short status lead text */
5506 route_vty_short_status_out (vty, binfo);
paul718e3742002-12-13 20:15:29 +00005507
5508 /* print prefix and mask */
5509 if (! display)
5510 route_vty_out_route (p, vty);
5511 else
5512 vty_out (vty, "%*s", 17, " ");
5513
5514 /* Print attribute */
5515 attr = binfo->attr;
5516 if (attr)
5517 {
5518 if (p->family == AF_INET)
5519 {
5520 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005521 vty_out (vty, "%-16s",
5522 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005523 else
5524 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5525 }
5526#ifdef HAVE_IPV6
5527 else if (p->family == AF_INET6)
5528 {
5529 int len;
5530 char buf[BUFSIZ];
5531
5532 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005533 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5534 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005535 len = 16 - len;
5536 if (len < 1)
5537 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5538 else
5539 vty_out (vty, "%*s", len, " ");
5540 }
5541#endif /* HAVE_IPV6 */
5542
5543 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5544 vty_out (vty, "%10d", attr->med);
5545 else
5546 vty_out (vty, " ");
5547
5548 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5549 vty_out (vty, "%7d", attr->local_pref);
5550 else
5551 vty_out (vty, " ");
5552
Paul Jakmafb982c22007-05-04 20:15:47 +00005553 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
paul718e3742002-12-13 20:15:29 +00005554
Paul Jakmab2518c12006-05-12 23:48:40 +00005555 /* Print aspath */
5556 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005557 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005558
Paul Jakmab2518c12006-05-12 23:48:40 +00005559 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005560 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005561 }
paul718e3742002-12-13 20:15:29 +00005562 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005563}
5564
5565/* called from terminal list command */
5566void
5567route_vty_out_tmp (struct vty *vty, struct prefix *p,
5568 struct attr *attr, safi_t safi)
5569{
5570 /* Route status display. */
5571 vty_out (vty, "*");
5572 vty_out (vty, ">");
5573 vty_out (vty, " ");
5574
5575 /* print prefix and mask */
5576 route_vty_out_route (p, vty);
5577
5578 /* Print attribute */
5579 if (attr)
5580 {
5581 if (p->family == AF_INET)
5582 {
5583 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005584 vty_out (vty, "%-16s",
5585 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005586 else
5587 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5588 }
5589#ifdef HAVE_IPV6
5590 else if (p->family == AF_INET6)
5591 {
5592 int len;
5593 char buf[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005594
5595 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005596
5597 len = vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005598 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5599 buf, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005600 len = 16 - len;
5601 if (len < 1)
5602 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5603 else
5604 vty_out (vty, "%*s", len, " ");
5605 }
5606#endif /* HAVE_IPV6 */
5607
5608 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5609 vty_out (vty, "%10d", attr->med);
5610 else
5611 vty_out (vty, " ");
5612
5613 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5614 vty_out (vty, "%7d", attr->local_pref);
5615 else
5616 vty_out (vty, " ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005617
5618 vty_out (vty, "%7d ", (attr->extra ? attr->extra->weight : 0));
5619
Paul Jakmab2518c12006-05-12 23:48:40 +00005620 /* Print aspath */
5621 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005622 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005623
Paul Jakmab2518c12006-05-12 23:48:40 +00005624 /* Print origin */
paul718e3742002-12-13 20:15:29 +00005625 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
Paul Jakmab2518c12006-05-12 23:48:40 +00005626 }
paul718e3742002-12-13 20:15:29 +00005627
5628 vty_out (vty, "%s", VTY_NEWLINE);
5629}
5630
ajs5a646652004-11-05 01:25:55 +00005631void
paul718e3742002-12-13 20:15:29 +00005632route_vty_out_tag (struct vty *vty, struct prefix *p,
5633 struct bgp_info *binfo, int display, safi_t safi)
5634{
5635 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005636 u_int32_t label = 0;
Paul Jakmafb982c22007-05-04 20:15:47 +00005637
5638 if (!binfo->extra)
5639 return;
5640
paulb40d9392005-08-22 22:34:41 +00005641 /* short status lead text */
5642 route_vty_short_status_out (vty, binfo);
5643
paul718e3742002-12-13 20:15:29 +00005644 /* print prefix and mask */
5645 if (! display)
5646 route_vty_out_route (p, vty);
5647 else
5648 vty_out (vty, "%*s", 17, " ");
5649
5650 /* Print attribute */
5651 attr = binfo->attr;
5652 if (attr)
5653 {
5654 if (p->family == AF_INET)
5655 {
5656 if (safi == SAFI_MPLS_VPN)
Paul Jakmafb982c22007-05-04 20:15:47 +00005657 vty_out (vty, "%-16s",
5658 inet_ntoa (attr->extra->mp_nexthop_global_in));
paul718e3742002-12-13 20:15:29 +00005659 else
5660 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5661 }
5662#ifdef HAVE_IPV6
5663 else if (p->family == AF_INET6)
5664 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005665 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005666 char buf[BUFSIZ];
5667 char buf1[BUFSIZ];
Paul Jakmafb982c22007-05-04 20:15:47 +00005668 if (attr->extra->mp_nexthop_len == 16)
paul718e3742002-12-13 20:15:29 +00005669 vty_out (vty, "%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005670 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5671 buf, BUFSIZ));
5672 else if (attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005673 vty_out (vty, "%s(%s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005674 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5675 buf, BUFSIZ),
5676 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5677 buf1, BUFSIZ));
paul718e3742002-12-13 20:15:29 +00005678
5679 }
5680#endif /* HAVE_IPV6 */
5681 }
5682
Paul Jakmafb982c22007-05-04 20:15:47 +00005683 label = decode_label (binfo->extra->tag);
paul718e3742002-12-13 20:15:29 +00005684
5685 vty_out (vty, "notag/%d", label);
5686
5687 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005688}
5689
5690/* dampening route */
ajs5a646652004-11-05 01:25:55 +00005691static void
paul718e3742002-12-13 20:15:29 +00005692damp_route_vty_out (struct vty *vty, struct prefix *p,
5693 struct bgp_info *binfo, int display, safi_t safi)
5694{
5695 struct attr *attr;
paul718e3742002-12-13 20:15:29 +00005696 int len;
Chris Caputo50aef6f2009-06-23 06:06:49 +00005697 char timebuf[BGP_UPTIME_LEN];
paul718e3742002-12-13 20:15:29 +00005698
paulb40d9392005-08-22 22:34:41 +00005699 /* short status lead text */
5700 route_vty_short_status_out (vty, binfo);
5701
paul718e3742002-12-13 20:15:29 +00005702 /* print prefix and mask */
5703 if (! display)
5704 route_vty_out_route (p, vty);
5705 else
5706 vty_out (vty, "%*s", 17, " ");
5707
5708 len = vty_out (vty, "%s", binfo->peer->host);
5709 len = 17 - len;
5710 if (len < 1)
5711 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5712 else
5713 vty_out (vty, "%*s", len, " ");
5714
Chris Caputo50aef6f2009-06-23 06:06:49 +00005715 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005716
5717 /* Print attribute */
5718 attr = binfo->attr;
5719 if (attr)
5720 {
5721 /* Print aspath */
5722 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005723 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005724
5725 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005726 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005727 }
5728 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005729}
5730
paul718e3742002-12-13 20:15:29 +00005731/* flap route */
ajs5a646652004-11-05 01:25:55 +00005732static void
paul718e3742002-12-13 20:15:29 +00005733flap_route_vty_out (struct vty *vty, struct prefix *p,
5734 struct bgp_info *binfo, int display, safi_t safi)
5735{
5736 struct attr *attr;
5737 struct bgp_damp_info *bdi;
paul718e3742002-12-13 20:15:29 +00005738 char timebuf[BGP_UPTIME_LEN];
5739 int len;
Paul Jakmafb982c22007-05-04 20:15:47 +00005740
5741 if (!binfo->extra)
5742 return;
5743
5744 bdi = binfo->extra->damp_info;
paul718e3742002-12-13 20:15:29 +00005745
paulb40d9392005-08-22 22:34:41 +00005746 /* short status lead text */
5747 route_vty_short_status_out (vty, binfo);
5748
paul718e3742002-12-13 20:15:29 +00005749 /* print prefix and mask */
5750 if (! display)
5751 route_vty_out_route (p, vty);
5752 else
5753 vty_out (vty, "%*s", 17, " ");
5754
5755 len = vty_out (vty, "%s", binfo->peer->host);
5756 len = 16 - len;
5757 if (len < 1)
5758 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5759 else
5760 vty_out (vty, "%*s", len, " ");
5761
5762 len = vty_out (vty, "%d", bdi->flap);
5763 len = 5 - len;
5764 if (len < 1)
5765 vty_out (vty, " ");
5766 else
5767 vty_out (vty, "%*s ", len, " ");
5768
5769 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5770 timebuf, BGP_UPTIME_LEN));
5771
5772 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5773 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
Chris Caputo50aef6f2009-06-23 06:06:49 +00005774 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
paul718e3742002-12-13 20:15:29 +00005775 else
5776 vty_out (vty, "%*s ", 8, " ");
5777
5778 /* Print attribute */
5779 attr = binfo->attr;
5780 if (attr)
5781 {
5782 /* Print aspath */
5783 if (attr->aspath)
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005784 aspath_print_vty (vty, "%s", attr->aspath, " ");
paul718e3742002-12-13 20:15:29 +00005785
5786 /* Print origin */
Paul Jakmab2518c12006-05-12 23:48:40 +00005787 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +00005788 }
5789 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005790}
5791
paul94f2b392005-06-28 12:44:16 +00005792static void
paul718e3742002-12-13 20:15:29 +00005793route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5794 struct bgp_info *binfo, afi_t afi, safi_t safi)
5795{
5796 char buf[INET6_ADDRSTRLEN];
5797 char buf1[BUFSIZ];
5798 struct attr *attr;
5799 int sockunion_vty_out (struct vty *, union sockunion *);
5800
5801 attr = binfo->attr;
5802
5803 if (attr)
5804 {
5805 /* Line1 display AS-path, Aggregator */
5806 if (attr->aspath)
5807 {
5808 vty_out (vty, " ");
paulfe69a502005-09-10 16:55:02 +00005809 if (aspath_count_hops (attr->aspath) == 0)
paul718e3742002-12-13 20:15:29 +00005810 vty_out (vty, "Local");
5811 else
Denis Ovsienko841f7a52008-04-10 11:47:45 +00005812 aspath_print_vty (vty, "%s", attr->aspath, "");
paul718e3742002-12-13 20:15:29 +00005813 }
5814
paulb40d9392005-08-22 22:34:41 +00005815 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5816 vty_out (vty, ", (removed)");
hasso93406d82005-02-02 14:40:33 +00005817 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5818 vty_out (vty, ", (stale)");
5819 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
Denis Ovsienkoaea339f2009-04-30 17:16:22 +04005820 vty_out (vty, ", (aggregated by %u %s)",
Paul Jakmafb982c22007-05-04 20:15:47 +00005821 attr->extra->aggregator_as,
5822 inet_ntoa (attr->extra->aggregator_addr));
hasso93406d82005-02-02 14:40:33 +00005823 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5824 vty_out (vty, ", (Received from a RR-client)");
5825 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5826 vty_out (vty, ", (Received from a RS-client)");
5827 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5828 vty_out (vty, ", (history entry)");
5829 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5830 vty_out (vty, ", (suppressed due to dampening)");
paul718e3742002-12-13 20:15:29 +00005831 vty_out (vty, "%s", VTY_NEWLINE);
5832
5833 /* Line2 display Next-hop, Neighbor, Router-id */
5834 if (p->family == AF_INET)
5835 {
5836 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
Paul Jakmafb982c22007-05-04 20:15:47 +00005837 inet_ntoa (attr->extra->mp_nexthop_global_in) :
paul718e3742002-12-13 20:15:29 +00005838 inet_ntoa (attr->nexthop));
5839 }
5840#ifdef HAVE_IPV6
5841 else
5842 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005843 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005844 vty_out (vty, " %s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005845 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
paul718e3742002-12-13 20:15:29 +00005846 buf, INET6_ADDRSTRLEN));
5847 }
5848#endif /* HAVE_IPV6 */
5849
5850 if (binfo->peer == bgp->peer_self)
5851 {
5852 vty_out (vty, " from %s ",
5853 p->family == AF_INET ? "0.0.0.0" : "::");
5854 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5855 }
5856 else
5857 {
5858 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5859 vty_out (vty, " (inaccessible)");
Paul Jakmafb982c22007-05-04 20:15:47 +00005860 else if (binfo->extra && binfo->extra->igpmetric)
5861 vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
pauleb821182004-05-01 08:44:08 +00005862 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
paul718e3742002-12-13 20:15:29 +00005863 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005864 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005865 else
5866 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
5867 }
5868 vty_out (vty, "%s", VTY_NEWLINE);
5869
5870#ifdef HAVE_IPV6
5871 /* display nexthop local */
Paul Jakmafb982c22007-05-04 20:15:47 +00005872 if (attr->extra && attr->extra->mp_nexthop_len == 32)
paul718e3742002-12-13 20:15:29 +00005873 {
5874 vty_out (vty, " (%s)%s",
Paul Jakmafb982c22007-05-04 20:15:47 +00005875 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
paul718e3742002-12-13 20:15:29 +00005876 buf, INET6_ADDRSTRLEN),
5877 VTY_NEWLINE);
5878 }
5879#endif /* HAVE_IPV6 */
5880
5881 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
5882 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
5883
5884 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
5885 vty_out (vty, ", metric %d", attr->med);
5886
5887 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
5888 vty_out (vty, ", localpref %d", attr->local_pref);
5889 else
5890 vty_out (vty, ", localpref %d", bgp->default_local_pref);
5891
Paul Jakmafb982c22007-05-04 20:15:47 +00005892 if (attr->extra && attr->extra->weight != 0)
5893 vty_out (vty, ", weight %d", attr->extra->weight);
paul718e3742002-12-13 20:15:29 +00005894
5895 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5896 vty_out (vty, ", valid");
5897
5898 if (binfo->peer != bgp->peer_self)
5899 {
5900 if (binfo->peer->as == binfo->peer->local_as)
5901 vty_out (vty, ", internal");
5902 else
5903 vty_out (vty, ", %s",
5904 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
5905 }
5906 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
5907 vty_out (vty, ", aggregated, local");
5908 else if (binfo->type != ZEBRA_ROUTE_BGP)
5909 vty_out (vty, ", sourced");
5910 else
5911 vty_out (vty, ", sourced, local");
5912
5913 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
5914 vty_out (vty, ", atomic-aggregate");
5915
5916 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5917 vty_out (vty, ", best");
5918
5919 vty_out (vty, "%s", VTY_NEWLINE);
5920
5921 /* Line 4 display Community */
5922 if (attr->community)
5923 vty_out (vty, " Community: %s%s", attr->community->str,
5924 VTY_NEWLINE);
5925
5926 /* Line 5 display Extended-community */
5927 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
Paul Jakmafb982c22007-05-04 20:15:47 +00005928 vty_out (vty, " Extended Community: %s%s",
5929 attr->extra->ecommunity->str, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00005930
5931 /* Line 6 display Originator, Cluster-id */
5932 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
5933 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
5934 {
Paul Jakmafb982c22007-05-04 20:15:47 +00005935 assert (attr->extra);
paul718e3742002-12-13 20:15:29 +00005936 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
Paul Jakmafb982c22007-05-04 20:15:47 +00005937 vty_out (vty, " Originator: %s",
5938 inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +00005939
5940 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
5941 {
5942 int i;
5943 vty_out (vty, ", Cluster list: ");
Paul Jakmafb982c22007-05-04 20:15:47 +00005944 for (i = 0; i < attr->extra->cluster->length / 4; i++)
5945 vty_out (vty, "%s ",
5946 inet_ntoa (attr->extra->cluster->list[i]));
paul718e3742002-12-13 20:15:29 +00005947 }
5948 vty_out (vty, "%s", VTY_NEWLINE);
5949 }
Paul Jakma41367172007-08-06 15:24:51 +00005950
Paul Jakmafb982c22007-05-04 20:15:47 +00005951 if (binfo->extra && binfo->extra->damp_info)
paul718e3742002-12-13 20:15:29 +00005952 bgp_damp_info_vty (vty, binfo);
5953
5954 /* Line 7 display Uptime */
Vladimir L Ivanov213b6cd2010-10-21 14:59:54 +04005955 time_t tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
5956 vty_out (vty, " Last update: %s", ctime(&tbuf));
paul718e3742002-12-13 20:15:29 +00005957 }
5958 vty_out (vty, "%s", VTY_NEWLINE);
5959}
5960
paulb40d9392005-08-22 22:34:41 +00005961#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 +00005962#define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
paul718e3742002-12-13 20:15:29 +00005963#define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
5964#define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
5965#define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
5966
5967enum bgp_show_type
5968{
5969 bgp_show_type_normal,
5970 bgp_show_type_regexp,
5971 bgp_show_type_prefix_list,
5972 bgp_show_type_filter_list,
5973 bgp_show_type_route_map,
5974 bgp_show_type_neighbor,
5975 bgp_show_type_cidr_only,
5976 bgp_show_type_prefix_longer,
5977 bgp_show_type_community_all,
5978 bgp_show_type_community,
5979 bgp_show_type_community_exact,
5980 bgp_show_type_community_list,
5981 bgp_show_type_community_list_exact,
5982 bgp_show_type_flap_statistics,
5983 bgp_show_type_flap_address,
5984 bgp_show_type_flap_prefix,
5985 bgp_show_type_flap_cidr_only,
5986 bgp_show_type_flap_regexp,
5987 bgp_show_type_flap_filter_list,
5988 bgp_show_type_flap_prefix_list,
5989 bgp_show_type_flap_prefix_longer,
5990 bgp_show_type_flap_route_map,
5991 bgp_show_type_flap_neighbor,
5992 bgp_show_type_dampend_paths,
5993 bgp_show_type_damp_neighbor
5994};
5995
ajs5a646652004-11-05 01:25:55 +00005996static int
paulfee0f4c2004-09-13 05:12:46 +00005997bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
ajs5a646652004-11-05 01:25:55 +00005998 enum bgp_show_type type, void *output_arg)
paul718e3742002-12-13 20:15:29 +00005999{
paul718e3742002-12-13 20:15:29 +00006000 struct bgp_info *ri;
6001 struct bgp_node *rn;
paul718e3742002-12-13 20:15:29 +00006002 int header = 1;
paul718e3742002-12-13 20:15:29 +00006003 int display;
ajs5a646652004-11-05 01:25:55 +00006004 unsigned long output_count;
paul718e3742002-12-13 20:15:29 +00006005
6006 /* This is first entry point, so reset total line. */
ajs5a646652004-11-05 01:25:55 +00006007 output_count = 0;
paul718e3742002-12-13 20:15:29 +00006008
paul718e3742002-12-13 20:15:29 +00006009 /* Start processing of routes. */
6010 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6011 if (rn->info != NULL)
6012 {
6013 display = 0;
6014
6015 for (ri = rn->info; ri; ri = ri->next)
6016 {
ajs5a646652004-11-05 01:25:55 +00006017 if (type == bgp_show_type_flap_statistics
paul718e3742002-12-13 20:15:29 +00006018 || type == bgp_show_type_flap_address
6019 || type == bgp_show_type_flap_prefix
6020 || type == bgp_show_type_flap_cidr_only
6021 || type == bgp_show_type_flap_regexp
6022 || type == bgp_show_type_flap_filter_list
6023 || type == bgp_show_type_flap_prefix_list
6024 || type == bgp_show_type_flap_prefix_longer
6025 || type == bgp_show_type_flap_route_map
6026 || type == bgp_show_type_flap_neighbor
6027 || type == bgp_show_type_dampend_paths
6028 || type == bgp_show_type_damp_neighbor)
6029 {
Paul Jakmafb982c22007-05-04 20:15:47 +00006030 if (!(ri->extra && ri->extra->damp_info))
paul718e3742002-12-13 20:15:29 +00006031 continue;
6032 }
6033 if (type == bgp_show_type_regexp
6034 || type == bgp_show_type_flap_regexp)
6035 {
ajs5a646652004-11-05 01:25:55 +00006036 regex_t *regex = output_arg;
paul718e3742002-12-13 20:15:29 +00006037
6038 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6039 continue;
6040 }
6041 if (type == bgp_show_type_prefix_list
6042 || type == bgp_show_type_flap_prefix_list)
6043 {
ajs5a646652004-11-05 01:25:55 +00006044 struct prefix_list *plist = output_arg;
paul718e3742002-12-13 20:15:29 +00006045
6046 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6047 continue;
6048 }
6049 if (type == bgp_show_type_filter_list
6050 || type == bgp_show_type_flap_filter_list)
6051 {
ajs5a646652004-11-05 01:25:55 +00006052 struct as_list *as_list = output_arg;
paul718e3742002-12-13 20:15:29 +00006053
6054 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6055 continue;
6056 }
6057 if (type == bgp_show_type_route_map
6058 || type == bgp_show_type_flap_route_map)
6059 {
ajs5a646652004-11-05 01:25:55 +00006060 struct route_map *rmap = output_arg;
paul718e3742002-12-13 20:15:29 +00006061 struct bgp_info binfo;
Paul Jakma9eda90c2007-08-30 13:36:17 +00006062 struct attr dummy_attr = { 0 };
paul718e3742002-12-13 20:15:29 +00006063 int ret;
6064
Paul Jakmafb982c22007-05-04 20:15:47 +00006065 bgp_attr_dup (&dummy_attr, ri->attr);
paul718e3742002-12-13 20:15:29 +00006066 binfo.peer = ri->peer;
6067 binfo.attr = &dummy_attr;
6068
6069 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
Paul Jakmafb982c22007-05-04 20:15:47 +00006070
6071 bgp_attr_extra_free (&dummy_attr);
6072
paul718e3742002-12-13 20:15:29 +00006073 if (ret == RMAP_DENYMATCH)
6074 continue;
6075 }
6076 if (type == bgp_show_type_neighbor
6077 || type == bgp_show_type_flap_neighbor
6078 || type == bgp_show_type_damp_neighbor)
6079 {
ajs5a646652004-11-05 01:25:55 +00006080 union sockunion *su = output_arg;
paul718e3742002-12-13 20:15:29 +00006081
6082 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6083 continue;
6084 }
6085 if (type == bgp_show_type_cidr_only
6086 || type == bgp_show_type_flap_cidr_only)
6087 {
6088 u_int32_t destination;
6089
6090 destination = ntohl (rn->p.u.prefix4.s_addr);
6091 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6092 continue;
6093 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6094 continue;
6095 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6096 continue;
6097 }
6098 if (type == bgp_show_type_prefix_longer
6099 || type == bgp_show_type_flap_prefix_longer)
6100 {
ajs5a646652004-11-05 01:25:55 +00006101 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006102
6103 if (! prefix_match (p, &rn->p))
6104 continue;
6105 }
6106 if (type == bgp_show_type_community_all)
6107 {
6108 if (! ri->attr->community)
6109 continue;
6110 }
6111 if (type == bgp_show_type_community)
6112 {
ajs5a646652004-11-05 01:25:55 +00006113 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006114
6115 if (! ri->attr->community ||
6116 ! community_match (ri->attr->community, com))
6117 continue;
6118 }
6119 if (type == bgp_show_type_community_exact)
6120 {
ajs5a646652004-11-05 01:25:55 +00006121 struct community *com = output_arg;
paul718e3742002-12-13 20:15:29 +00006122
6123 if (! ri->attr->community ||
6124 ! community_cmp (ri->attr->community, com))
6125 continue;
6126 }
6127 if (type == bgp_show_type_community_list)
6128 {
ajs5a646652004-11-05 01:25:55 +00006129 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006130
6131 if (! community_list_match (ri->attr->community, list))
6132 continue;
6133 }
6134 if (type == bgp_show_type_community_list_exact)
6135 {
ajs5a646652004-11-05 01:25:55 +00006136 struct community_list *list = output_arg;
paul718e3742002-12-13 20:15:29 +00006137
6138 if (! community_list_exact_match (ri->attr->community, list))
6139 continue;
6140 }
6141 if (type == bgp_show_type_flap_address
6142 || type == bgp_show_type_flap_prefix)
6143 {
ajs5a646652004-11-05 01:25:55 +00006144 struct prefix *p = output_arg;
paul718e3742002-12-13 20:15:29 +00006145
6146 if (! prefix_match (&rn->p, p))
6147 continue;
6148
6149 if (type == bgp_show_type_flap_prefix)
6150 if (p->prefixlen != rn->p.prefixlen)
6151 continue;
6152 }
6153 if (type == bgp_show_type_dampend_paths
6154 || type == bgp_show_type_damp_neighbor)
6155 {
6156 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6157 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6158 continue;
6159 }
6160
6161 if (header)
6162 {
hasso93406d82005-02-02 14:40:33 +00006163 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6164 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6165 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006166 if (type == bgp_show_type_dampend_paths
6167 || type == bgp_show_type_damp_neighbor)
6168 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6169 else if (type == bgp_show_type_flap_statistics
6170 || type == bgp_show_type_flap_address
6171 || type == bgp_show_type_flap_prefix
6172 || type == bgp_show_type_flap_cidr_only
6173 || type == bgp_show_type_flap_regexp
6174 || type == bgp_show_type_flap_filter_list
6175 || type == bgp_show_type_flap_prefix_list
6176 || type == bgp_show_type_flap_prefix_longer
6177 || type == bgp_show_type_flap_route_map
6178 || type == bgp_show_type_flap_neighbor)
6179 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6180 else
6181 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006182 header = 0;
6183 }
6184
6185 if (type == bgp_show_type_dampend_paths
6186 || type == bgp_show_type_damp_neighbor)
ajs5a646652004-11-05 01:25:55 +00006187 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006188 else if (type == bgp_show_type_flap_statistics
6189 || type == bgp_show_type_flap_address
6190 || type == bgp_show_type_flap_prefix
6191 || type == bgp_show_type_flap_cidr_only
6192 || type == bgp_show_type_flap_regexp
6193 || type == bgp_show_type_flap_filter_list
6194 || type == bgp_show_type_flap_prefix_list
6195 || type == bgp_show_type_flap_prefix_longer
6196 || type == bgp_show_type_flap_route_map
6197 || type == bgp_show_type_flap_neighbor)
ajs5a646652004-11-05 01:25:55 +00006198 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006199 else
ajs5a646652004-11-05 01:25:55 +00006200 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +00006201 display++;
6202 }
6203 if (display)
ajs5a646652004-11-05 01:25:55 +00006204 output_count++;
paul718e3742002-12-13 20:15:29 +00006205 }
6206
6207 /* No route is displayed */
ajs5a646652004-11-05 01:25:55 +00006208 if (output_count == 0)
paul718e3742002-12-13 20:15:29 +00006209 {
6210 if (type == bgp_show_type_normal)
6211 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6212 }
6213 else
6214 vty_out (vty, "%sTotal number of prefixes %ld%s",
ajs5a646652004-11-05 01:25:55 +00006215 VTY_NEWLINE, output_count, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006216
6217 return CMD_SUCCESS;
6218}
6219
ajs5a646652004-11-05 01:25:55 +00006220static int
paulfee0f4c2004-09-13 05:12:46 +00006221bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
ajs5a646652004-11-05 01:25:55 +00006222 enum bgp_show_type type, void *output_arg)
paulfee0f4c2004-09-13 05:12:46 +00006223{
6224 struct bgp_table *table;
6225
6226 if (bgp == NULL) {
6227 bgp = bgp_get_default ();
6228 }
6229
6230 if (bgp == NULL)
6231 {
6232 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6233 return CMD_WARNING;
6234 }
6235
6236
6237 table = bgp->rib[afi][safi];
6238
ajs5a646652004-11-05 01:25:55 +00006239 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
paulfee0f4c2004-09-13 05:12:46 +00006240}
6241
paul718e3742002-12-13 20:15:29 +00006242/* Header of detailed BGP route information */
paul94f2b392005-06-28 12:44:16 +00006243static void
paul718e3742002-12-13 20:15:29 +00006244route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6245 struct bgp_node *rn,
6246 struct prefix_rd *prd, afi_t afi, safi_t safi)
6247{
6248 struct bgp_info *ri;
6249 struct prefix *p;
6250 struct peer *peer;
paul1eb8ef22005-04-07 07:30:20 +00006251 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00006252 char buf1[INET6_ADDRSTRLEN];
6253 char buf2[INET6_ADDRSTRLEN];
6254 int count = 0;
6255 int best = 0;
6256 int suppress = 0;
6257 int no_export = 0;
6258 int no_advertise = 0;
6259 int local_as = 0;
6260 int first = 0;
6261
6262 p = &rn->p;
6263 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6264 (safi == SAFI_MPLS_VPN ?
6265 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6266 safi == SAFI_MPLS_VPN ? ":" : "",
6267 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6268 p->prefixlen, VTY_NEWLINE);
6269
6270 for (ri = rn->info; ri; ri = ri->next)
6271 {
6272 count++;
6273 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6274 {
6275 best = count;
Paul Jakmafb982c22007-05-04 20:15:47 +00006276 if (ri->extra && ri->extra->suppress)
paul718e3742002-12-13 20:15:29 +00006277 suppress = 1;
6278 if (ri->attr->community != NULL)
6279 {
6280 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6281 no_advertise = 1;
6282 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6283 no_export = 1;
6284 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6285 local_as = 1;
6286 }
6287 }
6288 }
6289
6290 vty_out (vty, "Paths: (%d available", count);
6291 if (best)
6292 {
6293 vty_out (vty, ", best #%d", best);
6294 if (safi == SAFI_UNICAST)
6295 vty_out (vty, ", table Default-IP-Routing-Table");
6296 }
6297 else
6298 vty_out (vty, ", no best path");
6299 if (no_advertise)
6300 vty_out (vty, ", not advertised to any peer");
6301 else if (no_export)
6302 vty_out (vty, ", not advertised to EBGP peer");
6303 else if (local_as)
6304 vty_out (vty, ", not advertised outside local AS");
6305 if (suppress)
6306 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6307 vty_out (vty, ")%s", VTY_NEWLINE);
6308
6309 /* advertised peer */
paul1eb8ef22005-04-07 07:30:20 +00006310 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
paul718e3742002-12-13 20:15:29 +00006311 {
6312 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6313 {
6314 if (! first)
6315 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6316 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6317 first = 1;
6318 }
6319 }
6320 if (! first)
6321 vty_out (vty, " Not advertised to any peer");
6322 vty_out (vty, "%s", VTY_NEWLINE);
6323}
6324
6325/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +00006326static int
paulfee0f4c2004-09-13 05:12:46 +00006327bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
paulfd79ac92004-10-13 05:06:08 +00006328 struct bgp_table *rib, const char *ip_str,
6329 afi_t afi, safi_t safi, struct prefix_rd *prd,
6330 int prefix_check)
paul718e3742002-12-13 20:15:29 +00006331{
6332 int ret;
6333 int header;
6334 int display = 0;
6335 struct prefix match;
6336 struct bgp_node *rn;
6337 struct bgp_node *rm;
6338 struct bgp_info *ri;
paul718e3742002-12-13 20:15:29 +00006339 struct bgp_table *table;
6340
paul718e3742002-12-13 20:15:29 +00006341 /* Check IP address argument. */
6342 ret = str2prefix (ip_str, &match);
6343 if (! ret)
6344 {
6345 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6346 return CMD_WARNING;
6347 }
6348
6349 match.family = afi2family (afi);
6350
6351 if (safi == SAFI_MPLS_VPN)
6352 {
paulfee0f4c2004-09-13 05:12:46 +00006353 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
paul718e3742002-12-13 20:15:29 +00006354 {
6355 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6356 continue;
6357
6358 if ((table = rn->info) != NULL)
6359 {
6360 header = 1;
6361
6362 if ((rm = bgp_node_match (table, &match)) != NULL)
6363 {
6364 if (prefix_check && rm->p.prefixlen != match.prefixlen)
6365 continue;
6366
6367 for (ri = rm->info; ri; ri = ri->next)
6368 {
6369 if (header)
6370 {
6371 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6372 AFI_IP, SAFI_MPLS_VPN);
6373
6374 header = 0;
6375 }
6376 display++;
6377 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6378 }
6379 }
6380 }
6381 }
6382 }
6383 else
6384 {
6385 header = 1;
6386
paulfee0f4c2004-09-13 05:12:46 +00006387 if ((rn = bgp_node_match (rib, &match)) != NULL)
paul718e3742002-12-13 20:15:29 +00006388 {
6389 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6390 {
6391 for (ri = rn->info; ri; ri = ri->next)
6392 {
6393 if (header)
6394 {
6395 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6396 header = 0;
6397 }
6398 display++;
6399 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6400 }
6401 }
6402 }
6403 }
6404
6405 if (! display)
6406 {
6407 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6408 return CMD_WARNING;
6409 }
6410
6411 return CMD_SUCCESS;
6412}
6413
paulfee0f4c2004-09-13 05:12:46 +00006414/* Display specified route of Main RIB */
paul94f2b392005-06-28 12:44:16 +00006415static int
paulfd79ac92004-10-13 05:06:08 +00006416bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
paulfee0f4c2004-09-13 05:12:46 +00006417 afi_t afi, safi_t safi, struct prefix_rd *prd,
6418 int prefix_check)
6419{
6420 struct bgp *bgp;
6421
6422 /* BGP structure lookup. */
6423 if (view_name)
6424 {
6425 bgp = bgp_lookup_by_name (view_name);
6426 if (bgp == NULL)
6427 {
6428 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6429 return CMD_WARNING;
6430 }
6431 }
6432 else
6433 {
6434 bgp = bgp_get_default ();
6435 if (bgp == NULL)
6436 {
6437 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6438 return CMD_WARNING;
6439 }
6440 }
6441
6442 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6443 afi, safi, prd, prefix_check);
6444}
6445
paul718e3742002-12-13 20:15:29 +00006446/* BGP route print out function. */
6447DEFUN (show_ip_bgp,
6448 show_ip_bgp_cmd,
6449 "show ip bgp",
6450 SHOW_STR
6451 IP_STR
6452 BGP_STR)
6453{
ajs5a646652004-11-05 01:25:55 +00006454 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006455}
6456
6457DEFUN (show_ip_bgp_ipv4,
6458 show_ip_bgp_ipv4_cmd,
6459 "show ip bgp ipv4 (unicast|multicast)",
6460 SHOW_STR
6461 IP_STR
6462 BGP_STR
6463 "Address family\n"
6464 "Address Family modifier\n"
6465 "Address Family modifier\n")
6466{
6467 if (strncmp (argv[0], "m", 1) == 0)
ajs5a646652004-11-05 01:25:55 +00006468 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6469 NULL);
paul718e3742002-12-13 20:15:29 +00006470
ajs5a646652004-11-05 01:25:55 +00006471 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006472}
6473
6474DEFUN (show_ip_bgp_route,
6475 show_ip_bgp_route_cmd,
6476 "show ip bgp A.B.C.D",
6477 SHOW_STR
6478 IP_STR
6479 BGP_STR
6480 "Network in the BGP routing table to display\n")
6481{
6482 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6483}
6484
6485DEFUN (show_ip_bgp_ipv4_route,
6486 show_ip_bgp_ipv4_route_cmd,
6487 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6488 SHOW_STR
6489 IP_STR
6490 BGP_STR
6491 "Address family\n"
6492 "Address Family modifier\n"
6493 "Address Family modifier\n"
6494 "Network in the BGP routing table to display\n")
6495{
6496 if (strncmp (argv[0], "m", 1) == 0)
6497 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6498
6499 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6500}
6501
6502DEFUN (show_ip_bgp_vpnv4_all_route,
6503 show_ip_bgp_vpnv4_all_route_cmd,
6504 "show ip bgp vpnv4 all A.B.C.D",
6505 SHOW_STR
6506 IP_STR
6507 BGP_STR
6508 "Display VPNv4 NLRI specific information\n"
6509 "Display information about all VPNv4 NLRIs\n"
6510 "Network in the BGP routing table to display\n")
6511{
6512 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6513}
6514
6515DEFUN (show_ip_bgp_vpnv4_rd_route,
6516 show_ip_bgp_vpnv4_rd_route_cmd,
6517 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6518 SHOW_STR
6519 IP_STR
6520 BGP_STR
6521 "Display VPNv4 NLRI specific information\n"
6522 "Display information for a route distinguisher\n"
6523 "VPN Route Distinguisher\n"
6524 "Network in the BGP routing table to display\n")
6525{
6526 int ret;
6527 struct prefix_rd prd;
6528
6529 ret = str2prefix_rd (argv[0], &prd);
6530 if (! ret)
6531 {
6532 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6533 return CMD_WARNING;
6534 }
6535 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6536}
6537
6538DEFUN (show_ip_bgp_prefix,
6539 show_ip_bgp_prefix_cmd,
6540 "show ip bgp A.B.C.D/M",
6541 SHOW_STR
6542 IP_STR
6543 BGP_STR
6544 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6545{
6546 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6547}
6548
6549DEFUN (show_ip_bgp_ipv4_prefix,
6550 show_ip_bgp_ipv4_prefix_cmd,
6551 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6552 SHOW_STR
6553 IP_STR
6554 BGP_STR
6555 "Address family\n"
6556 "Address Family modifier\n"
6557 "Address Family modifier\n"
6558 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6559{
6560 if (strncmp (argv[0], "m", 1) == 0)
6561 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6562
6563 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6564}
6565
6566DEFUN (show_ip_bgp_vpnv4_all_prefix,
6567 show_ip_bgp_vpnv4_all_prefix_cmd,
6568 "show ip bgp vpnv4 all A.B.C.D/M",
6569 SHOW_STR
6570 IP_STR
6571 BGP_STR
6572 "Display VPNv4 NLRI specific information\n"
6573 "Display information about all VPNv4 NLRIs\n"
6574 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6575{
6576 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6577}
6578
6579DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6580 show_ip_bgp_vpnv4_rd_prefix_cmd,
6581 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6582 SHOW_STR
6583 IP_STR
6584 BGP_STR
6585 "Display VPNv4 NLRI specific information\n"
6586 "Display information for a route distinguisher\n"
6587 "VPN Route Distinguisher\n"
6588 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6589{
6590 int ret;
6591 struct prefix_rd prd;
6592
6593 ret = str2prefix_rd (argv[0], &prd);
6594 if (! ret)
6595 {
6596 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6597 return CMD_WARNING;
6598 }
6599 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6600}
6601
6602DEFUN (show_ip_bgp_view,
6603 show_ip_bgp_view_cmd,
6604 "show ip bgp view WORD",
6605 SHOW_STR
6606 IP_STR
6607 BGP_STR
6608 "BGP view\n"
6609 "BGP view name\n")
6610{
paulbb46e942003-10-24 19:02:03 +00006611 struct bgp *bgp;
6612
6613 /* BGP structure lookup. */
6614 bgp = bgp_lookup_by_name (argv[0]);
6615 if (bgp == NULL)
6616 {
6617 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6618 return CMD_WARNING;
6619 }
6620
ajs5a646652004-11-05 01:25:55 +00006621 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
paul718e3742002-12-13 20:15:29 +00006622}
6623
6624DEFUN (show_ip_bgp_view_route,
6625 show_ip_bgp_view_route_cmd,
6626 "show ip bgp view WORD A.B.C.D",
6627 SHOW_STR
6628 IP_STR
6629 BGP_STR
6630 "BGP view\n"
6631 "BGP view name\n"
6632 "Network in the BGP routing table to display\n")
6633{
6634 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6635}
6636
6637DEFUN (show_ip_bgp_view_prefix,
6638 show_ip_bgp_view_prefix_cmd,
6639 "show ip bgp view WORD A.B.C.D/M",
6640 SHOW_STR
6641 IP_STR
6642 BGP_STR
6643 "BGP view\n"
6644 "BGP view name\n"
6645 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6646{
6647 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6648}
6649
6650#ifdef HAVE_IPV6
6651DEFUN (show_bgp,
6652 show_bgp_cmd,
6653 "show bgp",
6654 SHOW_STR
6655 BGP_STR)
6656{
ajs5a646652004-11-05 01:25:55 +00006657 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6658 NULL);
paul718e3742002-12-13 20:15:29 +00006659}
6660
6661ALIAS (show_bgp,
6662 show_bgp_ipv6_cmd,
6663 "show bgp ipv6",
6664 SHOW_STR
6665 BGP_STR
6666 "Address family\n")
6667
6668/* old command */
6669DEFUN (show_ipv6_bgp,
6670 show_ipv6_bgp_cmd,
6671 "show ipv6 bgp",
6672 SHOW_STR
6673 IP_STR
6674 BGP_STR)
6675{
ajs5a646652004-11-05 01:25:55 +00006676 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6677 NULL);
paul718e3742002-12-13 20:15:29 +00006678}
6679
6680DEFUN (show_bgp_route,
6681 show_bgp_route_cmd,
6682 "show bgp X:X::X:X",
6683 SHOW_STR
6684 BGP_STR
6685 "Network in the BGP routing table to display\n")
6686{
6687 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6688}
6689
6690ALIAS (show_bgp_route,
6691 show_bgp_ipv6_route_cmd,
6692 "show bgp ipv6 X:X::X:X",
6693 SHOW_STR
6694 BGP_STR
6695 "Address family\n"
6696 "Network in the BGP routing table to display\n")
6697
6698/* old command */
6699DEFUN (show_ipv6_bgp_route,
6700 show_ipv6_bgp_route_cmd,
6701 "show ipv6 bgp X:X::X:X",
6702 SHOW_STR
6703 IP_STR
6704 BGP_STR
6705 "Network in the BGP routing table to display\n")
6706{
6707 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6708}
6709
6710DEFUN (show_bgp_prefix,
6711 show_bgp_prefix_cmd,
6712 "show bgp X:X::X:X/M",
6713 SHOW_STR
6714 BGP_STR
6715 "IPv6 prefix <network>/<length>\n")
6716{
6717 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6718}
6719
6720ALIAS (show_bgp_prefix,
6721 show_bgp_ipv6_prefix_cmd,
6722 "show bgp ipv6 X:X::X:X/M",
6723 SHOW_STR
6724 BGP_STR
6725 "Address family\n"
6726 "IPv6 prefix <network>/<length>\n")
6727
6728/* old command */
6729DEFUN (show_ipv6_bgp_prefix,
6730 show_ipv6_bgp_prefix_cmd,
6731 "show ipv6 bgp X:X::X:X/M",
6732 SHOW_STR
6733 IP_STR
6734 BGP_STR
6735 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6736{
6737 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6738}
6739
paulbb46e942003-10-24 19:02:03 +00006740DEFUN (show_bgp_view,
6741 show_bgp_view_cmd,
6742 "show bgp view WORD",
6743 SHOW_STR
6744 BGP_STR
6745 "BGP view\n"
6746 "View name\n")
6747{
6748 struct bgp *bgp;
6749
6750 /* BGP structure lookup. */
6751 bgp = bgp_lookup_by_name (argv[0]);
6752 if (bgp == NULL)
6753 {
6754 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6755 return CMD_WARNING;
6756 }
6757
ajs5a646652004-11-05 01:25:55 +00006758 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
paulbb46e942003-10-24 19:02:03 +00006759}
6760
6761ALIAS (show_bgp_view,
6762 show_bgp_view_ipv6_cmd,
6763 "show bgp view WORD ipv6",
6764 SHOW_STR
6765 BGP_STR
6766 "BGP view\n"
6767 "View name\n"
6768 "Address family\n")
6769
6770DEFUN (show_bgp_view_route,
6771 show_bgp_view_route_cmd,
6772 "show bgp view WORD X:X::X:X",
6773 SHOW_STR
6774 BGP_STR
6775 "BGP view\n"
6776 "View name\n"
6777 "Network in the BGP routing table to display\n")
6778{
6779 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6780}
6781
6782ALIAS (show_bgp_view_route,
6783 show_bgp_view_ipv6_route_cmd,
6784 "show bgp view WORD ipv6 X:X::X:X",
6785 SHOW_STR
6786 BGP_STR
6787 "BGP view\n"
6788 "View name\n"
6789 "Address family\n"
6790 "Network in the BGP routing table to display\n")
6791
6792DEFUN (show_bgp_view_prefix,
6793 show_bgp_view_prefix_cmd,
6794 "show bgp view WORD X:X::X:X/M",
6795 SHOW_STR
6796 BGP_STR
6797 "BGP view\n"
6798 "View name\n"
6799 "IPv6 prefix <network>/<length>\n")
6800{
6801 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6802}
6803
6804ALIAS (show_bgp_view_prefix,
6805 show_bgp_view_ipv6_prefix_cmd,
6806 "show bgp view WORD ipv6 X:X::X:X/M",
6807 SHOW_STR
6808 BGP_STR
6809 "BGP view\n"
6810 "View name\n"
6811 "Address family\n"
6812 "IPv6 prefix <network>/<length>\n")
6813
paul718e3742002-12-13 20:15:29 +00006814/* old command */
6815DEFUN (show_ipv6_mbgp,
6816 show_ipv6_mbgp_cmd,
6817 "show ipv6 mbgp",
6818 SHOW_STR
6819 IP_STR
6820 MBGP_STR)
6821{
ajs5a646652004-11-05 01:25:55 +00006822 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6823 NULL);
paul718e3742002-12-13 20:15:29 +00006824}
6825
6826/* old command */
6827DEFUN (show_ipv6_mbgp_route,
6828 show_ipv6_mbgp_route_cmd,
6829 "show ipv6 mbgp X:X::X:X",
6830 SHOW_STR
6831 IP_STR
6832 MBGP_STR
6833 "Network in the MBGP routing table to display\n")
6834{
6835 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6836}
6837
6838/* old command */
6839DEFUN (show_ipv6_mbgp_prefix,
6840 show_ipv6_mbgp_prefix_cmd,
6841 "show ipv6 mbgp X:X::X:X/M",
6842 SHOW_STR
6843 IP_STR
6844 MBGP_STR
6845 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6846{
6847 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6848}
6849#endif
6850
paul718e3742002-12-13 20:15:29 +00006851
paul94f2b392005-06-28 12:44:16 +00006852static int
paulfd79ac92004-10-13 05:06:08 +00006853bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
paul718e3742002-12-13 20:15:29 +00006854 safi_t safi, enum bgp_show_type type)
6855{
6856 int i;
6857 struct buffer *b;
6858 char *regstr;
6859 int first;
6860 regex_t *regex;
ajs5a646652004-11-05 01:25:55 +00006861 int rc;
paul718e3742002-12-13 20:15:29 +00006862
6863 first = 0;
6864 b = buffer_new (1024);
6865 for (i = 0; i < argc; i++)
6866 {
6867 if (first)
6868 buffer_putc (b, ' ');
6869 else
6870 {
6871 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
6872 continue;
6873 first = 1;
6874 }
6875
6876 buffer_putstr (b, argv[i]);
6877 }
6878 buffer_putc (b, '\0');
6879
6880 regstr = buffer_getstr (b);
6881 buffer_free (b);
6882
6883 regex = bgp_regcomp (regstr);
ajs3b8b1852005-01-29 18:19:13 +00006884 XFREE(MTYPE_TMP, regstr);
paul718e3742002-12-13 20:15:29 +00006885 if (! regex)
6886 {
6887 vty_out (vty, "Can't compile regexp %s%s", argv[0],
6888 VTY_NEWLINE);
6889 return CMD_WARNING;
6890 }
6891
ajs5a646652004-11-05 01:25:55 +00006892 rc = bgp_show (vty, NULL, afi, safi, type, regex);
6893 bgp_regex_free (regex);
6894 return rc;
paul718e3742002-12-13 20:15:29 +00006895}
6896
6897DEFUN (show_ip_bgp_regexp,
6898 show_ip_bgp_regexp_cmd,
6899 "show ip bgp regexp .LINE",
6900 SHOW_STR
6901 IP_STR
6902 BGP_STR
6903 "Display routes matching the AS path regular expression\n"
6904 "A regular-expression to match the BGP AS paths\n")
6905{
6906 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
6907 bgp_show_type_regexp);
6908}
6909
6910DEFUN (show_ip_bgp_flap_regexp,
6911 show_ip_bgp_flap_regexp_cmd,
6912 "show ip bgp flap-statistics regexp .LINE",
6913 SHOW_STR
6914 IP_STR
6915 BGP_STR
6916 "Display flap statistics of routes\n"
6917 "Display routes matching the AS path regular expression\n"
6918 "A regular-expression to match the BGP AS paths\n")
6919{
6920 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
6921 bgp_show_type_flap_regexp);
6922}
6923
6924DEFUN (show_ip_bgp_ipv4_regexp,
6925 show_ip_bgp_ipv4_regexp_cmd,
6926 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
6927 SHOW_STR
6928 IP_STR
6929 BGP_STR
6930 "Address family\n"
6931 "Address Family modifier\n"
6932 "Address Family modifier\n"
6933 "Display routes matching the AS path regular expression\n"
6934 "A regular-expression to match the BGP AS paths\n")
6935{
6936 if (strncmp (argv[0], "m", 1) == 0)
6937 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
6938 bgp_show_type_regexp);
6939
6940 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
6941 bgp_show_type_regexp);
6942}
6943
6944#ifdef HAVE_IPV6
6945DEFUN (show_bgp_regexp,
6946 show_bgp_regexp_cmd,
6947 "show bgp regexp .LINE",
6948 SHOW_STR
6949 BGP_STR
6950 "Display routes matching the AS path regular expression\n"
6951 "A regular-expression to match the BGP AS paths\n")
6952{
6953 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
6954 bgp_show_type_regexp);
6955}
6956
6957ALIAS (show_bgp_regexp,
6958 show_bgp_ipv6_regexp_cmd,
6959 "show bgp ipv6 regexp .LINE",
6960 SHOW_STR
6961 BGP_STR
6962 "Address family\n"
6963 "Display routes matching the AS path regular expression\n"
6964 "A regular-expression to match the BGP AS paths\n")
6965
6966/* old command */
6967DEFUN (show_ipv6_bgp_regexp,
6968 show_ipv6_bgp_regexp_cmd,
6969 "show ipv6 bgp regexp .LINE",
6970 SHOW_STR
6971 IP_STR
6972 BGP_STR
6973 "Display routes matching the AS path regular expression\n"
6974 "A regular-expression to match the BGP AS paths\n")
6975{
6976 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
6977 bgp_show_type_regexp);
6978}
6979
6980/* old command */
6981DEFUN (show_ipv6_mbgp_regexp,
6982 show_ipv6_mbgp_regexp_cmd,
6983 "show ipv6 mbgp regexp .LINE",
6984 SHOW_STR
6985 IP_STR
6986 BGP_STR
6987 "Display routes matching the AS path regular expression\n"
6988 "A regular-expression to match the MBGP AS paths\n")
6989{
6990 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
6991 bgp_show_type_regexp);
6992}
6993#endif /* HAVE_IPV6 */
6994
paul94f2b392005-06-28 12:44:16 +00006995static int
paulfd79ac92004-10-13 05:06:08 +00006996bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00006997 safi_t safi, enum bgp_show_type type)
6998{
6999 struct prefix_list *plist;
7000
7001 plist = prefix_list_lookup (afi, prefix_list_str);
7002 if (plist == NULL)
7003 {
7004 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7005 prefix_list_str, VTY_NEWLINE);
7006 return CMD_WARNING;
7007 }
7008
ajs5a646652004-11-05 01:25:55 +00007009 return bgp_show (vty, NULL, afi, safi, type, plist);
paul718e3742002-12-13 20:15:29 +00007010}
7011
7012DEFUN (show_ip_bgp_prefix_list,
7013 show_ip_bgp_prefix_list_cmd,
7014 "show ip bgp prefix-list WORD",
7015 SHOW_STR
7016 IP_STR
7017 BGP_STR
7018 "Display routes conforming to the prefix-list\n"
7019 "IP prefix-list name\n")
7020{
7021 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7022 bgp_show_type_prefix_list);
7023}
7024
7025DEFUN (show_ip_bgp_flap_prefix_list,
7026 show_ip_bgp_flap_prefix_list_cmd,
7027 "show ip bgp flap-statistics prefix-list WORD",
7028 SHOW_STR
7029 IP_STR
7030 BGP_STR
7031 "Display flap statistics of routes\n"
7032 "Display routes conforming to the prefix-list\n"
7033 "IP prefix-list name\n")
7034{
7035 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7036 bgp_show_type_flap_prefix_list);
7037}
7038
7039DEFUN (show_ip_bgp_ipv4_prefix_list,
7040 show_ip_bgp_ipv4_prefix_list_cmd,
7041 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7042 SHOW_STR
7043 IP_STR
7044 BGP_STR
7045 "Address family\n"
7046 "Address Family modifier\n"
7047 "Address Family modifier\n"
7048 "Display routes conforming to the prefix-list\n"
7049 "IP prefix-list name\n")
7050{
7051 if (strncmp (argv[0], "m", 1) == 0)
7052 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7053 bgp_show_type_prefix_list);
7054
7055 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7056 bgp_show_type_prefix_list);
7057}
7058
7059#ifdef HAVE_IPV6
7060DEFUN (show_bgp_prefix_list,
7061 show_bgp_prefix_list_cmd,
7062 "show bgp prefix-list WORD",
7063 SHOW_STR
7064 BGP_STR
7065 "Display routes conforming to the prefix-list\n"
7066 "IPv6 prefix-list name\n")
7067{
7068 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7069 bgp_show_type_prefix_list);
7070}
7071
7072ALIAS (show_bgp_prefix_list,
7073 show_bgp_ipv6_prefix_list_cmd,
7074 "show bgp ipv6 prefix-list WORD",
7075 SHOW_STR
7076 BGP_STR
7077 "Address family\n"
7078 "Display routes conforming to the prefix-list\n"
7079 "IPv6 prefix-list name\n")
7080
7081/* old command */
7082DEFUN (show_ipv6_bgp_prefix_list,
7083 show_ipv6_bgp_prefix_list_cmd,
7084 "show ipv6 bgp prefix-list WORD",
7085 SHOW_STR
7086 IPV6_STR
7087 BGP_STR
7088 "Display routes matching the prefix-list\n"
7089 "IPv6 prefix-list name\n")
7090{
7091 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7092 bgp_show_type_prefix_list);
7093}
7094
7095/* old command */
7096DEFUN (show_ipv6_mbgp_prefix_list,
7097 show_ipv6_mbgp_prefix_list_cmd,
7098 "show ipv6 mbgp prefix-list WORD",
7099 SHOW_STR
7100 IPV6_STR
7101 MBGP_STR
7102 "Display routes matching the prefix-list\n"
7103 "IPv6 prefix-list name\n")
7104{
7105 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7106 bgp_show_type_prefix_list);
7107}
7108#endif /* HAVE_IPV6 */
7109
paul94f2b392005-06-28 12:44:16 +00007110static int
paulfd79ac92004-10-13 05:06:08 +00007111bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007112 safi_t safi, enum bgp_show_type type)
7113{
7114 struct as_list *as_list;
7115
7116 as_list = as_list_lookup (filter);
7117 if (as_list == NULL)
7118 {
7119 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7120 return CMD_WARNING;
7121 }
7122
ajs5a646652004-11-05 01:25:55 +00007123 return bgp_show (vty, NULL, afi, safi, type, as_list);
paul718e3742002-12-13 20:15:29 +00007124}
7125
7126DEFUN (show_ip_bgp_filter_list,
7127 show_ip_bgp_filter_list_cmd,
7128 "show ip bgp filter-list WORD",
7129 SHOW_STR
7130 IP_STR
7131 BGP_STR
7132 "Display routes conforming to the filter-list\n"
7133 "Regular expression access list name\n")
7134{
7135 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7136 bgp_show_type_filter_list);
7137}
7138
7139DEFUN (show_ip_bgp_flap_filter_list,
7140 show_ip_bgp_flap_filter_list_cmd,
7141 "show ip bgp flap-statistics filter-list WORD",
7142 SHOW_STR
7143 IP_STR
7144 BGP_STR
7145 "Display flap statistics of routes\n"
7146 "Display routes conforming to the filter-list\n"
7147 "Regular expression access list name\n")
7148{
7149 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7150 bgp_show_type_flap_filter_list);
7151}
7152
7153DEFUN (show_ip_bgp_ipv4_filter_list,
7154 show_ip_bgp_ipv4_filter_list_cmd,
7155 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7156 SHOW_STR
7157 IP_STR
7158 BGP_STR
7159 "Address family\n"
7160 "Address Family modifier\n"
7161 "Address Family modifier\n"
7162 "Display routes conforming to the filter-list\n"
7163 "Regular expression access list name\n")
7164{
7165 if (strncmp (argv[0], "m", 1) == 0)
7166 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7167 bgp_show_type_filter_list);
7168
7169 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7170 bgp_show_type_filter_list);
7171}
7172
7173#ifdef HAVE_IPV6
7174DEFUN (show_bgp_filter_list,
7175 show_bgp_filter_list_cmd,
7176 "show bgp filter-list WORD",
7177 SHOW_STR
7178 BGP_STR
7179 "Display routes conforming to the filter-list\n"
7180 "Regular expression access list name\n")
7181{
7182 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7183 bgp_show_type_filter_list);
7184}
7185
7186ALIAS (show_bgp_filter_list,
7187 show_bgp_ipv6_filter_list_cmd,
7188 "show bgp ipv6 filter-list WORD",
7189 SHOW_STR
7190 BGP_STR
7191 "Address family\n"
7192 "Display routes conforming to the filter-list\n"
7193 "Regular expression access list name\n")
7194
7195/* old command */
7196DEFUN (show_ipv6_bgp_filter_list,
7197 show_ipv6_bgp_filter_list_cmd,
7198 "show ipv6 bgp filter-list WORD",
7199 SHOW_STR
7200 IPV6_STR
7201 BGP_STR
7202 "Display routes conforming to the filter-list\n"
7203 "Regular expression access list name\n")
7204{
7205 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7206 bgp_show_type_filter_list);
7207}
7208
7209/* old command */
7210DEFUN (show_ipv6_mbgp_filter_list,
7211 show_ipv6_mbgp_filter_list_cmd,
7212 "show ipv6 mbgp filter-list WORD",
7213 SHOW_STR
7214 IPV6_STR
7215 MBGP_STR
7216 "Display routes conforming to the filter-list\n"
7217 "Regular expression access list name\n")
7218{
7219 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7220 bgp_show_type_filter_list);
7221}
7222#endif /* HAVE_IPV6 */
7223
paul94f2b392005-06-28 12:44:16 +00007224static int
paulfd79ac92004-10-13 05:06:08 +00007225bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
paul718e3742002-12-13 20:15:29 +00007226 safi_t safi, enum bgp_show_type type)
7227{
7228 struct route_map *rmap;
7229
7230 rmap = route_map_lookup_by_name (rmap_str);
7231 if (! rmap)
7232 {
7233 vty_out (vty, "%% %s is not a valid route-map name%s",
7234 rmap_str, VTY_NEWLINE);
7235 return CMD_WARNING;
7236 }
7237
ajs5a646652004-11-05 01:25:55 +00007238 return bgp_show (vty, NULL, afi, safi, type, rmap);
paul718e3742002-12-13 20:15:29 +00007239}
7240
7241DEFUN (show_ip_bgp_route_map,
7242 show_ip_bgp_route_map_cmd,
7243 "show ip bgp route-map WORD",
7244 SHOW_STR
7245 IP_STR
7246 BGP_STR
7247 "Display routes matching the route-map\n"
7248 "A route-map to match on\n")
7249{
7250 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7251 bgp_show_type_route_map);
7252}
7253
7254DEFUN (show_ip_bgp_flap_route_map,
7255 show_ip_bgp_flap_route_map_cmd,
7256 "show ip bgp flap-statistics route-map WORD",
7257 SHOW_STR
7258 IP_STR
7259 BGP_STR
7260 "Display flap statistics of routes\n"
7261 "Display routes matching the route-map\n"
7262 "A route-map to match on\n")
7263{
7264 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7265 bgp_show_type_flap_route_map);
7266}
7267
7268DEFUN (show_ip_bgp_ipv4_route_map,
7269 show_ip_bgp_ipv4_route_map_cmd,
7270 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7271 SHOW_STR
7272 IP_STR
7273 BGP_STR
7274 "Address family\n"
7275 "Address Family modifier\n"
7276 "Address Family modifier\n"
7277 "Display routes matching the route-map\n"
7278 "A route-map to match on\n")
7279{
7280 if (strncmp (argv[0], "m", 1) == 0)
7281 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7282 bgp_show_type_route_map);
7283
7284 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7285 bgp_show_type_route_map);
7286}
7287
7288DEFUN (show_bgp_route_map,
7289 show_bgp_route_map_cmd,
7290 "show bgp route-map WORD",
7291 SHOW_STR
7292 BGP_STR
7293 "Display routes matching the route-map\n"
7294 "A route-map to match on\n")
7295{
7296 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7297 bgp_show_type_route_map);
7298}
7299
7300ALIAS (show_bgp_route_map,
7301 show_bgp_ipv6_route_map_cmd,
7302 "show bgp ipv6 route-map WORD",
7303 SHOW_STR
7304 BGP_STR
7305 "Address family\n"
7306 "Display routes matching the route-map\n"
7307 "A route-map to match on\n")
7308
7309DEFUN (show_ip_bgp_cidr_only,
7310 show_ip_bgp_cidr_only_cmd,
7311 "show ip bgp cidr-only",
7312 SHOW_STR
7313 IP_STR
7314 BGP_STR
7315 "Display only routes with non-natural netmasks\n")
7316{
7317 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007318 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007319}
7320
7321DEFUN (show_ip_bgp_flap_cidr_only,
7322 show_ip_bgp_flap_cidr_only_cmd,
7323 "show ip bgp flap-statistics cidr-only",
7324 SHOW_STR
7325 IP_STR
7326 BGP_STR
7327 "Display flap statistics of routes\n"
7328 "Display only routes with non-natural netmasks\n")
7329{
7330 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007331 bgp_show_type_flap_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007332}
7333
7334DEFUN (show_ip_bgp_ipv4_cidr_only,
7335 show_ip_bgp_ipv4_cidr_only_cmd,
7336 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7337 SHOW_STR
7338 IP_STR
7339 BGP_STR
7340 "Address family\n"
7341 "Address Family modifier\n"
7342 "Address Family modifier\n"
7343 "Display only routes with non-natural netmasks\n")
7344{
7345 if (strncmp (argv[0], "m", 1) == 0)
7346 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007347 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007348
7349 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007350 bgp_show_type_cidr_only, NULL);
paul718e3742002-12-13 20:15:29 +00007351}
7352
7353DEFUN (show_ip_bgp_community_all,
7354 show_ip_bgp_community_all_cmd,
7355 "show ip bgp community",
7356 SHOW_STR
7357 IP_STR
7358 BGP_STR
7359 "Display routes matching the communities\n")
7360{
7361 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007362 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007363}
7364
7365DEFUN (show_ip_bgp_ipv4_community_all,
7366 show_ip_bgp_ipv4_community_all_cmd,
7367 "show ip bgp ipv4 (unicast|multicast) community",
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 communities\n")
7375{
7376 if (strncmp (argv[0], "m", 1) == 0)
7377 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007378 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007379
7380 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007381 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007382}
7383
7384#ifdef HAVE_IPV6
7385DEFUN (show_bgp_community_all,
7386 show_bgp_community_all_cmd,
7387 "show bgp community",
7388 SHOW_STR
7389 BGP_STR
7390 "Display routes matching the communities\n")
7391{
7392 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007393 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007394}
7395
7396ALIAS (show_bgp_community_all,
7397 show_bgp_ipv6_community_all_cmd,
7398 "show bgp ipv6 community",
7399 SHOW_STR
7400 BGP_STR
7401 "Address family\n"
7402 "Display routes matching the communities\n")
7403
7404/* old command */
7405DEFUN (show_ipv6_bgp_community_all,
7406 show_ipv6_bgp_community_all_cmd,
7407 "show ipv6 bgp community",
7408 SHOW_STR
7409 IPV6_STR
7410 BGP_STR
7411 "Display routes matching the communities\n")
7412{
7413 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
ajs5a646652004-11-05 01:25:55 +00007414 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007415}
7416
7417/* old command */
7418DEFUN (show_ipv6_mbgp_community_all,
7419 show_ipv6_mbgp_community_all_cmd,
7420 "show ipv6 mbgp community",
7421 SHOW_STR
7422 IPV6_STR
7423 MBGP_STR
7424 "Display routes matching the communities\n")
7425{
7426 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
ajs5a646652004-11-05 01:25:55 +00007427 bgp_show_type_community_all, NULL);
paul718e3742002-12-13 20:15:29 +00007428}
7429#endif /* HAVE_IPV6 */
7430
paul94f2b392005-06-28 12:44:16 +00007431static int
paulfd79ac92004-10-13 05:06:08 +00007432bgp_show_community (struct vty *vty, int argc, const char **argv, int exact,
Michael Lambert4c9641b2010-07-22 13:20:55 -04007433 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00007434{
7435 struct community *com;
7436 struct buffer *b;
7437 int i;
7438 char *str;
7439 int first = 0;
7440
7441 b = buffer_new (1024);
7442 for (i = 0; i < argc; i++)
7443 {
7444 if (first)
7445 buffer_putc (b, ' ');
7446 else
7447 {
7448 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7449 continue;
7450 first = 1;
7451 }
7452
7453 buffer_putstr (b, argv[i]);
7454 }
7455 buffer_putc (b, '\0');
7456
7457 str = buffer_getstr (b);
7458 buffer_free (b);
7459
7460 com = community_str2com (str);
ajs3b8b1852005-01-29 18:19:13 +00007461 XFREE (MTYPE_TMP, str);
paul718e3742002-12-13 20:15:29 +00007462 if (! com)
7463 {
7464 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7465 return CMD_WARNING;
7466 }
7467
ajs5a646652004-11-05 01:25:55 +00007468 return bgp_show (vty, NULL, afi, safi,
7469 (exact ? bgp_show_type_community_exact :
7470 bgp_show_type_community), com);
paul718e3742002-12-13 20:15:29 +00007471}
7472
7473DEFUN (show_ip_bgp_community,
7474 show_ip_bgp_community_cmd,
7475 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7476 SHOW_STR
7477 IP_STR
7478 BGP_STR
7479 "Display routes matching the communities\n"
7480 "community number\n"
7481 "Do not send outside local AS (well-known community)\n"
7482 "Do not advertise to any peer (well-known community)\n"
7483 "Do not export to next AS (well-known community)\n")
7484{
7485 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7486}
7487
7488ALIAS (show_ip_bgp_community,
7489 show_ip_bgp_community2_cmd,
7490 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7491 SHOW_STR
7492 IP_STR
7493 BGP_STR
7494 "Display routes matching the communities\n"
7495 "community number\n"
7496 "Do not send outside local AS (well-known community)\n"
7497 "Do not advertise to any peer (well-known community)\n"
7498 "Do not export to next AS (well-known community)\n"
7499 "community number\n"
7500 "Do not send outside local AS (well-known community)\n"
7501 "Do not advertise to any peer (well-known community)\n"
7502 "Do not export to next AS (well-known community)\n")
7503
7504ALIAS (show_ip_bgp_community,
7505 show_ip_bgp_community3_cmd,
7506 "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)",
7507 SHOW_STR
7508 IP_STR
7509 BGP_STR
7510 "Display routes matching the communities\n"
7511 "community number\n"
7512 "Do not send outside local AS (well-known community)\n"
7513 "Do not advertise to any peer (well-known community)\n"
7514 "Do not export to next AS (well-known community)\n"
7515 "community number\n"
7516 "Do not send outside local AS (well-known community)\n"
7517 "Do not advertise to any peer (well-known community)\n"
7518 "Do not export to next AS (well-known community)\n"
7519 "community number\n"
7520 "Do not send outside local AS (well-known community)\n"
7521 "Do not advertise to any peer (well-known community)\n"
7522 "Do not export to next AS (well-known community)\n")
7523
7524ALIAS (show_ip_bgp_community,
7525 show_ip_bgp_community4_cmd,
7526 "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)",
7527 SHOW_STR
7528 IP_STR
7529 BGP_STR
7530 "Display routes matching the communities\n"
7531 "community number\n"
7532 "Do not send outside local AS (well-known community)\n"
7533 "Do not advertise to any peer (well-known community)\n"
7534 "Do not export to next AS (well-known community)\n"
7535 "community number\n"
7536 "Do not send outside local AS (well-known community)\n"
7537 "Do not advertise to any peer (well-known community)\n"
7538 "Do not export to next AS (well-known community)\n"
7539 "community number\n"
7540 "Do not send outside local AS (well-known community)\n"
7541 "Do not advertise to any peer (well-known community)\n"
7542 "Do not export to next AS (well-known community)\n"
7543 "community number\n"
7544 "Do not send outside local AS (well-known community)\n"
7545 "Do not advertise to any peer (well-known community)\n"
7546 "Do not export to next AS (well-known community)\n")
7547
7548DEFUN (show_ip_bgp_ipv4_community,
7549 show_ip_bgp_ipv4_community_cmd,
7550 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7551 SHOW_STR
7552 IP_STR
7553 BGP_STR
7554 "Address family\n"
7555 "Address Family modifier\n"
7556 "Address Family modifier\n"
7557 "Display routes matching the communities\n"
7558 "community number\n"
7559 "Do not send outside local AS (well-known community)\n"
7560 "Do not advertise to any peer (well-known community)\n"
7561 "Do not export to next AS (well-known community)\n")
7562{
7563 if (strncmp (argv[0], "m", 1) == 0)
7564 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
7565
7566 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7567}
7568
7569ALIAS (show_ip_bgp_ipv4_community,
7570 show_ip_bgp_ipv4_community2_cmd,
7571 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7572 SHOW_STR
7573 IP_STR
7574 BGP_STR
7575 "Address family\n"
7576 "Address Family modifier\n"
7577 "Address Family modifier\n"
7578 "Display routes matching the communities\n"
7579 "community number\n"
7580 "Do not send outside local AS (well-known community)\n"
7581 "Do not advertise to any peer (well-known community)\n"
7582 "Do not export to next AS (well-known community)\n"
7583 "community number\n"
7584 "Do not send outside local AS (well-known community)\n"
7585 "Do not advertise to any peer (well-known community)\n"
7586 "Do not export to next AS (well-known community)\n")
7587
7588ALIAS (show_ip_bgp_ipv4_community,
7589 show_ip_bgp_ipv4_community3_cmd,
7590 "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)",
7591 SHOW_STR
7592 IP_STR
7593 BGP_STR
7594 "Address family\n"
7595 "Address Family modifier\n"
7596 "Address Family modifier\n"
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 "community number\n"
7603 "Do not send outside local AS (well-known community)\n"
7604 "Do not advertise to any peer (well-known community)\n"
7605 "Do not export to next AS (well-known community)\n"
7606 "community number\n"
7607 "Do not send outside local AS (well-known community)\n"
7608 "Do not advertise to any peer (well-known community)\n"
7609 "Do not export to next AS (well-known community)\n")
7610
7611ALIAS (show_ip_bgp_ipv4_community,
7612 show_ip_bgp_ipv4_community4_cmd,
7613 "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)",
7614 SHOW_STR
7615 IP_STR
7616 BGP_STR
7617 "Address family\n"
7618 "Address Family modifier\n"
7619 "Address Family modifier\n"
7620 "Display routes matching the communities\n"
7621 "community number\n"
7622 "Do not send outside local AS (well-known community)\n"
7623 "Do not advertise to any peer (well-known community)\n"
7624 "Do not export to next AS (well-known community)\n"
7625 "community number\n"
7626 "Do not send outside local AS (well-known community)\n"
7627 "Do not advertise to any peer (well-known community)\n"
7628 "Do not export to next AS (well-known community)\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
7638DEFUN (show_ip_bgp_community_exact,
7639 show_ip_bgp_community_exact_cmd,
7640 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7641 SHOW_STR
7642 IP_STR
7643 BGP_STR
7644 "Display routes matching the communities\n"
7645 "community number\n"
7646 "Do not send outside local AS (well-known community)\n"
7647 "Do not advertise to any peer (well-known community)\n"
7648 "Do not export to next AS (well-known community)\n"
7649 "Exact match of the communities")
7650{
7651 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7652}
7653
7654ALIAS (show_ip_bgp_community_exact,
7655 show_ip_bgp_community2_exact_cmd,
7656 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7657 SHOW_STR
7658 IP_STR
7659 BGP_STR
7660 "Display routes matching the communities\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 "community number\n"
7666 "Do not send outside local AS (well-known community)\n"
7667 "Do not advertise to any peer (well-known community)\n"
7668 "Do not export to next AS (well-known community)\n"
7669 "Exact match of the communities")
7670
7671ALIAS (show_ip_bgp_community_exact,
7672 show_ip_bgp_community3_exact_cmd,
7673 "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",
7674 SHOW_STR
7675 IP_STR
7676 BGP_STR
7677 "Display routes matching the communities\n"
7678 "community number\n"
7679 "Do not send outside local AS (well-known community)\n"
7680 "Do not advertise to any peer (well-known community)\n"
7681 "Do not export to next AS (well-known community)\n"
7682 "community number\n"
7683 "Do not send outside local AS (well-known community)\n"
7684 "Do not advertise to any peer (well-known community)\n"
7685 "Do not export to next AS (well-known community)\n"
7686 "community number\n"
7687 "Do not send outside local AS (well-known community)\n"
7688 "Do not advertise to any peer (well-known community)\n"
7689 "Do not export to next AS (well-known community)\n"
7690 "Exact match of the communities")
7691
7692ALIAS (show_ip_bgp_community_exact,
7693 show_ip_bgp_community4_exact_cmd,
7694 "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",
7695 SHOW_STR
7696 IP_STR
7697 BGP_STR
7698 "Display routes matching the communities\n"
7699 "community number\n"
7700 "Do not send outside local AS (well-known community)\n"
7701 "Do not advertise to any peer (well-known community)\n"
7702 "Do not export to next AS (well-known community)\n"
7703 "community number\n"
7704 "Do not send outside local AS (well-known community)\n"
7705 "Do not advertise to any peer (well-known community)\n"
7706 "Do not export to next AS (well-known community)\n"
7707 "community number\n"
7708 "Do not send outside local AS (well-known community)\n"
7709 "Do not advertise to any peer (well-known community)\n"
7710 "Do not export to next AS (well-known community)\n"
7711 "community number\n"
7712 "Do not send outside local AS (well-known community)\n"
7713 "Do not advertise to any peer (well-known community)\n"
7714 "Do not export to next AS (well-known community)\n"
7715 "Exact match of the communities")
7716
7717DEFUN (show_ip_bgp_ipv4_community_exact,
7718 show_ip_bgp_ipv4_community_exact_cmd,
7719 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7720 SHOW_STR
7721 IP_STR
7722 BGP_STR
7723 "Address family\n"
7724 "Address Family modifier\n"
7725 "Address Family modifier\n"
7726 "Display routes matching the communities\n"
7727 "community number\n"
7728 "Do not send outside local AS (well-known community)\n"
7729 "Do not advertise to any peer (well-known community)\n"
7730 "Do not export to next AS (well-known community)\n"
7731 "Exact match of the communities")
7732{
7733 if (strncmp (argv[0], "m", 1) == 0)
7734 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
7735
7736 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7737}
7738
7739ALIAS (show_ip_bgp_ipv4_community_exact,
7740 show_ip_bgp_ipv4_community2_exact_cmd,
7741 "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",
7742 SHOW_STR
7743 IP_STR
7744 BGP_STR
7745 "Address family\n"
7746 "Address Family modifier\n"
7747 "Address Family modifier\n"
7748 "Display routes matching the communities\n"
7749 "community number\n"
7750 "Do not send outside local AS (well-known community)\n"
7751 "Do not advertise to any peer (well-known community)\n"
7752 "Do not export to next AS (well-known community)\n"
7753 "community number\n"
7754 "Do not send outside local AS (well-known community)\n"
7755 "Do not advertise to any peer (well-known community)\n"
7756 "Do not export to next AS (well-known community)\n"
7757 "Exact match of the communities")
7758
7759ALIAS (show_ip_bgp_ipv4_community_exact,
7760 show_ip_bgp_ipv4_community3_exact_cmd,
7761 "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",
7762 SHOW_STR
7763 IP_STR
7764 BGP_STR
7765 "Address family\n"
7766 "Address Family modifier\n"
7767 "Address Family modifier\n"
7768 "Display routes matching the communities\n"
7769 "community number\n"
7770 "Do not send outside local AS (well-known community)\n"
7771 "Do not advertise to any peer (well-known community)\n"
7772 "Do not export to next AS (well-known community)\n"
7773 "community number\n"
7774 "Do not send outside local AS (well-known community)\n"
7775 "Do not advertise to any peer (well-known community)\n"
7776 "Do not export to next AS (well-known community)\n"
7777 "community number\n"
7778 "Do not send outside local AS (well-known community)\n"
7779 "Do not advertise to any peer (well-known community)\n"
7780 "Do not export to next AS (well-known community)\n"
7781 "Exact match of the communities")
7782
7783ALIAS (show_ip_bgp_ipv4_community_exact,
7784 show_ip_bgp_ipv4_community4_exact_cmd,
7785 "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",
7786 SHOW_STR
7787 IP_STR
7788 BGP_STR
7789 "Address family\n"
7790 "Address Family modifier\n"
7791 "Address Family modifier\n"
7792 "Display routes matching the communities\n"
7793 "community number\n"
7794 "Do not send outside local AS (well-known community)\n"
7795 "Do not advertise to any peer (well-known community)\n"
7796 "Do not export to next AS (well-known community)\n"
7797 "community number\n"
7798 "Do not send outside local AS (well-known community)\n"
7799 "Do not advertise to any peer (well-known community)\n"
7800 "Do not export to next AS (well-known community)\n"
7801 "community number\n"
7802 "Do not send outside local AS (well-known community)\n"
7803 "Do not advertise to any peer (well-known community)\n"
7804 "Do not export to next AS (well-known community)\n"
7805 "community number\n"
7806 "Do not send outside local AS (well-known community)\n"
7807 "Do not advertise to any peer (well-known community)\n"
7808 "Do not export to next AS (well-known community)\n"
7809 "Exact match of the communities")
7810
7811#ifdef HAVE_IPV6
7812DEFUN (show_bgp_community,
7813 show_bgp_community_cmd,
7814 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
7815 SHOW_STR
7816 BGP_STR
7817 "Display routes matching the communities\n"
7818 "community number\n"
7819 "Do not send outside local AS (well-known community)\n"
7820 "Do not advertise to any peer (well-known community)\n"
7821 "Do not export to next AS (well-known community)\n")
7822{
7823 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
7824}
7825
7826ALIAS (show_bgp_community,
7827 show_bgp_ipv6_community_cmd,
7828 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
7829 SHOW_STR
7830 BGP_STR
7831 "Address family\n"
7832 "Display routes matching the communities\n"
7833 "community number\n"
7834 "Do not send outside local AS (well-known community)\n"
7835 "Do not advertise to any peer (well-known community)\n"
7836 "Do not export to next AS (well-known community)\n")
7837
7838ALIAS (show_bgp_community,
7839 show_bgp_community2_cmd,
7840 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7841 SHOW_STR
7842 BGP_STR
7843 "Display routes matching the communities\n"
7844 "community number\n"
7845 "Do not send outside local AS (well-known community)\n"
7846 "Do not advertise to any peer (well-known community)\n"
7847 "Do not export to next AS (well-known community)\n"
7848 "community number\n"
7849 "Do not send outside local AS (well-known community)\n"
7850 "Do not advertise to any peer (well-known community)\n"
7851 "Do not export to next AS (well-known community)\n")
7852
7853ALIAS (show_bgp_community,
7854 show_bgp_ipv6_community2_cmd,
7855 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7856 SHOW_STR
7857 BGP_STR
7858 "Address family\n"
7859 "Display routes matching the communities\n"
7860 "community number\n"
7861 "Do not send outside local AS (well-known community)\n"
7862 "Do not advertise to any peer (well-known community)\n"
7863 "Do not export to next AS (well-known community)\n"
7864 "community number\n"
7865 "Do not send outside local AS (well-known community)\n"
7866 "Do not advertise to any peer (well-known community)\n"
7867 "Do not export to next AS (well-known community)\n")
7868
7869ALIAS (show_bgp_community,
7870 show_bgp_community3_cmd,
7871 "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)",
7872 SHOW_STR
7873 BGP_STR
7874 "Display routes matching the communities\n"
7875 "community number\n"
7876 "Do not send outside local AS (well-known community)\n"
7877 "Do not advertise to any peer (well-known community)\n"
7878 "Do not export to next AS (well-known community)\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
7888ALIAS (show_bgp_community,
7889 show_bgp_ipv6_community3_cmd,
7890 "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)",
7891 SHOW_STR
7892 BGP_STR
7893 "Address family\n"
7894 "Display routes matching the communities\n"
7895 "community number\n"
7896 "Do not send outside local AS (well-known community)\n"
7897 "Do not advertise to any peer (well-known community)\n"
7898 "Do not export to next AS (well-known community)\n"
7899 "community number\n"
7900 "Do not send outside local AS (well-known community)\n"
7901 "Do not advertise to any peer (well-known community)\n"
7902 "Do not export to next AS (well-known community)\n"
7903 "community number\n"
7904 "Do not send outside local AS (well-known community)\n"
7905 "Do not advertise to any peer (well-known community)\n"
7906 "Do not export to next AS (well-known community)\n")
7907
7908ALIAS (show_bgp_community,
7909 show_bgp_community4_cmd,
7910 "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)",
7911 SHOW_STR
7912 BGP_STR
7913 "Display routes matching the communities\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 "community number\n"
7927 "Do not send outside local AS (well-known community)\n"
7928 "Do not advertise to any peer (well-known community)\n"
7929 "Do not export to next AS (well-known community)\n")
7930
7931ALIAS (show_bgp_community,
7932 show_bgp_ipv6_community4_cmd,
7933 "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)",
7934 SHOW_STR
7935 BGP_STR
7936 "Address family\n"
7937 "Display routes matching the communities\n"
7938 "community number\n"
7939 "Do not send outside local AS (well-known community)\n"
7940 "Do not advertise to any peer (well-known community)\n"
7941 "Do not export to next AS (well-known community)\n"
7942 "community number\n"
7943 "Do not send outside local AS (well-known community)\n"
7944 "Do not advertise to any peer (well-known community)\n"
7945 "Do not export to next AS (well-known community)\n"
7946 "community number\n"
7947 "Do not send outside local AS (well-known community)\n"
7948 "Do not advertise to any peer (well-known community)\n"
7949 "Do not export to next AS (well-known community)\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
7955/* old command */
7956DEFUN (show_ipv6_bgp_community,
7957 show_ipv6_bgp_community_cmd,
7958 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
7959 SHOW_STR
7960 IPV6_STR
7961 BGP_STR
7962 "Display routes matching the communities\n"
7963 "community number\n"
7964 "Do not send outside local AS (well-known community)\n"
7965 "Do not advertise to any peer (well-known community)\n"
7966 "Do not export to next AS (well-known community)\n")
7967{
7968 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
7969}
7970
7971/* old command */
7972ALIAS (show_ipv6_bgp_community,
7973 show_ipv6_bgp_community2_cmd,
7974 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7975 SHOW_STR
7976 IPV6_STR
7977 BGP_STR
7978 "Display routes matching the communities\n"
7979 "community number\n"
7980 "Do not send outside local AS (well-known community)\n"
7981 "Do not advertise to any peer (well-known community)\n"
7982 "Do not export to next AS (well-known community)\n"
7983 "community number\n"
7984 "Do not send outside local AS (well-known community)\n"
7985 "Do not advertise to any peer (well-known community)\n"
7986 "Do not export to next AS (well-known community)\n")
7987
7988/* old command */
7989ALIAS (show_ipv6_bgp_community,
7990 show_ipv6_bgp_community3_cmd,
7991 "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)",
7992 SHOW_STR
7993 IPV6_STR
7994 BGP_STR
7995 "Display routes matching the communities\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 "community number\n"
8005 "Do not send outside local AS (well-known community)\n"
8006 "Do not advertise to any peer (well-known community)\n"
8007 "Do not export to next AS (well-known community)\n")
8008
8009/* old command */
8010ALIAS (show_ipv6_bgp_community,
8011 show_ipv6_bgp_community4_cmd,
8012 "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)",
8013 SHOW_STR
8014 IPV6_STR
8015 BGP_STR
8016 "Display routes matching the communities\n"
8017 "community number\n"
8018 "Do not send outside local AS (well-known community)\n"
8019 "Do not advertise to any peer (well-known community)\n"
8020 "Do not export to next AS (well-known community)\n"
8021 "community number\n"
8022 "Do not send outside local AS (well-known community)\n"
8023 "Do not advertise to any peer (well-known community)\n"
8024 "Do not export to next AS (well-known community)\n"
8025 "community number\n"
8026 "Do not send outside local AS (well-known community)\n"
8027 "Do not advertise to any peer (well-known community)\n"
8028 "Do not export to next AS (well-known community)\n"
8029 "community number\n"
8030 "Do not send outside local AS (well-known community)\n"
8031 "Do not advertise to any peer (well-known community)\n"
8032 "Do not export to next AS (well-known community)\n")
8033
8034DEFUN (show_bgp_community_exact,
8035 show_bgp_community_exact_cmd,
8036 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8037 SHOW_STR
8038 BGP_STR
8039 "Display routes matching the communities\n"
8040 "community number\n"
8041 "Do not send outside local AS (well-known community)\n"
8042 "Do not advertise to any peer (well-known community)\n"
8043 "Do not export to next AS (well-known community)\n"
8044 "Exact match of the communities")
8045{
8046 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8047}
8048
8049ALIAS (show_bgp_community_exact,
8050 show_bgp_ipv6_community_exact_cmd,
8051 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8052 SHOW_STR
8053 BGP_STR
8054 "Address family\n"
8055 "Display routes matching the communities\n"
8056 "community number\n"
8057 "Do not send outside local AS (well-known community)\n"
8058 "Do not advertise to any peer (well-known community)\n"
8059 "Do not export to next AS (well-known community)\n"
8060 "Exact match of the communities")
8061
8062ALIAS (show_bgp_community_exact,
8063 show_bgp_community2_exact_cmd,
8064 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8065 SHOW_STR
8066 BGP_STR
8067 "Display routes matching the communities\n"
8068 "community number\n"
8069 "Do not send outside local AS (well-known community)\n"
8070 "Do not advertise to any peer (well-known community)\n"
8071 "Do not export to next AS (well-known community)\n"
8072 "community number\n"
8073 "Do not send outside local AS (well-known community)\n"
8074 "Do not advertise to any peer (well-known community)\n"
8075 "Do not export to next AS (well-known community)\n"
8076 "Exact match of the communities")
8077
8078ALIAS (show_bgp_community_exact,
8079 show_bgp_ipv6_community2_exact_cmd,
8080 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8081 SHOW_STR
8082 BGP_STR
8083 "Address family\n"
8084 "Display routes matching the communities\n"
8085 "community number\n"
8086 "Do not send outside local AS (well-known community)\n"
8087 "Do not advertise to any peer (well-known community)\n"
8088 "Do not export to next AS (well-known community)\n"
8089 "community number\n"
8090 "Do not send outside local AS (well-known community)\n"
8091 "Do not advertise to any peer (well-known community)\n"
8092 "Do not export to next AS (well-known community)\n"
8093 "Exact match of the communities")
8094
8095ALIAS (show_bgp_community_exact,
8096 show_bgp_community3_exact_cmd,
8097 "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",
8098 SHOW_STR
8099 BGP_STR
8100 "Display routes matching the communities\n"
8101 "community number\n"
8102 "Do not send outside local AS (well-known community)\n"
8103 "Do not advertise to any peer (well-known community)\n"
8104 "Do not export to next AS (well-known community)\n"
8105 "community number\n"
8106 "Do not send outside local AS (well-known community)\n"
8107 "Do not advertise to any peer (well-known community)\n"
8108 "Do not export to next AS (well-known community)\n"
8109 "community number\n"
8110 "Do not send outside local AS (well-known community)\n"
8111 "Do not advertise to any peer (well-known community)\n"
8112 "Do not export to next AS (well-known community)\n"
8113 "Exact match of the communities")
8114
8115ALIAS (show_bgp_community_exact,
8116 show_bgp_ipv6_community3_exact_cmd,
8117 "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",
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 "community number\n"
8127 "Do not send outside local AS (well-known community)\n"
8128 "Do not advertise to any peer (well-known community)\n"
8129 "Do not export to next AS (well-known community)\n"
8130 "community number\n"
8131 "Do not send outside local AS (well-known community)\n"
8132 "Do not advertise to any peer (well-known community)\n"
8133 "Do not export to next AS (well-known community)\n"
8134 "Exact match of the communities")
8135
8136ALIAS (show_bgp_community_exact,
8137 show_bgp_community4_exact_cmd,
8138 "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",
8139 SHOW_STR
8140 BGP_STR
8141 "Display routes matching the communities\n"
8142 "community number\n"
8143 "Do not send outside local AS (well-known community)\n"
8144 "Do not advertise to any peer (well-known community)\n"
8145 "Do not export to next AS (well-known community)\n"
8146 "community number\n"
8147 "Do not send outside local AS (well-known community)\n"
8148 "Do not advertise to any peer (well-known community)\n"
8149 "Do not export to next AS (well-known community)\n"
8150 "community number\n"
8151 "Do not send outside local AS (well-known community)\n"
8152 "Do not advertise to any peer (well-known community)\n"
8153 "Do not export to next AS (well-known community)\n"
8154 "community number\n"
8155 "Do not send outside local AS (well-known community)\n"
8156 "Do not advertise to any peer (well-known community)\n"
8157 "Do not export to next AS (well-known community)\n"
8158 "Exact match of the communities")
8159
8160ALIAS (show_bgp_community_exact,
8161 show_bgp_ipv6_community4_exact_cmd,
8162 "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",
8163 SHOW_STR
8164 BGP_STR
8165 "Address family\n"
8166 "Display routes matching the communities\n"
8167 "community number\n"
8168 "Do not send outside local AS (well-known community)\n"
8169 "Do not advertise to any peer (well-known community)\n"
8170 "Do not export to next AS (well-known community)\n"
8171 "community number\n"
8172 "Do not send outside local AS (well-known community)\n"
8173 "Do not advertise to any peer (well-known community)\n"
8174 "Do not export to next AS (well-known community)\n"
8175 "community number\n"
8176 "Do not send outside local AS (well-known community)\n"
8177 "Do not advertise to any peer (well-known community)\n"
8178 "Do not export to next AS (well-known community)\n"
8179 "community number\n"
8180 "Do not send outside local AS (well-known community)\n"
8181 "Do not advertise to any peer (well-known community)\n"
8182 "Do not export to next AS (well-known community)\n"
8183 "Exact match of the communities")
8184
8185/* old command */
8186DEFUN (show_ipv6_bgp_community_exact,
8187 show_ipv6_bgp_community_exact_cmd,
8188 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8189 SHOW_STR
8190 IPV6_STR
8191 BGP_STR
8192 "Display routes matching the communities\n"
8193 "community number\n"
8194 "Do not send outside local AS (well-known community)\n"
8195 "Do not advertise to any peer (well-known community)\n"
8196 "Do not export to next AS (well-known community)\n"
8197 "Exact match of the communities")
8198{
8199 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8200}
8201
8202/* old command */
8203ALIAS (show_ipv6_bgp_community_exact,
8204 show_ipv6_bgp_community2_exact_cmd,
8205 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8206 SHOW_STR
8207 IPV6_STR
8208 BGP_STR
8209 "Display routes matching the communities\n"
8210 "community number\n"
8211 "Do not send outside local AS (well-known community)\n"
8212 "Do not advertise to any peer (well-known community)\n"
8213 "Do not export to next AS (well-known community)\n"
8214 "community number\n"
8215 "Do not send outside local AS (well-known community)\n"
8216 "Do not advertise to any peer (well-known community)\n"
8217 "Do not export to next AS (well-known community)\n"
8218 "Exact match of the communities")
8219
8220/* old command */
8221ALIAS (show_ipv6_bgp_community_exact,
8222 show_ipv6_bgp_community3_exact_cmd,
8223 "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",
8224 SHOW_STR
8225 IPV6_STR
8226 BGP_STR
8227 "Display routes matching the communities\n"
8228 "community number\n"
8229 "Do not send outside local AS (well-known community)\n"
8230 "Do not advertise to any peer (well-known community)\n"
8231 "Do not export to next AS (well-known community)\n"
8232 "community number\n"
8233 "Do not send outside local AS (well-known community)\n"
8234 "Do not advertise to any peer (well-known community)\n"
8235 "Do not export to next AS (well-known community)\n"
8236 "community number\n"
8237 "Do not send outside local AS (well-known community)\n"
8238 "Do not advertise to any peer (well-known community)\n"
8239 "Do not export to next AS (well-known community)\n"
8240 "Exact match of the communities")
8241
8242/* old command */
8243ALIAS (show_ipv6_bgp_community_exact,
8244 show_ipv6_bgp_community4_exact_cmd,
8245 "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",
8246 SHOW_STR
8247 IPV6_STR
8248 BGP_STR
8249 "Display routes matching the communities\n"
8250 "community number\n"
8251 "Do not send outside local AS (well-known community)\n"
8252 "Do not advertise to any peer (well-known community)\n"
8253 "Do not export to next AS (well-known community)\n"
8254 "community number\n"
8255 "Do not send outside local AS (well-known community)\n"
8256 "Do not advertise to any peer (well-known community)\n"
8257 "Do not export to next AS (well-known community)\n"
8258 "community number\n"
8259 "Do not send outside local AS (well-known community)\n"
8260 "Do not advertise to any peer (well-known community)\n"
8261 "Do not export to next AS (well-known community)\n"
8262 "community number\n"
8263 "Do not send outside local AS (well-known community)\n"
8264 "Do not advertise to any peer (well-known community)\n"
8265 "Do not export to next AS (well-known community)\n"
8266 "Exact match of the communities")
8267
8268/* old command */
8269DEFUN (show_ipv6_mbgp_community,
8270 show_ipv6_mbgp_community_cmd,
8271 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8272 SHOW_STR
8273 IPV6_STR
8274 MBGP_STR
8275 "Display routes matching the communities\n"
8276 "community number\n"
8277 "Do not send outside local AS (well-known community)\n"
8278 "Do not advertise to any peer (well-known community)\n"
8279 "Do not export to next AS (well-known community)\n")
8280{
8281 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
8282}
8283
8284/* old command */
8285ALIAS (show_ipv6_mbgp_community,
8286 show_ipv6_mbgp_community2_cmd,
8287 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8288 SHOW_STR
8289 IPV6_STR
8290 MBGP_STR
8291 "Display routes matching the communities\n"
8292 "community number\n"
8293 "Do not send outside local AS (well-known community)\n"
8294 "Do not advertise to any peer (well-known community)\n"
8295 "Do not export to next AS (well-known community)\n"
8296 "community number\n"
8297 "Do not send outside local AS (well-known community)\n"
8298 "Do not advertise to any peer (well-known community)\n"
8299 "Do not export to next AS (well-known community)\n")
8300
8301/* old command */
8302ALIAS (show_ipv6_mbgp_community,
8303 show_ipv6_mbgp_community3_cmd,
8304 "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)",
8305 SHOW_STR
8306 IPV6_STR
8307 MBGP_STR
8308 "Display routes matching the communities\n"
8309 "community number\n"
8310 "Do not send outside local AS (well-known community)\n"
8311 "Do not advertise to any peer (well-known community)\n"
8312 "Do not export to next AS (well-known community)\n"
8313 "community number\n"
8314 "Do not send outside local AS (well-known community)\n"
8315 "Do not advertise to any peer (well-known community)\n"
8316 "Do not export to next AS (well-known community)\n"
8317 "community number\n"
8318 "Do not send outside local AS (well-known community)\n"
8319 "Do not advertise to any peer (well-known community)\n"
8320 "Do not export to next AS (well-known community)\n")
8321
8322/* old command */
8323ALIAS (show_ipv6_mbgp_community,
8324 show_ipv6_mbgp_community4_cmd,
8325 "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)",
8326 SHOW_STR
8327 IPV6_STR
8328 MBGP_STR
8329 "Display routes matching the communities\n"
8330 "community number\n"
8331 "Do not send outside local AS (well-known community)\n"
8332 "Do not advertise to any peer (well-known community)\n"
8333 "Do not export to next AS (well-known community)\n"
8334 "community number\n"
8335 "Do not send outside local AS (well-known community)\n"
8336 "Do not advertise to any peer (well-known community)\n"
8337 "Do not export to next AS (well-known community)\n"
8338 "community number\n"
8339 "Do not send outside local AS (well-known community)\n"
8340 "Do not advertise to any peer (well-known community)\n"
8341 "Do not export to next AS (well-known community)\n"
8342 "community number\n"
8343 "Do not send outside local AS (well-known community)\n"
8344 "Do not advertise to any peer (well-known community)\n"
8345 "Do not export to next AS (well-known community)\n")
8346
8347/* old command */
8348DEFUN (show_ipv6_mbgp_community_exact,
8349 show_ipv6_mbgp_community_exact_cmd,
8350 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8351 SHOW_STR
8352 IPV6_STR
8353 MBGP_STR
8354 "Display routes matching the communities\n"
8355 "community number\n"
8356 "Do not send outside local AS (well-known community)\n"
8357 "Do not advertise to any peer (well-known community)\n"
8358 "Do not export to next AS (well-known community)\n"
8359 "Exact match of the communities")
8360{
8361 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
8362}
8363
8364/* old command */
8365ALIAS (show_ipv6_mbgp_community_exact,
8366 show_ipv6_mbgp_community2_exact_cmd,
8367 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8368 SHOW_STR
8369 IPV6_STR
8370 MBGP_STR
8371 "Display routes matching the communities\n"
8372 "community number\n"
8373 "Do not send outside local AS (well-known community)\n"
8374 "Do not advertise to any peer (well-known community)\n"
8375 "Do not export to next AS (well-known community)\n"
8376 "community number\n"
8377 "Do not send outside local AS (well-known community)\n"
8378 "Do not advertise to any peer (well-known community)\n"
8379 "Do not export to next AS (well-known community)\n"
8380 "Exact match of the communities")
8381
8382/* old command */
8383ALIAS (show_ipv6_mbgp_community_exact,
8384 show_ipv6_mbgp_community3_exact_cmd,
8385 "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",
8386 SHOW_STR
8387 IPV6_STR
8388 MBGP_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
8404/* old command */
8405ALIAS (show_ipv6_mbgp_community_exact,
8406 show_ipv6_mbgp_community4_exact_cmd,
8407 "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",
8408 SHOW_STR
8409 IPV6_STR
8410 MBGP_STR
8411 "Display routes matching the communities\n"
8412 "community number\n"
8413 "Do not send outside local AS (well-known community)\n"
8414 "Do not advertise to any peer (well-known community)\n"
8415 "Do not export to next AS (well-known community)\n"
8416 "community number\n"
8417 "Do not send outside local AS (well-known community)\n"
8418 "Do not advertise to any peer (well-known community)\n"
8419 "Do not export to next AS (well-known community)\n"
8420 "community number\n"
8421 "Do not send outside local AS (well-known community)\n"
8422 "Do not advertise to any peer (well-known community)\n"
8423 "Do not export to next AS (well-known community)\n"
8424 "community number\n"
8425 "Do not send outside local AS (well-known community)\n"
8426 "Do not advertise to any peer (well-known community)\n"
8427 "Do not export to next AS (well-known community)\n"
8428 "Exact match of the communities")
8429#endif /* HAVE_IPV6 */
8430
paul94f2b392005-06-28 12:44:16 +00008431static int
paulfd79ac92004-10-13 05:06:08 +00008432bgp_show_community_list (struct vty *vty, const char *com, int exact,
Michael Lambert4c9641b2010-07-22 13:20:55 -04008433 afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +00008434{
8435 struct community_list *list;
8436
hassofee6e4e2005-02-02 16:29:31 +00008437 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
paul718e3742002-12-13 20:15:29 +00008438 if (list == NULL)
8439 {
8440 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8441 VTY_NEWLINE);
8442 return CMD_WARNING;
8443 }
8444
ajs5a646652004-11-05 01:25:55 +00008445 return bgp_show (vty, NULL, afi, safi,
8446 (exact ? bgp_show_type_community_list_exact :
8447 bgp_show_type_community_list), list);
paul718e3742002-12-13 20:15:29 +00008448}
8449
8450DEFUN (show_ip_bgp_community_list,
8451 show_ip_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008452 "show ip bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008453 SHOW_STR
8454 IP_STR
8455 BGP_STR
8456 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008457 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008458 "community-list name\n")
8459{
8460 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8461}
8462
8463DEFUN (show_ip_bgp_ipv4_community_list,
8464 show_ip_bgp_ipv4_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008465 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008466 SHOW_STR
8467 IP_STR
8468 BGP_STR
8469 "Address family\n"
8470 "Address Family modifier\n"
8471 "Address Family modifier\n"
8472 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008473 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008474 "community-list name\n")
8475{
8476 if (strncmp (argv[0], "m", 1) == 0)
8477 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8478
8479 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8480}
8481
8482DEFUN (show_ip_bgp_community_list_exact,
8483 show_ip_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008484 "show ip bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008485 SHOW_STR
8486 IP_STR
8487 BGP_STR
8488 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008489 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008490 "community-list name\n"
8491 "Exact match of the communities\n")
8492{
8493 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8494}
8495
8496DEFUN (show_ip_bgp_ipv4_community_list_exact,
8497 show_ip_bgp_ipv4_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008498 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008499 SHOW_STR
8500 IP_STR
8501 BGP_STR
8502 "Address family\n"
8503 "Address Family modifier\n"
8504 "Address Family modifier\n"
8505 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008506 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008507 "community-list name\n"
8508 "Exact match of the communities\n")
8509{
8510 if (strncmp (argv[0], "m", 1) == 0)
8511 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8512
8513 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8514}
8515
8516#ifdef HAVE_IPV6
8517DEFUN (show_bgp_community_list,
8518 show_bgp_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008519 "show bgp community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008520 SHOW_STR
8521 BGP_STR
8522 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008523 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008524 "community-list name\n")
8525{
8526 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8527}
8528
8529ALIAS (show_bgp_community_list,
8530 show_bgp_ipv6_community_list_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008531 "show bgp ipv6 community-list (<1-500>|WORD)",
paul718e3742002-12-13 20:15:29 +00008532 SHOW_STR
8533 BGP_STR
8534 "Address family\n"
8535 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008536 "community-list number\n"
paule8e19462006-01-19 20:16:55 +00008537 "community-list name\n")
paul718e3742002-12-13 20:15:29 +00008538
8539/* old command */
8540DEFUN (show_ipv6_bgp_community_list,
8541 show_ipv6_bgp_community_list_cmd,
8542 "show ipv6 bgp community-list WORD",
8543 SHOW_STR
8544 IPV6_STR
8545 BGP_STR
8546 "Display routes matching the community-list\n"
8547 "community-list name\n")
8548{
8549 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8550}
8551
8552/* old command */
8553DEFUN (show_ipv6_mbgp_community_list,
8554 show_ipv6_mbgp_community_list_cmd,
8555 "show ipv6 mbgp community-list WORD",
8556 SHOW_STR
8557 IPV6_STR
8558 MBGP_STR
8559 "Display routes matching the community-list\n"
8560 "community-list name\n")
8561{
8562 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8563}
8564
8565DEFUN (show_bgp_community_list_exact,
8566 show_bgp_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008567 "show bgp community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008568 SHOW_STR
8569 BGP_STR
8570 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008571 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008572 "community-list name\n"
8573 "Exact match of the communities\n")
8574{
8575 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8576}
8577
8578ALIAS (show_bgp_community_list_exact,
8579 show_bgp_ipv6_community_list_exact_cmd,
hassofee6e4e2005-02-02 16:29:31 +00008580 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
paul718e3742002-12-13 20:15:29 +00008581 SHOW_STR
8582 BGP_STR
8583 "Address family\n"
8584 "Display routes matching the community-list\n"
hassofee6e4e2005-02-02 16:29:31 +00008585 "community-list number\n"
paul718e3742002-12-13 20:15:29 +00008586 "community-list name\n"
8587 "Exact match of the communities\n")
8588
8589/* old command */
8590DEFUN (show_ipv6_bgp_community_list_exact,
8591 show_ipv6_bgp_community_list_exact_cmd,
8592 "show ipv6 bgp community-list WORD exact-match",
8593 SHOW_STR
8594 IPV6_STR
8595 BGP_STR
8596 "Display routes matching the community-list\n"
8597 "community-list name\n"
8598 "Exact match of the communities\n")
8599{
8600 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8601}
8602
8603/* old command */
8604DEFUN (show_ipv6_mbgp_community_list_exact,
8605 show_ipv6_mbgp_community_list_exact_cmd,
8606 "show ipv6 mbgp community-list WORD exact-match",
8607 SHOW_STR
8608 IPV6_STR
8609 MBGP_STR
8610 "Display routes matching the community-list\n"
8611 "community-list name\n"
8612 "Exact match of the communities\n")
8613{
8614 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8615}
8616#endif /* HAVE_IPV6 */
8617
paul94f2b392005-06-28 12:44:16 +00008618static int
paulfd79ac92004-10-13 05:06:08 +00008619bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
paul718e3742002-12-13 20:15:29 +00008620 safi_t safi, enum bgp_show_type type)
8621{
8622 int ret;
8623 struct prefix *p;
8624
8625 p = prefix_new();
8626
8627 ret = str2prefix (prefix, p);
8628 if (! ret)
8629 {
8630 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
8631 return CMD_WARNING;
8632 }
8633
ajs5a646652004-11-05 01:25:55 +00008634 ret = bgp_show (vty, NULL, afi, safi, type, p);
8635 prefix_free(p);
8636 return ret;
paul718e3742002-12-13 20:15:29 +00008637}
8638
8639DEFUN (show_ip_bgp_prefix_longer,
8640 show_ip_bgp_prefix_longer_cmd,
8641 "show ip bgp A.B.C.D/M longer-prefixes",
8642 SHOW_STR
8643 IP_STR
8644 BGP_STR
8645 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8646 "Display route and more specific routes\n")
8647{
8648 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8649 bgp_show_type_prefix_longer);
8650}
8651
8652DEFUN (show_ip_bgp_flap_prefix_longer,
8653 show_ip_bgp_flap_prefix_longer_cmd,
8654 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
8655 SHOW_STR
8656 IP_STR
8657 BGP_STR
8658 "Display flap statistics of routes\n"
8659 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8660 "Display route and more specific routes\n")
8661{
8662 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8663 bgp_show_type_flap_prefix_longer);
8664}
8665
8666DEFUN (show_ip_bgp_ipv4_prefix_longer,
8667 show_ip_bgp_ipv4_prefix_longer_cmd,
8668 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
8669 SHOW_STR
8670 IP_STR
8671 BGP_STR
8672 "Address family\n"
8673 "Address Family modifier\n"
8674 "Address Family modifier\n"
8675 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8676 "Display route and more specific routes\n")
8677{
8678 if (strncmp (argv[0], "m", 1) == 0)
8679 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8680 bgp_show_type_prefix_longer);
8681
8682 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
8683 bgp_show_type_prefix_longer);
8684}
8685
8686DEFUN (show_ip_bgp_flap_address,
8687 show_ip_bgp_flap_address_cmd,
8688 "show ip bgp flap-statistics A.B.C.D",
8689 SHOW_STR
8690 IP_STR
8691 BGP_STR
8692 "Display flap statistics of routes\n"
8693 "Network in the BGP routing table to display\n")
8694{
8695 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8696 bgp_show_type_flap_address);
8697}
8698
8699DEFUN (show_ip_bgp_flap_prefix,
8700 show_ip_bgp_flap_prefix_cmd,
8701 "show ip bgp flap-statistics A.B.C.D/M",
8702 SHOW_STR
8703 IP_STR
8704 BGP_STR
8705 "Display flap statistics of routes\n"
8706 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
8707{
8708 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8709 bgp_show_type_flap_prefix);
8710}
8711#ifdef HAVE_IPV6
8712DEFUN (show_bgp_prefix_longer,
8713 show_bgp_prefix_longer_cmd,
8714 "show bgp X:X::X:X/M longer-prefixes",
8715 SHOW_STR
8716 BGP_STR
8717 "IPv6 prefix <network>/<length>\n"
8718 "Display route and more specific routes\n")
8719{
8720 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8721 bgp_show_type_prefix_longer);
8722}
8723
8724ALIAS (show_bgp_prefix_longer,
8725 show_bgp_ipv6_prefix_longer_cmd,
8726 "show bgp ipv6 X:X::X:X/M longer-prefixes",
8727 SHOW_STR
8728 BGP_STR
8729 "Address family\n"
8730 "IPv6 prefix <network>/<length>\n"
8731 "Display route and more specific routes\n")
8732
8733/* old command */
8734DEFUN (show_ipv6_bgp_prefix_longer,
8735 show_ipv6_bgp_prefix_longer_cmd,
8736 "show ipv6 bgp X:X::X:X/M longer-prefixes",
8737 SHOW_STR
8738 IPV6_STR
8739 BGP_STR
8740 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8741 "Display route and more specific routes\n")
8742{
8743 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8744 bgp_show_type_prefix_longer);
8745}
8746
8747/* old command */
8748DEFUN (show_ipv6_mbgp_prefix_longer,
8749 show_ipv6_mbgp_prefix_longer_cmd,
8750 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
8751 SHOW_STR
8752 IPV6_STR
8753 MBGP_STR
8754 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8755 "Display route and more specific routes\n")
8756{
8757 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
8758 bgp_show_type_prefix_longer);
8759}
8760#endif /* HAVE_IPV6 */
paulbb46e942003-10-24 19:02:03 +00008761
paul94f2b392005-06-28 12:44:16 +00008762static struct peer *
paulfd79ac92004-10-13 05:06:08 +00008763peer_lookup_in_view (struct vty *vty, const char *view_name,
8764 const char *ip_str)
paulbb46e942003-10-24 19:02:03 +00008765{
8766 int ret;
8767 struct bgp *bgp;
8768 struct peer *peer;
8769 union sockunion su;
8770
8771 /* BGP structure lookup. */
8772 if (view_name)
8773 {
8774 bgp = bgp_lookup_by_name (view_name);
8775 if (! bgp)
8776 {
8777 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
8778 return NULL;
8779 }
8780 }
paul5228ad22004-06-04 17:58:18 +00008781 else
paulbb46e942003-10-24 19:02:03 +00008782 {
8783 bgp = bgp_get_default ();
8784 if (! bgp)
8785 {
8786 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
8787 return NULL;
8788 }
8789 }
8790
8791 /* Get peer sockunion. */
8792 ret = str2sockunion (ip_str, &su);
8793 if (ret < 0)
8794 {
8795 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
8796 return NULL;
8797 }
8798
8799 /* Peer structure lookup. */
8800 peer = peer_lookup (bgp, &su);
8801 if (! peer)
8802 {
8803 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
8804 return NULL;
8805 }
8806
8807 return peer;
8808}
Paul Jakma2815e612006-09-14 02:56:07 +00008809
8810enum bgp_stats
8811{
8812 BGP_STATS_MAXBITLEN = 0,
8813 BGP_STATS_RIB,
8814 BGP_STATS_PREFIXES,
8815 BGP_STATS_TOTPLEN,
8816 BGP_STATS_UNAGGREGATEABLE,
8817 BGP_STATS_MAX_AGGREGATEABLE,
8818 BGP_STATS_AGGREGATES,
8819 BGP_STATS_SPACE,
8820 BGP_STATS_ASPATH_COUNT,
8821 BGP_STATS_ASPATH_MAXHOPS,
8822 BGP_STATS_ASPATH_TOTHOPS,
8823 BGP_STATS_ASPATH_MAXSIZE,
8824 BGP_STATS_ASPATH_TOTSIZE,
8825 BGP_STATS_ASN_HIGHEST,
8826 BGP_STATS_MAX,
8827};
paulbb46e942003-10-24 19:02:03 +00008828
Paul Jakma2815e612006-09-14 02:56:07 +00008829static const char *table_stats_strs[] =
8830{
8831 [BGP_STATS_PREFIXES] = "Total Prefixes",
8832 [BGP_STATS_TOTPLEN] = "Average prefix length",
8833 [BGP_STATS_RIB] = "Total Advertisements",
8834 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
8835 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
8836 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
8837 [BGP_STATS_SPACE] = "Address space advertised",
8838 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
8839 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
8840 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
8841 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
8842 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
8843 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
8844 [BGP_STATS_MAX] = NULL,
8845};
8846
8847struct bgp_table_stats
8848{
8849 struct bgp_table *table;
8850 unsigned long long counts[BGP_STATS_MAX];
8851};
8852
8853#if 0
8854#define TALLY_SIGFIG 100000
8855static unsigned long
8856ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
8857{
8858 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
8859 unsigned long res = (newtot * TALLY_SIGFIG) / count;
8860 unsigned long ret = newtot / count;
8861
8862 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
8863 return ret + 1;
8864 else
8865 return ret;
8866}
8867#endif
8868
8869static int
8870bgp_table_stats_walker (struct thread *t)
8871{
8872 struct bgp_node *rn;
8873 struct bgp_node *top;
8874 struct bgp_table_stats *ts = THREAD_ARG (t);
8875 unsigned int space = 0;
8876
Paul Jakma53d9f672006-10-15 23:41:16 +00008877 if (!(top = bgp_table_top (ts->table)))
8878 return 0;
Paul Jakma2815e612006-09-14 02:56:07 +00008879
8880 switch (top->p.family)
8881 {
8882 case AF_INET:
8883 space = IPV4_MAX_BITLEN;
8884 break;
8885 case AF_INET6:
8886 space = IPV6_MAX_BITLEN;
8887 break;
8888 }
8889
8890 ts->counts[BGP_STATS_MAXBITLEN] = space;
8891
8892 for (rn = top; rn; rn = bgp_route_next (rn))
8893 {
8894 struct bgp_info *ri;
8895 struct bgp_node *prn = rn->parent;
8896 unsigned int rinum = 0;
8897
8898 if (rn == top)
8899 continue;
8900
8901 if (!rn->info)
8902 continue;
8903
8904 ts->counts[BGP_STATS_PREFIXES]++;
8905 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
8906
8907#if 0
8908 ts->counts[BGP_STATS_AVGPLEN]
8909 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
8910 ts->counts[BGP_STATS_AVGPLEN],
8911 rn->p.prefixlen);
8912#endif
8913
8914 /* check if the prefix is included by any other announcements */
8915 while (prn && !prn->info)
8916 prn = prn->parent;
8917
8918 if (prn == NULL || prn == top)
Paul Jakma8383a9b2006-09-14 03:06:54 +00008919 {
8920 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
8921 /* announced address space */
8922 if (space)
8923 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
8924 }
Paul Jakma2815e612006-09-14 02:56:07 +00008925 else if (prn->info)
8926 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
8927
Paul Jakma2815e612006-09-14 02:56:07 +00008928 for (ri = rn->info; ri; ri = ri->next)
8929 {
8930 rinum++;
8931 ts->counts[BGP_STATS_RIB]++;
8932
8933 if (ri->attr &&
8934 (CHECK_FLAG (ri->attr->flag,
8935 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
8936 ts->counts[BGP_STATS_AGGREGATES]++;
8937
8938 /* as-path stats */
8939 if (ri->attr && ri->attr->aspath)
8940 {
8941 unsigned int hops = aspath_count_hops (ri->attr->aspath);
8942 unsigned int size = aspath_size (ri->attr->aspath);
8943 as_t highest = aspath_highest (ri->attr->aspath);
8944
8945 ts->counts[BGP_STATS_ASPATH_COUNT]++;
8946
8947 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
8948 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
8949
8950 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
8951 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
8952
8953 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
8954 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
8955#if 0
8956 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
8957 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
8958 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
8959 hops);
8960 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
8961 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
8962 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
8963 size);
8964#endif
8965 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
8966 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
8967 }
8968 }
8969 }
8970 return 0;
8971}
8972
8973static int
8974bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
8975{
8976 struct bgp_table_stats ts;
8977 unsigned int i;
8978
8979 if (!bgp->rib[afi][safi])
8980 {
8981 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
8982 return CMD_WARNING;
8983 }
8984
8985 memset (&ts, 0, sizeof (ts));
8986 ts.table = bgp->rib[afi][safi];
8987 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
8988
8989 vty_out (vty, "BGP %s RIB statistics%s%s",
8990 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
8991
8992 for (i = 0; i < BGP_STATS_MAX; i++)
8993 {
8994 if (!table_stats_strs[i])
8995 continue;
8996
8997 switch (i)
8998 {
8999#if 0
9000 case BGP_STATS_ASPATH_AVGHOPS:
9001 case BGP_STATS_ASPATH_AVGSIZE:
9002 case BGP_STATS_AVGPLEN:
9003 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9004 vty_out (vty, "%12.2f",
9005 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9006 break;
9007#endif
9008 case BGP_STATS_ASPATH_TOTHOPS:
9009 case BGP_STATS_ASPATH_TOTSIZE:
9010 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9011 vty_out (vty, "%12.2f",
9012 ts.counts[i] ?
9013 (float)ts.counts[i] /
9014 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9015 : 0);
9016 break;
9017 case BGP_STATS_TOTPLEN:
9018 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9019 vty_out (vty, "%12.2f",
9020 ts.counts[i] ?
9021 (float)ts.counts[i] /
9022 (float)ts.counts[BGP_STATS_PREFIXES]
9023 : 0);
9024 break;
9025 case BGP_STATS_SPACE:
9026 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9027 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9028 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9029 break;
Paul Jakma30a22312008-08-15 14:05:22 +01009030 vty_out (vty, "%30s: ", "%% announced ");
Paul Jakma2815e612006-09-14 02:56:07 +00009031 vty_out (vty, "%12.2f%s",
9032 100 * (float)ts.counts[BGP_STATS_SPACE] /
Paul Jakma56395af2006-10-27 16:58:20 +00009033 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
Paul Jakma2815e612006-09-14 02:56:07 +00009034 VTY_NEWLINE);
9035 vty_out (vty, "%30s: ", "/8 equivalent ");
9036 vty_out (vty, "%12.2f%s",
9037 (float)ts.counts[BGP_STATS_SPACE] /
9038 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9039 VTY_NEWLINE);
9040 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9041 break;
9042 vty_out (vty, "%30s: ", "/24 equivalent ");
9043 vty_out (vty, "%12.2f",
9044 (float)ts.counts[BGP_STATS_SPACE] /
9045 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9046 break;
9047 default:
9048 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9049 vty_out (vty, "%12llu", ts.counts[i]);
9050 }
9051
9052 vty_out (vty, "%s", VTY_NEWLINE);
9053 }
9054 return CMD_SUCCESS;
9055}
9056
9057static int
9058bgp_table_stats_vty (struct vty *vty, const char *name,
9059 const char *afi_str, const char *safi_str)
9060{
9061 struct bgp *bgp;
9062 afi_t afi;
9063 safi_t safi;
9064
9065 if (name)
9066 bgp = bgp_lookup_by_name (name);
9067 else
9068 bgp = bgp_get_default ();
9069
9070 if (!bgp)
9071 {
9072 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9073 return CMD_WARNING;
9074 }
9075 if (strncmp (afi_str, "ipv", 3) == 0)
9076 {
9077 if (strncmp (afi_str, "ipv4", 4) == 0)
9078 afi = AFI_IP;
9079 else if (strncmp (afi_str, "ipv6", 4) == 0)
9080 afi = AFI_IP6;
9081 else
9082 {
9083 vty_out (vty, "%% Invalid address family %s%s",
9084 afi_str, VTY_NEWLINE);
9085 return CMD_WARNING;
9086 }
9087 if (strncmp (safi_str, "m", 1) == 0)
9088 safi = SAFI_MULTICAST;
9089 else if (strncmp (safi_str, "u", 1) == 0)
9090 safi = SAFI_UNICAST;
Denis Ovsienkoe81537d2011-07-14 12:36:19 +04009091 else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0)
9092 safi = SAFI_MPLS_LABELED_VPN;
Paul Jakma2815e612006-09-14 02:56:07 +00009093 else
9094 {
9095 vty_out (vty, "%% Invalid subsequent address family %s%s",
9096 safi_str, VTY_NEWLINE);
9097 return CMD_WARNING;
9098 }
9099 }
9100 else
9101 {
9102 vty_out (vty, "%% Invalid address family %s%s",
9103 afi_str, VTY_NEWLINE);
9104 return CMD_WARNING;
9105 }
9106
Paul Jakma2815e612006-09-14 02:56:07 +00009107 return bgp_table_stats (vty, bgp, afi, safi);
9108}
9109
9110DEFUN (show_bgp_statistics,
9111 show_bgp_statistics_cmd,
9112 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9113 SHOW_STR
9114 BGP_STR
9115 "Address family\n"
9116 "Address family\n"
9117 "Address Family modifier\n"
9118 "Address Family modifier\n"
9119 "BGP RIB advertisement statistics\n")
9120{
9121 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9122}
9123
9124ALIAS (show_bgp_statistics,
9125 show_bgp_statistics_vpnv4_cmd,
9126 "show bgp (ipv4) (vpnv4) statistics",
9127 SHOW_STR
9128 BGP_STR
9129 "Address family\n"
9130 "Address Family modifier\n"
9131 "BGP RIB advertisement statistics\n")
9132
9133DEFUN (show_bgp_statistics_view,
9134 show_bgp_statistics_view_cmd,
9135 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9136 SHOW_STR
9137 BGP_STR
9138 "BGP view\n"
9139 "Address family\n"
9140 "Address family\n"
9141 "Address Family modifier\n"
9142 "Address Family modifier\n"
9143 "BGP RIB advertisement statistics\n")
9144{
9145 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9146}
9147
9148ALIAS (show_bgp_statistics_view,
9149 show_bgp_statistics_view_vpnv4_cmd,
9150 "show bgp view WORD (ipv4) (vpnv4) statistics",
9151 SHOW_STR
9152 BGP_STR
9153 "BGP view\n"
9154 "Address family\n"
9155 "Address Family modifier\n"
9156 "BGP RIB advertisement statistics\n")
9157
Paul Jakmaff7924f2006-09-04 01:10:36 +00009158enum bgp_pcounts
9159{
9160 PCOUNT_ADJ_IN = 0,
9161 PCOUNT_DAMPED,
9162 PCOUNT_REMOVED,
9163 PCOUNT_HISTORY,
9164 PCOUNT_STALE,
9165 PCOUNT_VALID,
9166 PCOUNT_ALL,
9167 PCOUNT_COUNTED,
9168 PCOUNT_PFCNT, /* the figure we display to users */
9169 PCOUNT_MAX,
9170};
9171
9172static const char *pcount_strs[] =
9173{
9174 [PCOUNT_ADJ_IN] = "Adj-in",
9175 [PCOUNT_DAMPED] = "Damped",
9176 [PCOUNT_REMOVED] = "Removed",
9177 [PCOUNT_HISTORY] = "History",
9178 [PCOUNT_STALE] = "Stale",
9179 [PCOUNT_VALID] = "Valid",
9180 [PCOUNT_ALL] = "All RIB",
9181 [PCOUNT_COUNTED] = "PfxCt counted",
9182 [PCOUNT_PFCNT] = "Useable",
9183 [PCOUNT_MAX] = NULL,
9184};
9185
Paul Jakma2815e612006-09-14 02:56:07 +00009186struct peer_pcounts
9187{
9188 unsigned int count[PCOUNT_MAX];
9189 const struct peer *peer;
9190 const struct bgp_table *table;
9191};
9192
Paul Jakmaff7924f2006-09-04 01:10:36 +00009193static int
Paul Jakma2815e612006-09-14 02:56:07 +00009194bgp_peer_count_walker (struct thread *t)
Paul Jakmaff7924f2006-09-04 01:10:36 +00009195{
9196 struct bgp_node *rn;
Paul Jakma2815e612006-09-14 02:56:07 +00009197 struct peer_pcounts *pc = THREAD_ARG (t);
9198 const struct peer *peer = pc->peer;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009199
Paul Jakma2815e612006-09-14 02:56:07 +00009200 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009201 {
9202 struct bgp_adj_in *ain;
Paul Jakma2815e612006-09-14 02:56:07 +00009203 struct bgp_info *ri;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009204
9205 for (ain = rn->adj_in; ain; ain = ain->next)
9206 if (ain->peer == peer)
Paul Jakma2815e612006-09-14 02:56:07 +00009207 pc->count[PCOUNT_ADJ_IN]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009208
Paul Jakmaff7924f2006-09-04 01:10:36 +00009209 for (ri = rn->info; ri; ri = ri->next)
9210 {
9211 char buf[SU_ADDRSTRLEN];
9212
9213 if (ri->peer != peer)
9214 continue;
9215
Paul Jakma2815e612006-09-14 02:56:07 +00009216 pc->count[PCOUNT_ALL]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009217
9218 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
Paul Jakma2815e612006-09-14 02:56:07 +00009219 pc->count[PCOUNT_DAMPED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009220 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
Paul Jakma2815e612006-09-14 02:56:07 +00009221 pc->count[PCOUNT_HISTORY]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009222 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
Paul Jakma2815e612006-09-14 02:56:07 +00009223 pc->count[PCOUNT_REMOVED]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009224 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
Paul Jakma2815e612006-09-14 02:56:07 +00009225 pc->count[PCOUNT_STALE]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009226 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
Paul Jakma2815e612006-09-14 02:56:07 +00009227 pc->count[PCOUNT_VALID]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009228 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakma2815e612006-09-14 02:56:07 +00009229 pc->count[PCOUNT_PFCNT]++;
Paul Jakmaff7924f2006-09-04 01:10:36 +00009230
9231 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9232 {
Paul Jakma2815e612006-09-14 02:56:07 +00009233 pc->count[PCOUNT_COUNTED]++;
Paul Jakma1a392d42006-09-07 00:24:49 +00009234 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009235 plog_warn (peer->log,
9236 "%s [pcount] %s/%d is counted but flags 0x%x",
9237 peer->host,
9238 inet_ntop(rn->p.family, &rn->p.u.prefix,
9239 buf, SU_ADDRSTRLEN),
9240 rn->p.prefixlen,
9241 ri->flags);
9242 }
9243 else
9244 {
Paul Jakma1a392d42006-09-07 00:24:49 +00009245 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
Paul Jakmaff7924f2006-09-04 01:10:36 +00009246 plog_warn (peer->log,
9247 "%s [pcount] %s/%d not counted but flags 0x%x",
9248 peer->host,
9249 inet_ntop(rn->p.family, &rn->p.u.prefix,
9250 buf, SU_ADDRSTRLEN),
9251 rn->p.prefixlen,
9252 ri->flags);
9253 }
9254 }
9255 }
Paul Jakma2815e612006-09-14 02:56:07 +00009256 return 0;
9257}
Paul Jakmaff7924f2006-09-04 01:10:36 +00009258
Paul Jakma2815e612006-09-14 02:56:07 +00009259static int
9260bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9261{
9262 struct peer_pcounts pcounts = { .peer = peer };
9263 unsigned int i;
9264
9265 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9266 || !peer->bgp->rib[afi][safi])
9267 {
9268 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9269 return CMD_WARNING;
9270 }
9271
9272 memset (&pcounts, 0, sizeof(pcounts));
9273 pcounts.peer = peer;
9274 pcounts.table = peer->bgp->rib[afi][safi];
9275
9276 /* in-place call via thread subsystem so as to record execution time
9277 * stats for the thread-walk (i.e. ensure this can't be blamed on
9278 * on just vty_read()).
9279 */
9280 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9281
Paul Jakmaff7924f2006-09-04 01:10:36 +00009282 vty_out (vty, "Prefix counts for %s, %s%s",
9283 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9284 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9285 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9286 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9287
9288 for (i = 0; i < PCOUNT_MAX; i++)
Paul Jakma2815e612006-09-14 02:56:07 +00009289 vty_out (vty, "%20s: %-10d%s",
9290 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
Paul Jakmaff7924f2006-09-04 01:10:36 +00009291
Paul Jakma2815e612006-09-14 02:56:07 +00009292 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
Paul Jakmaff7924f2006-09-04 01:10:36 +00009293 {
9294 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9295 peer->host, VTY_NEWLINE);
9296 vty_out (vty, "Please report this bug, with the above command output%s",
9297 VTY_NEWLINE);
9298 }
9299
9300 return CMD_SUCCESS;
9301}
9302
9303DEFUN (show_ip_bgp_neighbor_prefix_counts,
9304 show_ip_bgp_neighbor_prefix_counts_cmd,
9305 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9306 SHOW_STR
9307 IP_STR
9308 BGP_STR
9309 "Detailed information on TCP and BGP neighbor connections\n"
9310 "Neighbor to display information about\n"
9311 "Neighbor to display information about\n"
9312 "Display detailed prefix count information\n")
9313{
9314 struct peer *peer;
9315
9316 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9317 if (! peer)
9318 return CMD_WARNING;
9319
9320 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9321}
9322
9323DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9324 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9325 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9326 SHOW_STR
9327 BGP_STR
9328 "Address family\n"
9329 "Detailed information on TCP and BGP neighbor connections\n"
9330 "Neighbor to display information about\n"
9331 "Neighbor to display information about\n"
9332 "Display detailed prefix count information\n")
9333{
9334 struct peer *peer;
9335
9336 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9337 if (! peer)
9338 return CMD_WARNING;
9339
9340 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9341}
9342
9343DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9344 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9345 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9346 SHOW_STR
9347 IP_STR
9348 BGP_STR
9349 "Address family\n"
9350 "Address Family modifier\n"
9351 "Address Family modifier\n"
9352 "Detailed information on TCP and BGP neighbor connections\n"
9353 "Neighbor to display information about\n"
9354 "Neighbor to display information about\n"
9355 "Display detailed prefix count information\n")
9356{
9357 struct peer *peer;
9358
9359 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9360 if (! peer)
9361 return CMD_WARNING;
9362
9363 if (strncmp (argv[0], "m", 1) == 0)
9364 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9365
9366 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9367}
9368
9369DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9370 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9371 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9372 SHOW_STR
9373 IP_STR
9374 BGP_STR
9375 "Address family\n"
9376 "Address Family modifier\n"
9377 "Address Family modifier\n"
9378 "Detailed information on TCP and BGP neighbor connections\n"
9379 "Neighbor to display information about\n"
9380 "Neighbor to display information about\n"
9381 "Display detailed prefix count information\n")
9382{
9383 struct peer *peer;
9384
9385 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9386 if (! peer)
9387 return CMD_WARNING;
9388
9389 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9390}
9391
9392
paul94f2b392005-06-28 12:44:16 +00009393static void
paul718e3742002-12-13 20:15:29 +00009394show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9395 int in)
9396{
9397 struct bgp_table *table;
9398 struct bgp_adj_in *ain;
9399 struct bgp_adj_out *adj;
9400 unsigned long output_count;
9401 struct bgp_node *rn;
9402 int header1 = 1;
9403 struct bgp *bgp;
9404 int header2 = 1;
9405
paulbb46e942003-10-24 19:02:03 +00009406 bgp = peer->bgp;
paul718e3742002-12-13 20:15:29 +00009407
9408 if (! bgp)
9409 return;
9410
9411 table = bgp->rib[afi][safi];
9412
9413 output_count = 0;
9414
9415 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9416 PEER_STATUS_DEFAULT_ORIGINATE))
9417 {
9418 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 +00009419 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9420 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009421
9422 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9423 VTY_NEWLINE, VTY_NEWLINE);
9424 header1 = 0;
9425 }
9426
9427 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9428 if (in)
9429 {
9430 for (ain = rn->adj_in; ain; ain = ain->next)
9431 if (ain->peer == peer)
9432 {
9433 if (header1)
9434 {
9435 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 +00009436 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9437 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009438 header1 = 0;
9439 }
9440 if (header2)
9441 {
9442 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9443 header2 = 0;
9444 }
9445 if (ain->attr)
9446 {
9447 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9448 output_count++;
9449 }
9450 }
9451 }
9452 else
9453 {
9454 for (adj = rn->adj_out; adj; adj = adj->next)
9455 if (adj->peer == peer)
9456 {
9457 if (header1)
9458 {
9459 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 +00009460 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9461 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00009462 header1 = 0;
9463 }
9464 if (header2)
9465 {
9466 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9467 header2 = 0;
9468 }
9469 if (adj->attr)
9470 {
9471 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9472 output_count++;
9473 }
9474 }
9475 }
9476
9477 if (output_count != 0)
9478 vty_out (vty, "%sTotal number of prefixes %ld%s",
9479 VTY_NEWLINE, output_count, VTY_NEWLINE);
9480}
9481
paul94f2b392005-06-28 12:44:16 +00009482static int
paulbb46e942003-10-24 19:02:03 +00009483peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9484{
paul718e3742002-12-13 20:15:29 +00009485 if (! peer || ! peer->afc[afi][safi])
9486 {
9487 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9488 return CMD_WARNING;
9489 }
9490
9491 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9492 {
9493 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9494 VTY_NEWLINE);
9495 return CMD_WARNING;
9496 }
9497
9498 show_adj_route (vty, peer, afi, safi, in);
9499
9500 return CMD_SUCCESS;
9501}
9502
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009503DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9504 show_ip_bgp_view_neighbor_advertised_route_cmd,
9505 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9506 SHOW_STR
9507 IP_STR
9508 BGP_STR
9509 "BGP view\n"
9510 "View name\n"
9511 "Detailed information on TCP and BGP neighbor connections\n"
9512 "Neighbor to display information about\n"
9513 "Neighbor to display information about\n"
9514 "Display the routes advertised to a BGP neighbor\n")
9515{
9516 struct peer *peer;
9517
9518 if (argc == 2)
9519 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9520 else
9521 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9522
9523 if (! peer)
9524 return CMD_WARNING;
9525
9526 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9527}
9528
9529ALIAS (show_ip_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009530 show_ip_bgp_neighbor_advertised_route_cmd,
9531 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9532 SHOW_STR
9533 IP_STR
9534 BGP_STR
9535 "Detailed information on TCP and BGP neighbor connections\n"
9536 "Neighbor to display information about\n"
9537 "Neighbor to display information about\n"
9538 "Display the routes advertised to a BGP neighbor\n")
paul718e3742002-12-13 20:15:29 +00009539
9540DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9541 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9542 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9543 SHOW_STR
9544 IP_STR
9545 BGP_STR
9546 "Address family\n"
9547 "Address Family modifier\n"
9548 "Address Family modifier\n"
9549 "Detailed information on TCP and BGP neighbor connections\n"
9550 "Neighbor to display information about\n"
9551 "Neighbor to display information about\n"
9552 "Display the routes advertised to a BGP neighbor\n")
9553{
paulbb46e942003-10-24 19:02:03 +00009554 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00009555
paulbb46e942003-10-24 19:02:03 +00009556 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9557 if (! peer)
9558 return CMD_WARNING;
9559
9560 if (strncmp (argv[0], "m", 1) == 0)
9561 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9562
9563 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
paul718e3742002-12-13 20:15:29 +00009564}
9565
9566#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +00009567DEFUN (show_bgp_view_neighbor_advertised_route,
9568 show_bgp_view_neighbor_advertised_route_cmd,
9569 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9570 SHOW_STR
9571 BGP_STR
9572 "BGP view\n"
9573 "View name\n"
9574 "Detailed information on TCP and BGP neighbor connections\n"
9575 "Neighbor to display information about\n"
9576 "Neighbor to display information about\n"
9577 "Display the routes advertised to a BGP neighbor\n")
9578{
9579 struct peer *peer;
9580
9581 if (argc == 2)
9582 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9583 else
9584 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9585
9586 if (! peer)
9587 return CMD_WARNING;
9588
9589 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9590}
9591
9592ALIAS (show_bgp_view_neighbor_advertised_route,
9593 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9594 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9595 SHOW_STR
9596 BGP_STR
9597 "BGP view\n"
9598 "View name\n"
9599 "Address family\n"
9600 "Detailed information on TCP and BGP neighbor connections\n"
9601 "Neighbor to display information about\n"
9602 "Neighbor to display information about\n"
9603 "Display the routes advertised to a BGP neighbor\n")
9604
9605DEFUN (show_bgp_view_neighbor_received_routes,
9606 show_bgp_view_neighbor_received_routes_cmd,
9607 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9608 SHOW_STR
9609 BGP_STR
9610 "BGP view\n"
9611 "View name\n"
9612 "Detailed information on TCP and BGP neighbor connections\n"
9613 "Neighbor to display information about\n"
9614 "Neighbor to display information about\n"
9615 "Display the received routes from neighbor\n")
9616{
9617 struct peer *peer;
9618
9619 if (argc == 2)
9620 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9621 else
9622 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9623
9624 if (! peer)
9625 return CMD_WARNING;
9626
9627 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
9628}
9629
9630ALIAS (show_bgp_view_neighbor_received_routes,
9631 show_bgp_view_ipv6_neighbor_received_routes_cmd,
9632 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9633 SHOW_STR
9634 BGP_STR
9635 "BGP view\n"
9636 "View name\n"
9637 "Address family\n"
9638 "Detailed information on TCP and BGP neighbor connections\n"
9639 "Neighbor to display information about\n"
9640 "Neighbor to display information about\n"
9641 "Display the received routes from neighbor\n")
9642
9643ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009644 show_bgp_neighbor_advertised_route_cmd,
9645 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9646 SHOW_STR
9647 BGP_STR
9648 "Detailed information on TCP and BGP neighbor connections\n"
9649 "Neighbor to display information about\n"
9650 "Neighbor to display information about\n"
9651 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +00009652
9653ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009654 show_bgp_ipv6_neighbor_advertised_route_cmd,
9655 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9656 SHOW_STR
9657 BGP_STR
9658 "Address family\n"
9659 "Detailed information on TCP and BGP neighbor connections\n"
9660 "Neighbor to display information about\n"
9661 "Neighbor to display information about\n"
9662 "Display the routes advertised to a BGP neighbor\n")
9663
9664/* old command */
paulbb46e942003-10-24 19:02:03 +00009665ALIAS (show_bgp_view_neighbor_advertised_route,
paul718e3742002-12-13 20:15:29 +00009666 ipv6_bgp_neighbor_advertised_route_cmd,
9667 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9668 SHOW_STR
9669 IPV6_STR
9670 BGP_STR
9671 "Detailed information on TCP and BGP neighbor connections\n"
9672 "Neighbor to display information about\n"
9673 "Neighbor to display information about\n"
9674 "Display the routes advertised to a BGP neighbor\n")
paulbb46e942003-10-24 19:02:03 +00009675
paul718e3742002-12-13 20:15:29 +00009676/* old command */
9677DEFUN (ipv6_mbgp_neighbor_advertised_route,
9678 ipv6_mbgp_neighbor_advertised_route_cmd,
9679 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9680 SHOW_STR
9681 IPV6_STR
9682 MBGP_STR
9683 "Detailed information on TCP and BGP neighbor connections\n"
9684 "Neighbor to display information about\n"
9685 "Neighbor to display information about\n"
9686 "Display the routes advertised to a BGP neighbor\n")
9687{
paulbb46e942003-10-24 19:02:03 +00009688 struct peer *peer;
9689
9690 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9691 if (! peer)
9692 return CMD_WARNING;
9693
9694 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
paul718e3742002-12-13 20:15:29 +00009695}
9696#endif /* HAVE_IPV6 */
9697
Tomasz Pala2a71e9c2009-06-24 21:36:50 +01009698DEFUN (show_ip_bgp_view_neighbor_received_routes,
9699 show_ip_bgp_view_neighbor_received_routes_cmd,
9700 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9701 SHOW_STR
9702 IP_STR
9703 BGP_STR
9704 "BGP view\n"
9705 "View name\n"
9706 "Detailed information on TCP and BGP neighbor connections\n"
9707 "Neighbor to display information about\n"
9708 "Neighbor to display information about\n"
9709 "Display the received routes from neighbor\n")
9710{
9711 struct peer *peer;
9712
9713 if (argc == 2)
9714 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9715 else
9716 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9717
9718 if (! peer)
9719 return CMD_WARNING;
9720
9721 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
9722}
9723
9724ALIAS (show_ip_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +00009725 show_ip_bgp_neighbor_received_routes_cmd,
9726 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9727 SHOW_STR
9728 IP_STR
9729 BGP_STR
9730 "Detailed information on TCP and BGP neighbor connections\n"
9731 "Neighbor to display information about\n"
9732 "Neighbor to display information about\n"
9733 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +00009734
9735DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
9736 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
9737 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
9738 SHOW_STR
9739 IP_STR
9740 BGP_STR
9741 "Address family\n"
9742 "Address Family modifier\n"
9743 "Address Family modifier\n"
9744 "Detailed information on TCP and BGP neighbor connections\n"
9745 "Neighbor to display information about\n"
9746 "Neighbor to display information about\n"
9747 "Display the received routes from neighbor\n")
9748{
paulbb46e942003-10-24 19:02:03 +00009749 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00009750
paulbb46e942003-10-24 19:02:03 +00009751 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9752 if (! peer)
9753 return CMD_WARNING;
9754
9755 if (strncmp (argv[0], "m", 1) == 0)
9756 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
9757
9758 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
paul718e3742002-12-13 20:15:29 +00009759}
9760
9761DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
9762 show_ip_bgp_neighbor_received_prefix_filter_cmd,
9763 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9764 SHOW_STR
9765 IP_STR
9766 BGP_STR
9767 "Detailed information on TCP and BGP neighbor connections\n"
9768 "Neighbor to display information about\n"
9769 "Neighbor to display information about\n"
9770 "Display information received from a BGP neighbor\n"
9771 "Display the prefixlist filter\n")
9772{
9773 char name[BUFSIZ];
9774 union sockunion *su;
9775 struct peer *peer;
9776 int count;
9777
9778 su = sockunion_str2su (argv[0]);
9779 if (su == NULL)
9780 return CMD_WARNING;
9781
9782 peer = peer_lookup (NULL, su);
9783 if (! peer)
9784 return CMD_WARNING;
9785
9786 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
9787 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9788 if (count)
9789 {
9790 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
9791 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9792 }
9793
9794 return CMD_SUCCESS;
9795}
9796
9797DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
9798 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
9799 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9800 SHOW_STR
9801 IP_STR
9802 BGP_STR
9803 "Address family\n"
9804 "Address Family modifier\n"
9805 "Address Family modifier\n"
9806 "Detailed information on TCP and BGP neighbor connections\n"
9807 "Neighbor to display information about\n"
9808 "Neighbor to display information about\n"
9809 "Display information received from a BGP neighbor\n"
9810 "Display the prefixlist filter\n")
9811{
9812 char name[BUFSIZ];
9813 union sockunion *su;
9814 struct peer *peer;
9815 int count;
9816
9817 su = sockunion_str2su (argv[1]);
9818 if (su == NULL)
9819 return CMD_WARNING;
9820
9821 peer = peer_lookup (NULL, su);
9822 if (! peer)
9823 return CMD_WARNING;
9824
9825 if (strncmp (argv[0], "m", 1) == 0)
9826 {
9827 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
9828 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9829 if (count)
9830 {
9831 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
9832 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9833 }
9834 }
9835 else
9836 {
9837 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
9838 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9839 if (count)
9840 {
9841 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
9842 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9843 }
9844 }
9845
9846 return CMD_SUCCESS;
9847}
9848
9849
9850#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +00009851ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +00009852 show_bgp_neighbor_received_routes_cmd,
9853 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9854 SHOW_STR
9855 BGP_STR
9856 "Detailed information on TCP and BGP neighbor connections\n"
9857 "Neighbor to display information about\n"
9858 "Neighbor to display information about\n"
9859 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +00009860
paulbb46e942003-10-24 19:02:03 +00009861ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +00009862 show_bgp_ipv6_neighbor_received_routes_cmd,
9863 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9864 SHOW_STR
9865 BGP_STR
9866 "Address family\n"
9867 "Detailed information on TCP and BGP neighbor connections\n"
9868 "Neighbor to display information about\n"
9869 "Neighbor to display information about\n"
9870 "Display the received routes from neighbor\n")
9871
9872DEFUN (show_bgp_neighbor_received_prefix_filter,
9873 show_bgp_neighbor_received_prefix_filter_cmd,
9874 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9875 SHOW_STR
9876 BGP_STR
9877 "Detailed information on TCP and BGP neighbor connections\n"
9878 "Neighbor to display information about\n"
9879 "Neighbor to display information about\n"
9880 "Display information received from a BGP neighbor\n"
9881 "Display the prefixlist filter\n")
9882{
9883 char name[BUFSIZ];
9884 union sockunion *su;
9885 struct peer *peer;
9886 int count;
9887
9888 su = sockunion_str2su (argv[0]);
9889 if (su == NULL)
9890 return CMD_WARNING;
9891
9892 peer = peer_lookup (NULL, su);
9893 if (! peer)
9894 return CMD_WARNING;
9895
9896 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
9897 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
9898 if (count)
9899 {
9900 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
9901 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
9902 }
9903
9904 return CMD_SUCCESS;
9905}
9906
9907ALIAS (show_bgp_neighbor_received_prefix_filter,
9908 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
9909 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9910 SHOW_STR
9911 BGP_STR
9912 "Address family\n"
9913 "Detailed information on TCP and BGP neighbor connections\n"
9914 "Neighbor to display information about\n"
9915 "Neighbor to display information about\n"
9916 "Display information received from a BGP neighbor\n"
9917 "Display the prefixlist filter\n")
9918
9919/* old command */
paulbb46e942003-10-24 19:02:03 +00009920ALIAS (show_bgp_view_neighbor_received_routes,
paul718e3742002-12-13 20:15:29 +00009921 ipv6_bgp_neighbor_received_routes_cmd,
9922 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9923 SHOW_STR
9924 IPV6_STR
9925 BGP_STR
9926 "Detailed information on TCP and BGP neighbor connections\n"
9927 "Neighbor to display information about\n"
9928 "Neighbor to display information about\n"
9929 "Display the received routes from neighbor\n")
paul718e3742002-12-13 20:15:29 +00009930
9931/* old command */
9932DEFUN (ipv6_mbgp_neighbor_received_routes,
9933 ipv6_mbgp_neighbor_received_routes_cmd,
9934 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9935 SHOW_STR
9936 IPV6_STR
9937 MBGP_STR
9938 "Detailed information on TCP and BGP neighbor connections\n"
9939 "Neighbor to display information about\n"
9940 "Neighbor to display information about\n"
9941 "Display the received routes from neighbor\n")
9942{
paulbb46e942003-10-24 19:02:03 +00009943 struct peer *peer;
9944
9945 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9946 if (! peer)
9947 return CMD_WARNING;
9948
9949 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
paul718e3742002-12-13 20:15:29 +00009950}
paulbb46e942003-10-24 19:02:03 +00009951
9952DEFUN (show_bgp_view_neighbor_received_prefix_filter,
9953 show_bgp_view_neighbor_received_prefix_filter_cmd,
9954 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9955 SHOW_STR
9956 BGP_STR
9957 "BGP view\n"
9958 "View name\n"
9959 "Detailed information on TCP and BGP neighbor connections\n"
9960 "Neighbor to display information about\n"
9961 "Neighbor to display information about\n"
9962 "Display information received from a BGP neighbor\n"
9963 "Display the prefixlist filter\n")
9964{
9965 char name[BUFSIZ];
9966 union sockunion *su;
9967 struct peer *peer;
9968 struct bgp *bgp;
9969 int count;
9970
9971 /* BGP structure lookup. */
9972 bgp = bgp_lookup_by_name (argv[0]);
9973 if (bgp == NULL)
9974 {
9975 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
9976 return CMD_WARNING;
9977 }
9978
9979 su = sockunion_str2su (argv[1]);
9980 if (su == NULL)
9981 return CMD_WARNING;
9982
9983 peer = peer_lookup (bgp, su);
9984 if (! peer)
9985 return CMD_WARNING;
9986
9987 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
9988 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
9989 if (count)
9990 {
9991 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
9992 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
9993 }
9994
9995 return CMD_SUCCESS;
9996}
9997
9998ALIAS (show_bgp_view_neighbor_received_prefix_filter,
9999 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10000 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10001 SHOW_STR
10002 BGP_STR
10003 "BGP view\n"
10004 "View name\n"
10005 "Address family\n"
10006 "Detailed information on TCP and BGP neighbor connections\n"
10007 "Neighbor to display information about\n"
10008 "Neighbor to display information about\n"
10009 "Display information received from a BGP neighbor\n"
10010 "Display the prefixlist filter\n")
paul718e3742002-12-13 20:15:29 +000010011#endif /* HAVE_IPV6 */
10012
paul94f2b392005-06-28 12:44:16 +000010013static int
paulbb46e942003-10-24 19:02:03 +000010014bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
paul718e3742002-12-13 20:15:29 +000010015 safi_t safi, enum bgp_show_type type)
10016{
paul718e3742002-12-13 20:15:29 +000010017 if (! peer || ! peer->afc[afi][safi])
10018 {
10019 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +000010020 return CMD_WARNING;
10021 }
10022
ajs5a646652004-11-05 01:25:55 +000010023 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
paul718e3742002-12-13 20:15:29 +000010024}
10025
10026DEFUN (show_ip_bgp_neighbor_routes,
10027 show_ip_bgp_neighbor_routes_cmd,
10028 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10029 SHOW_STR
10030 IP_STR
10031 BGP_STR
10032 "Detailed information on TCP and BGP neighbor connections\n"
10033 "Neighbor to display information about\n"
10034 "Neighbor to display information about\n"
10035 "Display routes learned from neighbor\n")
10036{
paulbb46e942003-10-24 19:02:03 +000010037 struct peer *peer;
10038
10039 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10040 if (! peer)
10041 return CMD_WARNING;
10042
10043 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010044 bgp_show_type_neighbor);
10045}
10046
10047DEFUN (show_ip_bgp_neighbor_flap,
10048 show_ip_bgp_neighbor_flap_cmd,
10049 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10050 SHOW_STR
10051 IP_STR
10052 BGP_STR
10053 "Detailed information on TCP and BGP neighbor connections\n"
10054 "Neighbor to display information about\n"
10055 "Neighbor to display information about\n"
10056 "Display flap statistics of the routes learned from neighbor\n")
10057{
paulbb46e942003-10-24 19:02:03 +000010058 struct peer *peer;
10059
10060 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10061 if (! peer)
10062 return CMD_WARNING;
10063
10064 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010065 bgp_show_type_flap_neighbor);
10066}
10067
10068DEFUN (show_ip_bgp_neighbor_damp,
10069 show_ip_bgp_neighbor_damp_cmd,
10070 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10071 SHOW_STR
10072 IP_STR
10073 BGP_STR
10074 "Detailed information on TCP and BGP neighbor connections\n"
10075 "Neighbor to display information about\n"
10076 "Neighbor to display information about\n"
10077 "Display the dampened routes received from neighbor\n")
10078{
paulbb46e942003-10-24 19:02:03 +000010079 struct peer *peer;
10080
10081 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10082 if (! peer)
10083 return CMD_WARNING;
10084
10085 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010086 bgp_show_type_damp_neighbor);
10087}
10088
10089DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10090 show_ip_bgp_ipv4_neighbor_routes_cmd,
10091 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10092 SHOW_STR
10093 IP_STR
10094 BGP_STR
10095 "Address family\n"
10096 "Address Family modifier\n"
10097 "Address Family modifier\n"
10098 "Detailed information on TCP and BGP neighbor connections\n"
10099 "Neighbor to display information about\n"
10100 "Neighbor to display information about\n"
10101 "Display routes learned from neighbor\n")
10102{
paulbb46e942003-10-24 19:02:03 +000010103 struct peer *peer;
10104
10105 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10106 if (! peer)
10107 return CMD_WARNING;
10108
paul718e3742002-12-13 20:15:29 +000010109 if (strncmp (argv[0], "m", 1) == 0)
paulbb46e942003-10-24 19:02:03 +000010110 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000010111 bgp_show_type_neighbor);
10112
paulbb46e942003-10-24 19:02:03 +000010113 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
paul718e3742002-12-13 20:15:29 +000010114 bgp_show_type_neighbor);
10115}
paulbb46e942003-10-24 19:02:03 +000010116
paulfee0f4c2004-09-13 05:12:46 +000010117DEFUN (show_ip_bgp_view_rsclient,
10118 show_ip_bgp_view_rsclient_cmd,
10119 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10120 SHOW_STR
10121 IP_STR
10122 BGP_STR
10123 "BGP view\n"
10124 "BGP view name\n"
10125 "Information about Route Server Client\n"
10126 NEIGHBOR_ADDR_STR)
10127{
10128 struct bgp_table *table;
10129 struct peer *peer;
10130
10131 if (argc == 2)
10132 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10133 else
10134 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10135
10136 if (! peer)
10137 return CMD_WARNING;
10138
10139 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10140 {
10141 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10142 VTY_NEWLINE);
10143 return CMD_WARNING;
10144 }
10145
10146 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10147 PEER_FLAG_RSERVER_CLIENT))
10148 {
10149 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10150 VTY_NEWLINE);
10151 return CMD_WARNING;
10152 }
10153
10154 table = peer->rib[AFI_IP][SAFI_UNICAST];
10155
ajs5a646652004-11-05 01:25:55 +000010156 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000010157}
10158
10159ALIAS (show_ip_bgp_view_rsclient,
10160 show_ip_bgp_rsclient_cmd,
10161 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10162 SHOW_STR
10163 IP_STR
10164 BGP_STR
10165 "Information about Route Server Client\n"
10166 NEIGHBOR_ADDR_STR)
10167
10168DEFUN (show_ip_bgp_view_rsclient_route,
10169 show_ip_bgp_view_rsclient_route_cmd,
Michael Lamberta8bf6f52008-09-24 17:23:11 +010010170 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
paulfee0f4c2004-09-13 05:12:46 +000010171 SHOW_STR
10172 IP_STR
10173 BGP_STR
10174 "BGP view\n"
10175 "BGP view name\n"
10176 "Information about Route Server Client\n"
10177 NEIGHBOR_ADDR_STR
10178 "Network in the BGP routing table to display\n")
10179{
10180 struct bgp *bgp;
10181 struct peer *peer;
10182
10183 /* BGP structure lookup. */
10184 if (argc == 3)
10185 {
10186 bgp = bgp_lookup_by_name (argv[0]);
10187 if (bgp == NULL)
10188 {
10189 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10190 return CMD_WARNING;
10191 }
10192 }
10193 else
10194 {
10195 bgp = bgp_get_default ();
10196 if (bgp == NULL)
10197 {
10198 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10199 return CMD_WARNING;
10200 }
10201 }
10202
10203 if (argc == 3)
10204 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10205 else
10206 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10207
10208 if (! peer)
10209 return CMD_WARNING;
10210
10211 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10212 {
10213 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10214 VTY_NEWLINE);
10215 return CMD_WARNING;
10216}
10217
10218 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10219 PEER_FLAG_RSERVER_CLIENT))
10220 {
10221 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10222 VTY_NEWLINE);
10223 return CMD_WARNING;
10224 }
10225
10226 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10227 (argc == 3) ? argv[2] : argv[1],
10228 AFI_IP, SAFI_UNICAST, NULL, 0);
10229}
10230
10231ALIAS (show_ip_bgp_view_rsclient_route,
10232 show_ip_bgp_rsclient_route_cmd,
10233 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10234 SHOW_STR
10235 IP_STR
10236 BGP_STR
10237 "Information about Route Server Client\n"
10238 NEIGHBOR_ADDR_STR
10239 "Network in the BGP routing table to display\n")
10240
10241DEFUN (show_ip_bgp_view_rsclient_prefix,
10242 show_ip_bgp_view_rsclient_prefix_cmd,
10243 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10244 SHOW_STR
10245 IP_STR
10246 BGP_STR
10247 "BGP view\n"
10248 "BGP view name\n"
10249 "Information about Route Server Client\n"
10250 NEIGHBOR_ADDR_STR
10251 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10252{
10253 struct bgp *bgp;
10254 struct peer *peer;
10255
10256 /* BGP structure lookup. */
10257 if (argc == 3)
10258 {
10259 bgp = bgp_lookup_by_name (argv[0]);
10260 if (bgp == NULL)
10261 {
10262 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10263 return CMD_WARNING;
10264 }
10265 }
10266 else
10267 {
10268 bgp = bgp_get_default ();
10269 if (bgp == NULL)
10270 {
10271 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10272 return CMD_WARNING;
10273 }
10274 }
10275
10276 if (argc == 3)
10277 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10278 else
10279 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10280
10281 if (! peer)
10282 return CMD_WARNING;
10283
10284 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10285 {
10286 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10287 VTY_NEWLINE);
10288 return CMD_WARNING;
10289}
10290
10291 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10292 PEER_FLAG_RSERVER_CLIENT))
10293{
10294 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10295 VTY_NEWLINE);
10296 return CMD_WARNING;
10297 }
10298
10299 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10300 (argc == 3) ? argv[2] : argv[1],
10301 AFI_IP, SAFI_UNICAST, NULL, 1);
10302}
10303
10304ALIAS (show_ip_bgp_view_rsclient_prefix,
10305 show_ip_bgp_rsclient_prefix_cmd,
10306 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10307 SHOW_STR
10308 IP_STR
10309 BGP_STR
10310 "Information about Route Server Client\n"
10311 NEIGHBOR_ADDR_STR
10312 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10313
10314
paul718e3742002-12-13 20:15:29 +000010315#ifdef HAVE_IPV6
paulbb46e942003-10-24 19:02:03 +000010316DEFUN (show_bgp_view_neighbor_routes,
10317 show_bgp_view_neighbor_routes_cmd,
10318 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10319 SHOW_STR
10320 BGP_STR
10321 "BGP view\n"
10322 "BGP view name\n"
10323 "Detailed information on TCP and BGP neighbor connections\n"
10324 "Neighbor to display information about\n"
10325 "Neighbor to display information about\n"
10326 "Display routes learned from neighbor\n")
10327{
10328 struct peer *peer;
10329
10330 if (argc == 2)
10331 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10332 else
10333 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10334
10335 if (! peer)
10336 return CMD_WARNING;
10337
10338 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10339 bgp_show_type_neighbor);
10340}
10341
10342ALIAS (show_bgp_view_neighbor_routes,
10343 show_bgp_view_ipv6_neighbor_routes_cmd,
10344 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10345 SHOW_STR
10346 BGP_STR
10347 "BGP view\n"
10348 "BGP view name\n"
10349 "Address family\n"
10350 "Detailed information on TCP and BGP neighbor connections\n"
10351 "Neighbor to display information about\n"
10352 "Neighbor to display information about\n"
10353 "Display routes learned from neighbor\n")
10354
10355DEFUN (show_bgp_view_neighbor_damp,
10356 show_bgp_view_neighbor_damp_cmd,
10357 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10358 SHOW_STR
10359 BGP_STR
10360 "BGP view\n"
10361 "BGP view name\n"
10362 "Detailed information on TCP and BGP neighbor connections\n"
10363 "Neighbor to display information about\n"
10364 "Neighbor to display information about\n"
10365 "Display the dampened routes received from neighbor\n")
10366{
10367 struct peer *peer;
10368
10369 if (argc == 2)
10370 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10371 else
10372 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10373
10374 if (! peer)
10375 return CMD_WARNING;
10376
10377 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10378 bgp_show_type_damp_neighbor);
10379}
10380
10381ALIAS (show_bgp_view_neighbor_damp,
10382 show_bgp_view_ipv6_neighbor_damp_cmd,
10383 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10384 SHOW_STR
10385 BGP_STR
10386 "BGP view\n"
10387 "BGP view name\n"
10388 "Address family\n"
10389 "Detailed information on TCP and BGP neighbor connections\n"
10390 "Neighbor to display information about\n"
10391 "Neighbor to display information about\n"
10392 "Display the dampened routes received from neighbor\n")
10393
10394DEFUN (show_bgp_view_neighbor_flap,
10395 show_bgp_view_neighbor_flap_cmd,
10396 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10397 SHOW_STR
10398 BGP_STR
10399 "BGP view\n"
10400 "BGP view name\n"
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{
10406 struct peer *peer;
10407
10408 if (argc == 2)
10409 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10410 else
10411 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10412
10413 if (! peer)
10414 return CMD_WARNING;
10415
10416 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10417 bgp_show_type_flap_neighbor);
10418}
10419
10420ALIAS (show_bgp_view_neighbor_flap,
10421 show_bgp_view_ipv6_neighbor_flap_cmd,
10422 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10423 SHOW_STR
10424 BGP_STR
10425 "BGP view\n"
10426 "BGP view name\n"
10427 "Address family\n"
10428 "Detailed information on TCP and BGP neighbor connections\n"
10429 "Neighbor to display information about\n"
10430 "Neighbor to display information about\n"
10431 "Display flap statistics of the routes learned from neighbor\n")
10432
10433ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000010434 show_bgp_neighbor_routes_cmd,
10435 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
10436 SHOW_STR
10437 BGP_STR
10438 "Detailed information on TCP and BGP neighbor connections\n"
10439 "Neighbor to display information about\n"
10440 "Neighbor to display information about\n"
10441 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010442
paulbb46e942003-10-24 19:02:03 +000010443
10444ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000010445 show_bgp_ipv6_neighbor_routes_cmd,
10446 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10447 SHOW_STR
10448 BGP_STR
10449 "Address family\n"
10450 "Detailed information on TCP and BGP neighbor connections\n"
10451 "Neighbor to display information about\n"
10452 "Neighbor to display information about\n"
10453 "Display routes learned from neighbor\n")
10454
10455/* old command */
paulbb46e942003-10-24 19:02:03 +000010456ALIAS (show_bgp_view_neighbor_routes,
paul718e3742002-12-13 20:15:29 +000010457 ipv6_bgp_neighbor_routes_cmd,
10458 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
10459 SHOW_STR
10460 IPV6_STR
10461 BGP_STR
10462 "Detailed information on TCP and BGP neighbor connections\n"
10463 "Neighbor to display information about\n"
10464 "Neighbor to display information about\n"
10465 "Display routes learned from neighbor\n")
paul718e3742002-12-13 20:15:29 +000010466
10467/* old command */
10468DEFUN (ipv6_mbgp_neighbor_routes,
10469 ipv6_mbgp_neighbor_routes_cmd,
10470 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
10471 SHOW_STR
10472 IPV6_STR
10473 MBGP_STR
10474 "Detailed information on TCP and BGP neighbor connections\n"
10475 "Neighbor to display information about\n"
10476 "Neighbor to display information about\n"
10477 "Display routes learned from neighbor\n")
10478{
paulbb46e942003-10-24 19:02:03 +000010479 struct peer *peer;
10480
10481 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10482 if (! peer)
10483 return CMD_WARNING;
10484
10485 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
paul718e3742002-12-13 20:15:29 +000010486 bgp_show_type_neighbor);
10487}
paulbb46e942003-10-24 19:02:03 +000010488
10489ALIAS (show_bgp_view_neighbor_flap,
10490 show_bgp_neighbor_flap_cmd,
10491 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10492 SHOW_STR
10493 BGP_STR
10494 "Detailed information on TCP and BGP neighbor connections\n"
10495 "Neighbor to display information about\n"
10496 "Neighbor to display information about\n"
10497 "Display flap statistics of the routes learned from neighbor\n")
10498
10499ALIAS (show_bgp_view_neighbor_flap,
10500 show_bgp_ipv6_neighbor_flap_cmd,
10501 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10502 SHOW_STR
10503 BGP_STR
10504 "Address family\n"
10505 "Detailed information on TCP and BGP neighbor connections\n"
10506 "Neighbor to display information about\n"
10507 "Neighbor to display information about\n"
10508 "Display flap statistics of the routes learned from neighbor\n")
10509
10510ALIAS (show_bgp_view_neighbor_damp,
10511 show_bgp_neighbor_damp_cmd,
10512 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10513 SHOW_STR
10514 BGP_STR
10515 "Detailed information on TCP and BGP neighbor connections\n"
10516 "Neighbor to display information about\n"
10517 "Neighbor to display information about\n"
10518 "Display the dampened routes received from neighbor\n")
10519
10520ALIAS (show_bgp_view_neighbor_damp,
10521 show_bgp_ipv6_neighbor_damp_cmd,
10522 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10523 SHOW_STR
10524 BGP_STR
10525 "Address family\n"
10526 "Detailed information on TCP and BGP neighbor connections\n"
10527 "Neighbor to display information about\n"
10528 "Neighbor to display information about\n"
paulc001ae62003-11-03 12:37:43 +000010529 "Display the dampened routes received from neighbor\n")
paulfee0f4c2004-09-13 05:12:46 +000010530
10531DEFUN (show_bgp_view_rsclient,
10532 show_bgp_view_rsclient_cmd,
10533 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10534 SHOW_STR
10535 BGP_STR
10536 "BGP view\n"
10537 "BGP view name\n"
10538 "Information about Route Server Client\n"
10539 NEIGHBOR_ADDR_STR)
10540{
10541 struct bgp_table *table;
10542 struct peer *peer;
10543
10544 if (argc == 2)
10545 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10546 else
10547 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10548
10549 if (! peer)
10550 return CMD_WARNING;
10551
10552 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10553 {
10554 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10555 VTY_NEWLINE);
10556 return CMD_WARNING;
10557 }
10558
10559 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10560 PEER_FLAG_RSERVER_CLIENT))
10561 {
10562 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10563 VTY_NEWLINE);
10564 return CMD_WARNING;
10565 }
10566
10567 table = peer->rib[AFI_IP6][SAFI_UNICAST];
10568
ajs5a646652004-11-05 01:25:55 +000010569 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
paulfee0f4c2004-09-13 05:12:46 +000010570}
10571
10572ALIAS (show_bgp_view_rsclient,
10573 show_bgp_rsclient_cmd,
10574 "show bgp rsclient (A.B.C.D|X:X::X:X)",
10575 SHOW_STR
10576 BGP_STR
10577 "Information about Route Server Client\n"
10578 NEIGHBOR_ADDR_STR)
10579
10580DEFUN (show_bgp_view_rsclient_route,
10581 show_bgp_view_rsclient_route_cmd,
10582 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10583 SHOW_STR
10584 BGP_STR
10585 "BGP view\n"
10586 "BGP view name\n"
10587 "Information about Route Server Client\n"
10588 NEIGHBOR_ADDR_STR
10589 "Network in the BGP routing table to display\n")
10590{
10591 struct bgp *bgp;
10592 struct peer *peer;
10593
10594 /* BGP structure lookup. */
10595 if (argc == 3)
10596 {
10597 bgp = bgp_lookup_by_name (argv[0]);
10598 if (bgp == NULL)
10599 {
10600 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10601 return CMD_WARNING;
10602 }
10603 }
10604 else
10605 {
10606 bgp = bgp_get_default ();
10607 if (bgp == NULL)
10608 {
10609 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10610 return CMD_WARNING;
10611 }
10612 }
10613
10614 if (argc == 3)
10615 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10616 else
10617 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10618
10619 if (! peer)
10620 return CMD_WARNING;
10621
10622 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10623 {
10624 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10625 VTY_NEWLINE);
10626 return CMD_WARNING;
10627 }
10628
10629 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10630 PEER_FLAG_RSERVER_CLIENT))
10631 {
10632 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10633 VTY_NEWLINE);
10634 return CMD_WARNING;
10635 }
10636
10637 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10638 (argc == 3) ? argv[2] : argv[1],
10639 AFI_IP6, SAFI_UNICAST, NULL, 0);
10640}
10641
10642ALIAS (show_bgp_view_rsclient_route,
10643 show_bgp_rsclient_route_cmd,
10644 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10645 SHOW_STR
10646 BGP_STR
10647 "Information about Route Server Client\n"
10648 NEIGHBOR_ADDR_STR
10649 "Network in the BGP routing table to display\n")
10650
10651DEFUN (show_bgp_view_rsclient_prefix,
10652 show_bgp_view_rsclient_prefix_cmd,
10653 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10654 SHOW_STR
10655 BGP_STR
10656 "BGP view\n"
10657 "BGP view name\n"
10658 "Information about Route Server Client\n"
10659 NEIGHBOR_ADDR_STR
10660 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10661{
10662 struct bgp *bgp;
10663 struct peer *peer;
10664
10665 /* BGP structure lookup. */
10666 if (argc == 3)
10667 {
10668 bgp = bgp_lookup_by_name (argv[0]);
10669 if (bgp == NULL)
10670 {
10671 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10672 return CMD_WARNING;
10673 }
10674 }
10675 else
10676 {
10677 bgp = bgp_get_default ();
10678 if (bgp == NULL)
10679 {
10680 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10681 return CMD_WARNING;
10682 }
10683 }
10684
10685 if (argc == 3)
10686 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10687 else
10688 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10689
10690 if (! peer)
10691 return CMD_WARNING;
10692
10693 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10694 {
10695 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10696 VTY_NEWLINE);
10697 return CMD_WARNING;
10698 }
10699
10700 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10701 PEER_FLAG_RSERVER_CLIENT))
10702 {
10703 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10704 VTY_NEWLINE);
10705 return CMD_WARNING;
10706 }
10707
10708 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10709 (argc == 3) ? argv[2] : argv[1],
10710 AFI_IP6, SAFI_UNICAST, NULL, 1);
10711}
10712
10713ALIAS (show_bgp_view_rsclient_prefix,
10714 show_bgp_rsclient_prefix_cmd,
10715 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10716 SHOW_STR
10717 BGP_STR
10718 "Information about Route Server Client\n"
10719 NEIGHBOR_ADDR_STR
10720 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10721
paul718e3742002-12-13 20:15:29 +000010722#endif /* HAVE_IPV6 */
10723
10724struct bgp_table *bgp_distance_table;
10725
10726struct bgp_distance
10727{
10728 /* Distance value for the IP source prefix. */
10729 u_char distance;
10730
10731 /* Name of the access-list to be matched. */
10732 char *access_list;
10733};
10734
paul94f2b392005-06-28 12:44:16 +000010735static struct bgp_distance *
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080010736bgp_distance_new (void)
paul718e3742002-12-13 20:15:29 +000010737{
Stephen Hemminger393deb92008-08-18 14:13:29 -070010738 return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
paul718e3742002-12-13 20:15:29 +000010739}
10740
paul94f2b392005-06-28 12:44:16 +000010741static void
paul718e3742002-12-13 20:15:29 +000010742bgp_distance_free (struct bgp_distance *bdistance)
10743{
10744 XFREE (MTYPE_BGP_DISTANCE, bdistance);
10745}
10746
paul94f2b392005-06-28 12:44:16 +000010747static int
paulfd79ac92004-10-13 05:06:08 +000010748bgp_distance_set (struct vty *vty, const char *distance_str,
10749 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000010750{
10751 int ret;
10752 struct prefix_ipv4 p;
10753 u_char distance;
10754 struct bgp_node *rn;
10755 struct bgp_distance *bdistance;
10756
10757 ret = str2prefix_ipv4 (ip_str, &p);
10758 if (ret == 0)
10759 {
10760 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
10761 return CMD_WARNING;
10762 }
10763
10764 distance = atoi (distance_str);
10765
10766 /* Get BGP distance node. */
10767 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
10768 if (rn->info)
10769 {
10770 bdistance = rn->info;
10771 bgp_unlock_node (rn);
10772 }
10773 else
10774 {
10775 bdistance = bgp_distance_new ();
10776 rn->info = bdistance;
10777 }
10778
10779 /* Set distance value. */
10780 bdistance->distance = distance;
10781
10782 /* Reset access-list configuration. */
10783 if (bdistance->access_list)
10784 {
10785 free (bdistance->access_list);
10786 bdistance->access_list = NULL;
10787 }
10788 if (access_list_str)
10789 bdistance->access_list = strdup (access_list_str);
10790
10791 return CMD_SUCCESS;
10792}
10793
paul94f2b392005-06-28 12:44:16 +000010794static int
paulfd79ac92004-10-13 05:06:08 +000010795bgp_distance_unset (struct vty *vty, const char *distance_str,
10796 const char *ip_str, const char *access_list_str)
paul718e3742002-12-13 20:15:29 +000010797{
10798 int ret;
10799 struct prefix_ipv4 p;
10800 u_char distance;
10801 struct bgp_node *rn;
10802 struct bgp_distance *bdistance;
10803
10804 ret = str2prefix_ipv4 (ip_str, &p);
10805 if (ret == 0)
10806 {
10807 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
10808 return CMD_WARNING;
10809 }
10810
10811 distance = atoi (distance_str);
10812
10813 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
10814 if (! rn)
10815 {
10816 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
10817 return CMD_WARNING;
10818 }
10819
10820 bdistance = rn->info;
10821
10822 if (bdistance->access_list)
10823 free (bdistance->access_list);
10824 bgp_distance_free (bdistance);
10825
10826 rn->info = NULL;
10827 bgp_unlock_node (rn);
10828 bgp_unlock_node (rn);
10829
10830 return CMD_SUCCESS;
10831}
10832
paul718e3742002-12-13 20:15:29 +000010833/* Apply BGP information to distance method. */
10834u_char
10835bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
10836{
10837 struct bgp_node *rn;
10838 struct prefix_ipv4 q;
10839 struct peer *peer;
10840 struct bgp_distance *bdistance;
10841 struct access_list *alist;
10842 struct bgp_static *bgp_static;
10843
10844 if (! bgp)
10845 return 0;
10846
10847 if (p->family != AF_INET)
10848 return 0;
10849
10850 peer = rinfo->peer;
10851
10852 if (peer->su.sa.sa_family != AF_INET)
10853 return 0;
10854
10855 memset (&q, 0, sizeof (struct prefix_ipv4));
10856 q.family = AF_INET;
10857 q.prefix = peer->su.sin.sin_addr;
10858 q.prefixlen = IPV4_MAX_BITLEN;
10859
10860 /* Check source address. */
10861 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
10862 if (rn)
10863 {
10864 bdistance = rn->info;
10865 bgp_unlock_node (rn);
10866
10867 if (bdistance->access_list)
10868 {
10869 alist = access_list_lookup (AFI_IP, bdistance->access_list);
10870 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
10871 return bdistance->distance;
10872 }
10873 else
10874 return bdistance->distance;
10875 }
10876
10877 /* Backdoor check. */
10878 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
10879 if (rn)
10880 {
10881 bgp_static = rn->info;
10882 bgp_unlock_node (rn);
10883
10884 if (bgp_static->backdoor)
10885 {
10886 if (bgp->distance_local)
10887 return bgp->distance_local;
10888 else
10889 return ZEBRA_IBGP_DISTANCE_DEFAULT;
10890 }
10891 }
10892
10893 if (peer_sort (peer) == BGP_PEER_EBGP)
10894 {
10895 if (bgp->distance_ebgp)
10896 return bgp->distance_ebgp;
10897 return ZEBRA_EBGP_DISTANCE_DEFAULT;
10898 }
10899 else
10900 {
10901 if (bgp->distance_ibgp)
10902 return bgp->distance_ibgp;
10903 return ZEBRA_IBGP_DISTANCE_DEFAULT;
10904 }
10905}
10906
10907DEFUN (bgp_distance,
10908 bgp_distance_cmd,
10909 "distance bgp <1-255> <1-255> <1-255>",
10910 "Define an administrative distance\n"
10911 "BGP distance\n"
10912 "Distance for routes external to the AS\n"
10913 "Distance for routes internal to the AS\n"
10914 "Distance for local routes\n")
10915{
10916 struct bgp *bgp;
10917
10918 bgp = vty->index;
10919
10920 bgp->distance_ebgp = atoi (argv[0]);
10921 bgp->distance_ibgp = atoi (argv[1]);
10922 bgp->distance_local = atoi (argv[2]);
10923 return CMD_SUCCESS;
10924}
10925
10926DEFUN (no_bgp_distance,
10927 no_bgp_distance_cmd,
10928 "no distance bgp <1-255> <1-255> <1-255>",
10929 NO_STR
10930 "Define an administrative distance\n"
10931 "BGP distance\n"
10932 "Distance for routes external to the AS\n"
10933 "Distance for routes internal to the AS\n"
10934 "Distance for local routes\n")
10935{
10936 struct bgp *bgp;
10937
10938 bgp = vty->index;
10939
10940 bgp->distance_ebgp= 0;
10941 bgp->distance_ibgp = 0;
10942 bgp->distance_local = 0;
10943 return CMD_SUCCESS;
10944}
10945
10946ALIAS (no_bgp_distance,
10947 no_bgp_distance2_cmd,
10948 "no distance bgp",
10949 NO_STR
10950 "Define an administrative distance\n"
10951 "BGP distance\n")
10952
10953DEFUN (bgp_distance_source,
10954 bgp_distance_source_cmd,
10955 "distance <1-255> A.B.C.D/M",
10956 "Define an administrative distance\n"
10957 "Administrative distance\n"
10958 "IP source prefix\n")
10959{
10960 bgp_distance_set (vty, argv[0], argv[1], NULL);
10961 return CMD_SUCCESS;
10962}
10963
10964DEFUN (no_bgp_distance_source,
10965 no_bgp_distance_source_cmd,
10966 "no distance <1-255> A.B.C.D/M",
10967 NO_STR
10968 "Define an administrative distance\n"
10969 "Administrative distance\n"
10970 "IP source prefix\n")
10971{
10972 bgp_distance_unset (vty, argv[0], argv[1], NULL);
10973 return CMD_SUCCESS;
10974}
10975
10976DEFUN (bgp_distance_source_access_list,
10977 bgp_distance_source_access_list_cmd,
10978 "distance <1-255> A.B.C.D/M WORD",
10979 "Define an administrative distance\n"
10980 "Administrative distance\n"
10981 "IP source prefix\n"
10982 "Access list name\n")
10983{
10984 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
10985 return CMD_SUCCESS;
10986}
10987
10988DEFUN (no_bgp_distance_source_access_list,
10989 no_bgp_distance_source_access_list_cmd,
10990 "no distance <1-255> A.B.C.D/M WORD",
10991 NO_STR
10992 "Define an administrative distance\n"
10993 "Administrative distance\n"
10994 "IP source prefix\n"
10995 "Access list name\n")
10996{
10997 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
10998 return CMD_SUCCESS;
10999}
11000
11001DEFUN (bgp_damp_set,
11002 bgp_damp_set_cmd,
11003 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11004 "BGP Specific commands\n"
11005 "Enable route-flap dampening\n"
11006 "Half-life time for the penalty\n"
11007 "Value to start reusing a route\n"
11008 "Value to start suppressing a route\n"
11009 "Maximum duration to suppress a stable route\n")
11010{
11011 struct bgp *bgp;
11012 int half = DEFAULT_HALF_LIFE * 60;
11013 int reuse = DEFAULT_REUSE;
11014 int suppress = DEFAULT_SUPPRESS;
11015 int max = 4 * half;
11016
11017 if (argc == 4)
11018 {
11019 half = atoi (argv[0]) * 60;
11020 reuse = atoi (argv[1]);
11021 suppress = atoi (argv[2]);
11022 max = atoi (argv[3]) * 60;
11023 }
11024 else if (argc == 1)
11025 {
11026 half = atoi (argv[0]) * 60;
11027 max = 4 * half;
11028 }
11029
11030 bgp = vty->index;
11031 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11032 half, reuse, suppress, max);
11033}
11034
11035ALIAS (bgp_damp_set,
11036 bgp_damp_set2_cmd,
11037 "bgp dampening <1-45>",
11038 "BGP Specific commands\n"
11039 "Enable route-flap dampening\n"
11040 "Half-life time for the penalty\n")
11041
11042ALIAS (bgp_damp_set,
11043 bgp_damp_set3_cmd,
11044 "bgp dampening",
11045 "BGP Specific commands\n"
11046 "Enable route-flap dampening\n")
11047
11048DEFUN (bgp_damp_unset,
11049 bgp_damp_unset_cmd,
11050 "no bgp dampening",
11051 NO_STR
11052 "BGP Specific commands\n"
11053 "Enable route-flap dampening\n")
11054{
11055 struct bgp *bgp;
11056
11057 bgp = vty->index;
11058 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11059}
11060
11061ALIAS (bgp_damp_unset,
11062 bgp_damp_unset2_cmd,
11063 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11064 NO_STR
11065 "BGP Specific commands\n"
11066 "Enable route-flap dampening\n"
11067 "Half-life time for the penalty\n"
11068 "Value to start reusing a route\n"
11069 "Value to start suppressing a route\n"
11070 "Maximum duration to suppress a stable route\n")
11071
11072DEFUN (show_ip_bgp_dampened_paths,
11073 show_ip_bgp_dampened_paths_cmd,
11074 "show ip bgp dampened-paths",
11075 SHOW_STR
11076 IP_STR
11077 BGP_STR
11078 "Display paths suppressed due to dampening\n")
11079{
ajs5a646652004-11-05 01:25:55 +000011080 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11081 NULL);
paul718e3742002-12-13 20:15:29 +000011082}
11083
11084DEFUN (show_ip_bgp_flap_statistics,
11085 show_ip_bgp_flap_statistics_cmd,
11086 "show ip bgp flap-statistics",
11087 SHOW_STR
11088 IP_STR
11089 BGP_STR
11090 "Display flap statistics of routes\n")
11091{
ajs5a646652004-11-05 01:25:55 +000011092 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11093 bgp_show_type_flap_statistics, NULL);
paul718e3742002-12-13 20:15:29 +000011094}
11095
11096/* Display specified route of BGP table. */
paul94f2b392005-06-28 12:44:16 +000011097static int
paulfd79ac92004-10-13 05:06:08 +000011098bgp_clear_damp_route (struct vty *vty, const char *view_name,
11099 const char *ip_str, afi_t afi, safi_t safi,
11100 struct prefix_rd *prd, int prefix_check)
paul718e3742002-12-13 20:15:29 +000011101{
11102 int ret;
11103 struct prefix match;
11104 struct bgp_node *rn;
11105 struct bgp_node *rm;
11106 struct bgp_info *ri;
11107 struct bgp_info *ri_temp;
11108 struct bgp *bgp;
11109 struct bgp_table *table;
11110
11111 /* BGP structure lookup. */
11112 if (view_name)
11113 {
11114 bgp = bgp_lookup_by_name (view_name);
11115 if (bgp == NULL)
11116 {
11117 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11118 return CMD_WARNING;
11119 }
11120 }
11121 else
11122 {
11123 bgp = bgp_get_default ();
11124 if (bgp == NULL)
11125 {
11126 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11127 return CMD_WARNING;
11128 }
11129 }
11130
11131 /* Check IP address argument. */
11132 ret = str2prefix (ip_str, &match);
11133 if (! ret)
11134 {
11135 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
11136 return CMD_WARNING;
11137 }
11138
11139 match.family = afi2family (afi);
11140
11141 if (safi == SAFI_MPLS_VPN)
11142 {
11143 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
11144 {
11145 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
11146 continue;
11147
11148 if ((table = rn->info) != NULL)
11149 if ((rm = bgp_node_match (table, &match)) != NULL)
11150 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
11151 {
11152 ri = rm->info;
11153 while (ri)
11154 {
Paul Jakmafb982c22007-05-04 20:15:47 +000011155 if (ri->extra && ri->extra->damp_info)
paul718e3742002-12-13 20:15:29 +000011156 {
11157 ri_temp = ri->next;
Paul Jakmafb982c22007-05-04 20:15:47 +000011158 bgp_damp_info_free (ri->extra->damp_info, 1);
paul718e3742002-12-13 20:15:29 +000011159 ri = ri_temp;
11160 }
11161 else
11162 ri = ri->next;
11163 }
11164 }
11165 }
11166 }
11167 else
11168 {
11169 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
11170 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
11171 {
11172 ri = rn->info;
11173 while (ri)
11174 {
Paul Jakmafb982c22007-05-04 20:15:47 +000011175 if (ri->extra && ri->extra->damp_info)
paul718e3742002-12-13 20:15:29 +000011176 {
11177 ri_temp = ri->next;
Paul Jakmafb982c22007-05-04 20:15:47 +000011178 bgp_damp_info_free (ri->extra->damp_info, 1);
paul718e3742002-12-13 20:15:29 +000011179 ri = ri_temp;
11180 }
11181 else
11182 ri = ri->next;
11183 }
11184 }
11185 }
11186
11187 return CMD_SUCCESS;
11188}
11189
11190DEFUN (clear_ip_bgp_dampening,
11191 clear_ip_bgp_dampening_cmd,
11192 "clear ip bgp dampening",
11193 CLEAR_STR
11194 IP_STR
11195 BGP_STR
11196 "Clear route flap dampening information\n")
11197{
11198 bgp_damp_info_clean ();
11199 return CMD_SUCCESS;
11200}
11201
11202DEFUN (clear_ip_bgp_dampening_prefix,
11203 clear_ip_bgp_dampening_prefix_cmd,
11204 "clear ip bgp dampening A.B.C.D/M",
11205 CLEAR_STR
11206 IP_STR
11207 BGP_STR
11208 "Clear route flap dampening information\n"
11209 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11210{
11211 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11212 SAFI_UNICAST, NULL, 1);
11213}
11214
11215DEFUN (clear_ip_bgp_dampening_address,
11216 clear_ip_bgp_dampening_address_cmd,
11217 "clear ip bgp dampening A.B.C.D",
11218 CLEAR_STR
11219 IP_STR
11220 BGP_STR
11221 "Clear route flap dampening information\n"
11222 "Network to clear damping information\n")
11223{
11224 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11225 SAFI_UNICAST, NULL, 0);
11226}
11227
11228DEFUN (clear_ip_bgp_dampening_address_mask,
11229 clear_ip_bgp_dampening_address_mask_cmd,
11230 "clear ip bgp dampening A.B.C.D A.B.C.D",
11231 CLEAR_STR
11232 IP_STR
11233 BGP_STR
11234 "Clear route flap dampening information\n"
11235 "Network to clear damping information\n"
11236 "Network mask\n")
11237{
11238 int ret;
11239 char prefix_str[BUFSIZ];
11240
11241 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
11242 if (! ret)
11243 {
11244 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
11245 return CMD_WARNING;
11246 }
11247
11248 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
11249 SAFI_UNICAST, NULL, 0);
11250}
11251
paul94f2b392005-06-28 12:44:16 +000011252static int
paul718e3742002-12-13 20:15:29 +000011253bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
11254 afi_t afi, safi_t safi, int *write)
11255{
11256 struct bgp_node *prn;
11257 struct bgp_node *rn;
11258 struct bgp_table *table;
11259 struct prefix *p;
11260 struct prefix_rd *prd;
11261 struct bgp_static *bgp_static;
11262 u_int32_t label;
11263 char buf[SU_ADDRSTRLEN];
11264 char rdbuf[RD_ADDRSTRLEN];
11265
11266 /* Network configuration. */
11267 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
11268 if ((table = prn->info) != NULL)
11269 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
11270 if ((bgp_static = rn->info) != NULL)
11271 {
11272 p = &rn->p;
11273 prd = (struct prefix_rd *) &prn->p;
11274
11275 /* "address-family" display. */
11276 bgp_config_write_family_header (vty, afi, safi, write);
11277
11278 /* "network" configuration display. */
11279 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
11280 label = decode_label (bgp_static->tag);
11281
11282 vty_out (vty, " network %s/%d rd %s tag %d",
11283 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11284 p->prefixlen,
11285 rdbuf, label);
11286 vty_out (vty, "%s", VTY_NEWLINE);
11287 }
11288 return 0;
11289}
11290
11291/* Configuration of static route announcement and aggregate
11292 information. */
11293int
11294bgp_config_write_network (struct vty *vty, struct bgp *bgp,
11295 afi_t afi, safi_t safi, int *write)
11296{
11297 struct bgp_node *rn;
11298 struct prefix *p;
11299 struct bgp_static *bgp_static;
11300 struct bgp_aggregate *bgp_aggregate;
11301 char buf[SU_ADDRSTRLEN];
11302
11303 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
11304 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
11305
11306 /* Network configuration. */
11307 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
11308 if ((bgp_static = rn->info) != NULL)
11309 {
11310 p = &rn->p;
11311
11312 /* "address-family" display. */
11313 bgp_config_write_family_header (vty, afi, safi, write);
11314
11315 /* "network" configuration display. */
11316 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11317 {
11318 u_int32_t destination;
11319 struct in_addr netmask;
11320
11321 destination = ntohl (p->u.prefix4.s_addr);
11322 masklen2ip (p->prefixlen, &netmask);
11323 vty_out (vty, " network %s",
11324 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
11325
11326 if ((IN_CLASSC (destination) && p->prefixlen == 24)
11327 || (IN_CLASSB (destination) && p->prefixlen == 16)
11328 || (IN_CLASSA (destination) && p->prefixlen == 8)
11329 || p->u.prefix4.s_addr == 0)
11330 {
11331 /* Natural mask is not display. */
11332 }
11333 else
11334 vty_out (vty, " mask %s", inet_ntoa (netmask));
11335 }
11336 else
11337 {
11338 vty_out (vty, " network %s/%d",
11339 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11340 p->prefixlen);
11341 }
11342
11343 if (bgp_static->rmap.name)
11344 vty_out (vty, " route-map %s", bgp_static->rmap.name);
Paul Jakma41367172007-08-06 15:24:51 +000011345 else
11346 {
11347 if (bgp_static->backdoor)
11348 vty_out (vty, " backdoor");
Paul Jakma41367172007-08-06 15:24:51 +000011349 }
paul718e3742002-12-13 20:15:29 +000011350
11351 vty_out (vty, "%s", VTY_NEWLINE);
11352 }
11353
11354 /* Aggregate-address configuration. */
11355 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
11356 if ((bgp_aggregate = rn->info) != NULL)
11357 {
11358 p = &rn->p;
11359
11360 /* "address-family" display. */
11361 bgp_config_write_family_header (vty, afi, safi, write);
11362
11363 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11364 {
11365 struct in_addr netmask;
11366
11367 masklen2ip (p->prefixlen, &netmask);
11368 vty_out (vty, " aggregate-address %s %s",
11369 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11370 inet_ntoa (netmask));
11371 }
11372 else
11373 {
11374 vty_out (vty, " aggregate-address %s/%d",
11375 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11376 p->prefixlen);
11377 }
11378
11379 if (bgp_aggregate->as_set)
11380 vty_out (vty, " as-set");
11381
11382 if (bgp_aggregate->summary_only)
11383 vty_out (vty, " summary-only");
11384
11385 vty_out (vty, "%s", VTY_NEWLINE);
11386 }
11387
11388 return 0;
11389}
11390
11391int
11392bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
11393{
11394 struct bgp_node *rn;
11395 struct bgp_distance *bdistance;
11396
11397 /* Distance configuration. */
11398 if (bgp->distance_ebgp
11399 && bgp->distance_ibgp
11400 && bgp->distance_local
11401 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
11402 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
11403 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
11404 vty_out (vty, " distance bgp %d %d %d%s",
11405 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
11406 VTY_NEWLINE);
11407
11408 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
11409 if ((bdistance = rn->info) != NULL)
11410 {
11411 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
11412 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
11413 bdistance->access_list ? bdistance->access_list : "",
11414 VTY_NEWLINE);
11415 }
11416
11417 return 0;
11418}
11419
11420/* Allocate routing table structure and install commands. */
11421void
Stephen Hemminger66e5cd82009-02-09 10:14:16 -080011422bgp_route_init (void)
paul718e3742002-12-13 20:15:29 +000011423{
11424 /* Init BGP distance table. */
Paul Jakma64e580a2006-02-21 01:09:01 +000011425 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
paul718e3742002-12-13 20:15:29 +000011426
11427 /* IPv4 BGP commands. */
11428 install_element (BGP_NODE, &bgp_network_cmd);
11429 install_element (BGP_NODE, &bgp_network_mask_cmd);
11430 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
11431 install_element (BGP_NODE, &bgp_network_route_map_cmd);
11432 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
11433 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
11434 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
11435 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
11436 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
11437 install_element (BGP_NODE, &no_bgp_network_cmd);
11438 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
11439 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
11440 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
11441 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
11442 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11443 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
11444 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
11445 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
11446
11447 install_element (BGP_NODE, &aggregate_address_cmd);
11448 install_element (BGP_NODE, &aggregate_address_mask_cmd);
11449 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
11450 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
11451 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
11452 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
11453 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
11454 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
11455 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
11456 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
11457 install_element (BGP_NODE, &no_aggregate_address_cmd);
11458 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
11459 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
11460 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
11461 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
11462 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
11463 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
11464 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
11465 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11466 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11467
11468 /* IPv4 unicast configuration. */
11469 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
11470 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
11471 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
11472 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
11473 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
11474 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
Paul Jakmae70e5752011-07-05 00:41:59 +040011475 install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
paul718e3742002-12-13 20:15:29 +000011476 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
11477 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
11478 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
11479 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
11480 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
Paul Jakmae70e5752011-07-05 00:41:59 +040011481
paul718e3742002-12-13 20:15:29 +000011482 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
11483 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
11484 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
11485 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
11486 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
11487 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
11488 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
11489 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
11490 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
11491 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
11492 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
11493 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
11494 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
11495 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
11496 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
11497 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
11498 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
11499 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
11500 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11501 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11502
11503 /* IPv4 multicast configuration. */
11504 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
11505 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
11506 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
11507 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
11508 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
11509 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
11510 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
11511 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
11512 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
11513 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
11514 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
11515 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11516 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
11517 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
11518 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
11519 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
11520 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
11521 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
11522 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
11523 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
11524 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
11525 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
11526 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
11527 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
11528 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
11529 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
11530 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
11531 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
11532 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
11533 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
11534 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11535 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11536
11537 install_element (VIEW_NODE, &show_ip_bgp_cmd);
11538 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
11539 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
11540 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
11541 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11542 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11543 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
11544 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11545 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11546 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11547 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
11548 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
11549 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
11550 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
11551 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11552 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
11553 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11554 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
11555 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11556 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
11557 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11558 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
11559 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11560 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
11561 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11562 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
11563 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
11564 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
11565 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
11566 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
11567 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
11568 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
11569 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
11570 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
11571 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
11572 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
11573 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
11574 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11575 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11576 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11577 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11578 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
11579 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11580 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
11581 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11582 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
11583 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11584 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11585 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11586 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11587 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11588 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
11589 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11590 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11591 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11592 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
11593 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
11594 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
11595 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
11596 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11597 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
11598 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
11599 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11600 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11601 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
11602 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
11603 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011604 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
11605 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
11606 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010011607 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
11608 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011609 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
11610 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11611 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010011612
11613 /* Restricted node: VIEW_NODE - (set of dangerous commands) */
11614 install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
11615 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
11616 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11617 install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
11618 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11619 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11620 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11621 install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
11622 install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
11623 install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
11624 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
11625 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
11626 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
11627 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
11628 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
11629 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
11630 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
11631 install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
11632 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
11633 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
11634 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
11635 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11636 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11637 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11638 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11639 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
11640 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11641 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11642 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000011643
11644 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
11645 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
11646 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
11647 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
11648 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11649 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11650 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
11651 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11652 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11653 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11654 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
11655 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
11656 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
11657 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
11658 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11659 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
11660 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11661 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
11662 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11663 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
11664 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11665 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
11666 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11667 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
11668 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11669 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
11670 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
11671 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
11672 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
11673 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
11674 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
11675 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
11676 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
11677 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
11678 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
11679 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
11680 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
11681 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11682 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11683 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11684 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11685 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
11686 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11687 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
11688 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11689 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
11690 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11691 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11692 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11693 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11694 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11695 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
11696 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11697 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11698 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11699 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
11700 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
11701 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
11702 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
11703 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11704 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
11705 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
11706 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11707 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11708 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
11709 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
11710 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011711 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
11712 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
11713 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
Tomasz Pala2a71e9c2009-06-24 21:36:50 +010011714 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
11715 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011716 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
11717 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11718 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000011719
11720 /* BGP dampening clear commands */
11721 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
11722 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
11723 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
11724 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
11725
Paul Jakmaff7924f2006-09-04 01:10:36 +000011726 /* prefix count */
11727 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
11728 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
11729 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
paul718e3742002-12-13 20:15:29 +000011730#ifdef HAVE_IPV6
Paul Jakmaff7924f2006-09-04 01:10:36 +000011731 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
11732
paul718e3742002-12-13 20:15:29 +000011733 /* New config IPv6 BGP commands. */
11734 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
11735 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
11736 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
11737 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
11738
11739 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
11740 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
11741 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
11742 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
11743
11744 /* Old config IPv6 BGP commands. */
11745 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
11746 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
11747
11748 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
11749 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
11750 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
11751 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
11752
11753 install_element (VIEW_NODE, &show_bgp_cmd);
11754 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
11755 install_element (VIEW_NODE, &show_bgp_route_cmd);
11756 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
11757 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
11758 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
11759 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
11760 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
11761 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
11762 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
11763 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
11764 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
11765 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
11766 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
11767 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
11768 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
11769 install_element (VIEW_NODE, &show_bgp_community_cmd);
11770 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
11771 install_element (VIEW_NODE, &show_bgp_community2_cmd);
11772 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
11773 install_element (VIEW_NODE, &show_bgp_community3_cmd);
11774 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
11775 install_element (VIEW_NODE, &show_bgp_community4_cmd);
11776 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
11777 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
11778 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
11779 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
11780 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
11781 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
11782 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
11783 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
11784 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
11785 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
11786 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
11787 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
11788 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
11789 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
11790 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
11791 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
11792 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
11793 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
11794 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
11795 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
11796 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
11797 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
11798 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000011799 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
11800 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
11801 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
11802 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011803 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
11804 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
11805 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000011806 install_element (VIEW_NODE, &show_bgp_view_cmd);
11807 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
11808 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
11809 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
11810 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
11811 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
11812 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
11813 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
11814 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
11815 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
11816 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
11817 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
11818 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
11819 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
11820 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
11821 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
11822 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
11823 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011824 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
11825 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
11826 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
Paul Jakma62687ff2008-08-23 14:27:06 +010011827
11828 /* Restricted:
11829 * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
11830 */
11831 install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
11832 install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
11833 install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
11834 install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
11835 install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
11836 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
11837 install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
11838 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
11839 install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
11840 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
11841 install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
11842 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
11843 install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
11844 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
11845 install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
11846 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
11847 install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
11848 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
11849 install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
11850 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
11851 install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
11852 install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
11853 install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
11854 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
11855 install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
11856 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
11857 install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
11858 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
11859 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
11860 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
paul718e3742002-12-13 20:15:29 +000011861
11862 install_element (ENABLE_NODE, &show_bgp_cmd);
11863 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
11864 install_element (ENABLE_NODE, &show_bgp_route_cmd);
11865 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
11866 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
11867 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
11868 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
11869 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
11870 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
11871 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
11872 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
11873 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
11874 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
11875 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
11876 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
11877 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
11878 install_element (ENABLE_NODE, &show_bgp_community_cmd);
11879 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
11880 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
11881 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
11882 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
11883 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
11884 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
11885 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
11886 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
11887 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
11888 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
11889 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
11890 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
11891 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
11892 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
11893 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
11894 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
11895 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
11896 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
11897 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
11898 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
11899 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
11900 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
11901 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
11902 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
11903 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
11904 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
11905 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
11906 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
11907 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
paulbb46e942003-10-24 19:02:03 +000011908 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
11909 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
11910 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
11911 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011912 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
11913 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
11914 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
paulbb46e942003-10-24 19:02:03 +000011915 install_element (ENABLE_NODE, &show_bgp_view_cmd);
11916 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
11917 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
11918 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
11919 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
11920 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
11921 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
11922 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
11923 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
11924 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
11925 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
11926 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
11927 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
11928 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
11929 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
11930 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
11931 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
11932 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
paulfee0f4c2004-09-13 05:12:46 +000011933 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
11934 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
11935 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
Paul Jakma2815e612006-09-14 02:56:07 +000011936
11937 /* Statistics */
11938 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
11939 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
11940 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
11941 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
11942
paul718e3742002-12-13 20:15:29 +000011943 /* old command */
11944 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
11945 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
11946 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
11947 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
11948 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
11949 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
11950 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
11951 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
11952 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
11953 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
11954 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
11955 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
11956 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
11957 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
11958 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
11959 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
11960 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
11961 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
11962 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
11963 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
11964 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
11965 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
11966 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
11967 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
11968 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
11969 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
11970 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
11971 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
11972 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
11973 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
11974 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
11975 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
11976 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
11977 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
11978 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
11979 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
paulbb46e942003-10-24 19:02:03 +000011980
paul718e3742002-12-13 20:15:29 +000011981 /* old command */
11982 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
11983 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
11984 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
11985 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
11986 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
11987 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
11988 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
11989 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
11990 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
11991 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
11992 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
11993 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
11994 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
11995 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
11996 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
11997 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
11998 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
11999 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12000 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12001 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12002 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12003 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12004 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12005 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12006 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12007 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12008 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12009 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12010 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12011 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12012 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12013 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12014 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12015 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12016 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12017 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12018
12019 /* old command */
12020 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12021 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12022 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12023 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12024
12025 /* old command */
12026 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12027 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12028 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12029 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12030
12031 /* old command */
12032 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12033 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12034 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12035 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12036#endif /* HAVE_IPV6 */
12037
12038 install_element (BGP_NODE, &bgp_distance_cmd);
12039 install_element (BGP_NODE, &no_bgp_distance_cmd);
12040 install_element (BGP_NODE, &no_bgp_distance2_cmd);
12041 install_element (BGP_NODE, &bgp_distance_source_cmd);
12042 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12043 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12044 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12045
12046 install_element (BGP_NODE, &bgp_damp_set_cmd);
12047 install_element (BGP_NODE, &bgp_damp_set2_cmd);
12048 install_element (BGP_NODE, &bgp_damp_set3_cmd);
12049 install_element (BGP_NODE, &bgp_damp_unset_cmd);
12050 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12051 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
12052 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
12053 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
12054 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
12055 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
Paul Jakmae70e5752011-07-05 00:41:59 +040012056
12057 /* Deprecated AS-Pathlimit commands */
12058 install_element (BGP_NODE, &bgp_network_ttl_cmd);
12059 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
12060 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
12061 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
12062 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12063 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12064
12065 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
12066 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
12067 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12068 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
12069 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12070 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12071
12072 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
12073 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
12074 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
12075 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
12076 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12077 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12078
12079 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
12080 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
12081 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12082 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
12083 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12084 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12085
12086 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
12087 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
12088 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
12089 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
12090 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12091 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12092
12093 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
12094 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
12095 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12096 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
12097 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12098 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12099
12100 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
12101 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
paul718e3742002-12-13 20:15:29 +000012102}
Chris Caputo228da422009-07-18 05:44:03 +000012103
12104void
12105bgp_route_finish (void)
12106{
12107 bgp_table_unlock (bgp_distance_table);
12108 bgp_distance_table = NULL;
12109}