build: Add QuaggaId to README.NetBSD
[jleu-quagga.git] / bgpd / bgp_route.c
bloba92ca4e2bca99781d549c70d75eb6f47349c1ea4
1 /* BGP routing information
2 Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 #include <zebra.h>
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"
36 #include "workqueue.h"
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"
56 #include "bgpd/bgp_vty.h"
58 /* Extern from bgp_dump.c */
59 extern const char *bgp_origin_str[];
60 extern const char *bgp_origin_long_str[];
62 static struct bgp_node *
63 bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
64 struct prefix_rd *prd)
66 struct bgp_node *rn;
67 struct bgp_node *prn = NULL;
69 assert (table);
70 if (!table)
71 return NULL;
73 if (safi == SAFI_MPLS_VPN)
75 prn = bgp_node_get (table, (struct prefix *) prd);
77 if (prn->info == NULL)
78 prn->info = bgp_table_init (afi, safi);
79 else
80 bgp_unlock_node (prn);
81 table = prn->info;
84 rn = bgp_node_get (table, p);
86 if (safi == SAFI_MPLS_VPN)
87 rn->prn = prn;
89 return rn;
92 /* Allocate bgp_info_extra */
93 static struct bgp_info_extra *
94 bgp_info_extra_new (void)
96 struct bgp_info_extra *new;
97 new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
98 return new;
101 static void
102 bgp_info_extra_free (struct bgp_info_extra **extra)
104 if (extra && *extra)
106 if ((*extra)->damp_info)
107 bgp_damp_info_free ((*extra)->damp_info, 0);
109 (*extra)->damp_info = NULL;
111 XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
113 *extra = NULL;
117 /* Get bgp_info extra information for the given bgp_info, lazy allocated
118 * if required.
120 struct bgp_info_extra *
121 bgp_info_extra_get (struct bgp_info *ri)
123 if (!ri->extra)
124 ri->extra = bgp_info_extra_new();
125 return ri->extra;
128 /* Allocate new bgp info structure. */
129 static struct bgp_info *
130 bgp_info_new (void)
132 return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
135 /* Free bgp route information. */
136 static void
137 bgp_info_free (struct bgp_info *binfo)
139 if (binfo->attr)
140 bgp_attr_unintern (binfo->attr);
142 bgp_info_extra_free (&binfo->extra);
144 peer_unlock (binfo->peer); /* bgp_info peer reference */
146 XFREE (MTYPE_BGP_ROUTE, binfo);
149 struct bgp_info *
150 bgp_info_lock (struct bgp_info *binfo)
152 binfo->lock++;
153 return binfo;
156 struct bgp_info *
157 bgp_info_unlock (struct bgp_info *binfo)
159 assert (binfo && binfo->lock > 0);
160 binfo->lock--;
162 if (binfo->lock == 0)
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;
172 #if 0
173 if (binfo->lock == 1)
175 zlog_debug ("%s: unlocked to 1", __func__);
176 zlog_backtrace (LOG_DEBUG);
178 #endif
180 return binfo;
183 void
184 bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
186 struct bgp_info *top;
188 top = rn->info;
190 ri->next = rn->info;
191 ri->prev = NULL;
192 if (top)
193 top->prev = ri;
194 rn->info = ri;
196 bgp_info_lock (ri);
197 bgp_lock_node (rn);
198 peer_lock (ri->peer); /* bgp_info peer reference */
201 /* Do the actual removal of info from RIB, for use by bgp_process
202 completion callback *only* */
203 static void
204 bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
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;
213 bgp_info_unlock (ri);
214 bgp_unlock_node (rn);
217 void
218 bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
220 bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
221 /* set of previous already took care of pcount */
222 UNSET_FLAG (ri->flags, BGP_INFO_VALID);
225 /* 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 */
228 static void
229 bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
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);
236 /* Adjust pcount as required */
237 static void
238 bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
240 assert (rn && rn->table);
241 assert (ri && ri->peer && ri->peer->bgp);
243 /* Ignore 'pcount' for RS-client tables */
244 if (rn->table->type != BGP_TABLE_MAIN
245 || ri->peer == ri->peer->bgp->peer_self)
246 return;
248 if (BGP_INFO_HOLDDOWN (ri)
249 && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
252 UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
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
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__);
265 else if (!BGP_INFO_HOLDDOWN (ri)
266 && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
268 SET_FLAG (ri->flags, BGP_INFO_COUNTED);
269 ri->peer->pcount[rn->table->afi][rn->table->safi]++;
274 /* Set/unset bgp_info flags, adjusting any other state as needed.
275 * This is here primarily to keep prefix-count in check.
277 void
278 bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
280 SET_FLAG (ri->flags, flag);
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;
286 bgp_pcount_adjust (rn, ri);
289 void
290 bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
292 UNSET_FLAG (ri->flags, flag);
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;
298 bgp_pcount_adjust (rn, ri);
301 /* Get MED value. If MED value is missing and "bgp bestpath
302 missing-as-worst" is specified, treat it as the worst value. */
303 static u_int32_t
304 bgp_med_value (struct attr *attr, struct bgp *bgp)
306 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
307 return attr->med;
308 else
310 if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
311 return BGP_MED_MAX;
312 else
313 return 0;
317 /* Compare two bgp route entity. br is preferable then return 1. */
318 static int
319 bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
321 u_int32_t new_pref;
322 u_int32_t exist_pref;
323 u_int32_t new_med;
324 u_int32_t exist_med;
325 u_int32_t new_weight = 0;
326 u_int32_t exist_weight = 0;
327 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;
335 /* 0. Null check. */
336 if (new == NULL)
337 return 0;
338 if (exist == NULL)
339 return 1;
341 /* 1. Weight check. */
342 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)
347 return 1;
348 if (new_weight < exist_weight)
349 return 0;
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;
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;
362 if (new_pref > exist_pref)
363 return 1;
364 if (new_pref < exist_pref)
365 return 0;
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;
373 if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
374 return 1;
375 if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
376 return 0;
378 if (new->sub_type == BGP_ROUTE_AGGREGATE)
379 return 1;
380 if (exist->sub_type == BGP_ROUTE_AGGREGATE)
381 return 0;
383 /* 4. AS path length check. */
384 if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
386 int exist_hops = aspath_count_hops (exist->attr->aspath);
387 int exist_confeds = aspath_count_confeds (exist->attr->aspath);
389 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
391 int aspath_hops;
393 aspath_hops = aspath_count_hops (new->attr->aspath);
394 aspath_hops += aspath_count_confeds (new->attr->aspath);
396 if ( aspath_hops < (exist_hops + exist_confeds))
397 return 1;
398 if ( aspath_hops > (exist_hops + exist_confeds))
399 return 0;
401 else
403 int newhops = aspath_count_hops (new->attr->aspath);
405 if (newhops < exist_hops)
406 return 1;
407 if (newhops > exist_hops)
408 return 0;
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;
418 /* 6. MED check. */
419 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);
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)
433 new_med = bgp_med_value (new->attr, bgp);
434 exist_med = bgp_med_value (exist->attr, bgp);
436 if (new_med < exist_med)
437 return 1;
438 if (new_med > exist_med)
439 return 0;
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;
456 /* 8. IGP metric check. */
457 if (new->extra || exist->extra)
459 uint32_t newm = (new->extra ? new->extra->igpmetric : 0);
460 uint32_t existm = (exist->extra ? exist->extra->igpmetric : 0);
462 if (newm < existm)
463 return 1;
464 if (newm > existm)
465 return 0;
468 /* 9. Maximum path check. */
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)
478 if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
479 return 1;
480 if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
481 return 0;
484 /* 11. Rourter-ID comparision. */
485 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
486 new_id.s_addr = new->attr->extra->originator_id.s_addr;
487 else
488 new_id.s_addr = new->peer->remote_id.s_addr;
489 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
490 exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
491 else
492 exist_id.s_addr = exist->peer->remote_id.s_addr;
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;
499 /* 12. Cluster length comparision. */
500 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
501 new_cluster = new->attr->extra->cluster->length;
502 else
503 new_cluster = 0;
504 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
505 exist_cluster = exist->attr->extra->cluster->length;
506 else
507 exist_cluster = 0;
509 if (new_cluster < exist_cluster)
510 return 1;
511 if (new_cluster > exist_cluster)
512 return 0;
514 /* 13. Neighbor address comparision. */
515 ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
517 if (ret == 1)
518 return 0;
519 if (ret == -1)
520 return 1;
522 return 1;
525 static enum filter_type
526 bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
527 afi_t afi, safi_t safi)
529 struct bgp_filter *filter;
531 filter = &peer->filter[afi][safi];
533 #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));
539 if (DISTRIBUTE_IN_NAME (filter)) {
540 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
542 if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
543 return FILTER_DENY;
546 if (PREFIX_LIST_IN_NAME (filter)) {
547 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
549 if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
550 return FILTER_DENY;
553 if (FILTER_LIST_IN_NAME (filter)) {
554 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
556 if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
557 return FILTER_DENY;
560 return FILTER_PERMIT;
561 #undef FILTER_EXIST_WARN
564 static enum filter_type
565 bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
566 afi_t afi, safi_t safi)
568 struct bgp_filter *filter;
570 filter = &peer->filter[afi][safi];
572 #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));
578 if (DISTRIBUTE_OUT_NAME (filter)) {
579 FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
581 if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
582 return FILTER_DENY;
585 if (PREFIX_LIST_OUT_NAME (filter)) {
586 FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
588 if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
589 return FILTER_DENY;
592 if (FILTER_LIST_OUT_NAME (filter)) {
593 FILTER_EXIST_WARN(FILTER_LIST, as, filter);
595 if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
596 return FILTER_DENY;
599 return FILTER_PERMIT;
600 #undef FILTER_EXIST_WARN
603 /* If community attribute includes no_export then return 1. */
604 static int
605 bgp_community_filter (struct peer *peer, struct attr *attr)
607 if (attr->community)
609 /* NO_ADVERTISE check. */
610 if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
611 return 1;
613 /* NO_EXPORT check. */
614 if (peer_sort (peer) == BGP_PEER_EBGP &&
615 community_include (attr->community, COMMUNITY_NO_EXPORT))
616 return 1;
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;
624 return 0;
627 /* Route reflection loop check. */
628 static int
629 bgp_cluster_filter (struct peer *peer, struct attr *attr)
631 struct in_addr cluster_id;
633 if (attr->extra && attr->extra->cluster)
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;
640 if (cluster_loop_check (attr->extra->cluster, cluster_id))
641 return 1;
643 return 0;
646 static int
647 bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
648 afi_t afi, safi_t safi)
650 struct bgp_filter *filter;
651 struct bgp_info info;
652 route_map_result_t ret;
654 filter = &peer->filter[afi][safi];
656 /* Apply default weight value. */
657 if (peer->weight)
658 (bgp_attr_extra_get (attr))->weight = peer->weight;
660 /* Route map apply. */
661 if (ROUTE_MAP_IN_NAME (filter))
663 /* Duplicate current value to new strucutre for modification. */
664 info.peer = peer;
665 info.attr = attr;
667 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
669 /* Apply BGP route map to the attribute. */
670 ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
672 peer->rmap_type = 0;
674 if (ret == RMAP_DENYMATCH)
676 /* Free newly generated AS path and community by route-map. */
677 bgp_attr_flush (attr);
678 return RMAP_DENY;
681 return RMAP_PERMIT;
684 static int
685 bgp_export_modifier (struct peer *rsclient, struct peer *peer,
686 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
688 struct bgp_filter *filter;
689 struct bgp_info info;
690 route_map_result_t ret;
692 filter = &peer->filter[afi][safi];
694 /* Route map apply. */
695 if (ROUTE_MAP_EXPORT_NAME (filter))
697 /* Duplicate current value to new strucutre for modification. */
698 info.peer = rsclient;
699 info.attr = attr;
701 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
703 /* Apply BGP route map to the attribute. */
704 ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
706 rsclient->rmap_type = 0;
708 if (ret == RMAP_DENYMATCH)
710 /* Free newly generated AS path and community by route-map. */
711 bgp_attr_flush (attr);
712 return RMAP_DENY;
715 return RMAP_PERMIT;
718 static int
719 bgp_import_modifier (struct peer *rsclient, struct peer *peer,
720 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
722 struct bgp_filter *filter;
723 struct bgp_info info;
724 route_map_result_t ret;
726 filter = &rsclient->filter[afi][safi];
728 /* Apply default weight value. */
729 if (peer->weight)
730 (bgp_attr_extra_get (attr))->weight = peer->weight;
732 /* Route map apply. */
733 if (ROUTE_MAP_IMPORT_NAME (filter))
735 /* Duplicate current value to new strucutre for modification. */
736 info.peer = peer;
737 info.attr = attr;
739 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
741 /* Apply BGP route map to the attribute. */
742 ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
744 peer->rmap_type = 0;
746 if (ret == RMAP_DENYMATCH)
748 /* Free newly generated AS path and community by route-map. */
749 bgp_attr_flush (attr);
750 return RMAP_DENY;
753 return RMAP_PERMIT;
756 static int
757 bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
758 struct attr *attr, afi_t afi, safi_t safi)
760 int ret;
761 char buf[SU_ADDRSTRLEN];
762 struct bgp_filter *filter;
763 struct peer *from;
764 struct bgp *bgp;
765 int transparent;
766 int reflect;
768 from = ri->peer;
769 filter = &peer->filter[afi][safi];
770 bgp = peer->bgp;
772 if (DISABLE_BGP_ANNOUNCE)
773 return 0;
775 /* 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;
779 /* Do not send back route to sender. */
780 if (from == peer)
781 return 0;
783 /* 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
793 /* Aggregate-address suppress check. */
794 if (ri->extra && ri->extra->suppress)
795 if (! UNSUPPRESS_MAP_NAME (filter))
796 return 0;
798 /* Default route check. */
799 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
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 */
809 /* 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;
816 /* If community is not disabled check the no-export and local. */
817 if (! transparent && bgp_community_filter (peer, ri->attr))
818 return 0;
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))
824 if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->extra->originator_id))
826 if (BGP_DEBUG (filter, FILTER))
827 zlog (peer->log, LOG_DEBUG,
828 "%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;
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])
842 if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
843 return 0;
846 /* Output filter check. */
847 if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
849 if (BGP_DEBUG (filter, FILTER))
850 zlog (peer->log, LOG_DEBUG,
851 "%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;
858 #ifdef BGP_SEND_ASPATH_CHECK
859 /* AS path loop check. */
860 if (aspath_loop_check (ri->attr->aspath, peer->as))
862 if (BGP_DEBUG (filter, FILTER))
863 zlog (peer->log, LOG_DEBUG,
864 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
865 peer->host, peer->as);
866 return 0;
868 #endif /* BGP_SEND_ASPATH_CHECK */
870 /* If we're a CONFED we need to loop check the CONFED ID too */
871 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
873 if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
875 if (BGP_DEBUG (filter, FILTER))
876 zlog (peer->log, LOG_DEBUG,
877 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
878 peer->host,
879 bgp->confed_id);
880 return 0;
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;
890 /* IBGP reflection check. */
891 if (reflect)
893 /* A route from a Client peer. */
894 if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
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;
904 else
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;
913 /* AS-Pathlimit check */
914 if (ri->attr->pathlimit.ttl && peer_sort (peer) == BGP_PEER_EBGP)
915 /* Our ASN has not yet been pre-pended, that's done in packet_attribute
916 * on output. Hence the test here is for >=.
918 if (aspath_count_hops (ri->attr->aspath) >= ri->attr->pathlimit.ttl)
920 if (BGP_DEBUG (filter, FILTER))
921 zlog_info ("%s [Update:SEND] suppressed, AS-Pathlimit TTL %u exceeded",
922 peer->host, ri->attr->pathlimit.ttl);
923 return 0;
926 /* For modify attribute, copy it to temporary structure. */
927 bgp_attr_dup (attr, ri->attr);
929 /* If local-preference is not set. */
930 if ((peer_sort (peer) == BGP_PEER_IBGP
931 || peer_sort (peer) == BGP_PEER_CONFED)
932 && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
934 attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
935 attr->local_pref = bgp->default_local_pref;
938 /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
939 if (peer_sort (peer) == BGP_PEER_EBGP
940 && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
942 if (ri->peer != bgp->peer_self && ! transparent
943 && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
944 attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
947 /* next-hop-set */
948 if (transparent || reflect
949 || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
950 && ((p->family == AF_INET && attr->nexthop.s_addr)
951 #ifdef HAVE_IPV6
952 || (p->family == AF_INET6 &&
953 ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
954 #endif /* HAVE_IPV6 */
957 /* NEXT-HOP Unchanged. */
959 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
960 || (p->family == AF_INET && attr->nexthop.s_addr == 0)
961 #ifdef HAVE_IPV6
962 || (p->family == AF_INET6 &&
963 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
964 #endif /* HAVE_IPV6 */
965 || (peer_sort (peer) == BGP_PEER_EBGP
966 && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
968 /* Set IPv4 nexthop. */
969 if (p->family == AF_INET)
971 if (safi == SAFI_MPLS_VPN)
972 memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
973 IPV4_MAX_BYTELEN);
974 else
975 memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
977 #ifdef HAVE_IPV6
978 /* Set IPv6 nexthop. */
979 if (p->family == AF_INET6)
981 /* IPv6 global nexthop must be included. */
982 memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
983 IPV6_MAX_BYTELEN);
984 attr->extra->mp_nexthop_len = 16;
986 #endif /* HAVE_IPV6 */
989 #ifdef HAVE_IPV6
990 if (p->family == AF_INET6)
992 /* Left nexthop_local unchanged if so configured. */
993 if ( CHECK_FLAG (peer->af_flags[afi][safi],
994 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
996 if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
997 attr->extra->mp_nexthop_len=32;
998 else
999 attr->extra->mp_nexthop_len=16;
1002 /* Default nexthop_local treatment for non-RS-Clients */
1003 else
1005 /* Link-local address should not be transit to different peer. */
1006 attr->extra->mp_nexthop_len = 16;
1008 /* Set link-local address for shared network peer. */
1009 if (peer->shared_network
1010 && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
1012 memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
1013 IPV6_MAX_BYTELEN);
1014 attr->extra->mp_nexthop_len = 32;
1017 /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1018 address.*/
1019 if (reflect)
1020 attr->extra->mp_nexthop_len = 16;
1022 /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1023 if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
1024 attr->extra->mp_nexthop_len = 16;
1028 #endif /* HAVE_IPV6 */
1030 /* AS-Pathlimit: Check ASN for private/confed */
1031 if (attr->pathlimit.ttl)
1033 /* locally originated update */
1034 if (!attr->pathlimit.as)
1035 attr->pathlimit.as = peer->local_as;
1037 /* if the AS_PATHLIMIT attribute is attached to a prefix by a
1038 member of a confederation, then when the prefix is advertised outside
1039 of the confederation boundary, then the AS number of the
1040 confederation member inside of the AS_PATHLIMIT attribute should be
1041 replaced by the confederation's AS number. */
1042 if (peer_sort (from) == BGP_PEER_CONFED
1043 && peer_sort (peer) != BGP_PEER_CONFED)
1044 attr->pathlimit.as = peer->local_as;
1046 /* Private ASN should be updated whenever announcement leaves
1047 * private space. This is deliberately done after simple confed
1048 * based update..
1050 if (attr->pathlimit.as >= BGP_PRIVATE_AS_MIN
1051 && attr->pathlimit.as <= BGP_PRIVATE_AS_MAX)
1053 if (peer->local_as < BGP_PRIVATE_AS_MIN
1054 || peer->local_as > BGP_PRIVATE_AS_MAX)
1055 attr->pathlimit.as = peer->local_as;
1056 /* Ours is private, try using theirs.. */
1057 else if (peer->as < BGP_PRIVATE_AS_MIN
1058 || peer->local_as > BGP_PRIVATE_AS_MAX)
1059 attr->pathlimit.as = peer->as;
1063 /* If this is EBGP peer and remove-private-AS is set. */
1064 if (peer_sort (peer) == BGP_PEER_EBGP
1065 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1066 && aspath_private_as_check (attr->aspath))
1067 attr->aspath = aspath_empty_get ();
1069 /* Route map & unsuppress-map apply. */
1070 if (ROUTE_MAP_OUT_NAME (filter)
1071 || (ri->extra && ri->extra->suppress) )
1073 struct bgp_info info;
1074 struct attr dummy_attr = { 0 };
1076 info.peer = peer;
1077 info.attr = attr;
1079 /* The route reflector is not allowed to modify the attributes
1080 of the reflected IBGP routes. */
1081 if (peer_sort (from) == BGP_PEER_IBGP
1082 && peer_sort (peer) == BGP_PEER_IBGP)
1084 bgp_attr_dup (&dummy_attr, attr);
1085 info.attr = &dummy_attr;
1088 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1090 if (ri->extra && ri->extra->suppress)
1091 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1092 else
1093 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1095 peer->rmap_type = 0;
1097 if (dummy_attr.extra)
1098 bgp_attr_extra_free (&dummy_attr);
1100 if (ret == RMAP_DENYMATCH)
1102 bgp_attr_flush (attr);
1103 return 0;
1106 return 1;
1109 static int
1110 bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1111 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
1113 int ret;
1114 char buf[SU_ADDRSTRLEN];
1115 struct bgp_filter *filter;
1116 struct bgp_info info;
1117 struct peer *from;
1118 struct bgp *bgp;
1120 from = ri->peer;
1121 filter = &rsclient->filter[afi][safi];
1122 bgp = rsclient->bgp;
1124 if (DISABLE_BGP_ANNOUNCE)
1125 return 0;
1127 /* Do not send back route to sender. */
1128 if (from == rsclient)
1129 return 0;
1131 /* Aggregate-address suppress check. */
1132 if (ri->extra && ri->extra->suppress)
1133 if (! UNSUPPRESS_MAP_NAME (filter))
1134 return 0;
1136 /* Default route check. */
1137 if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1138 PEER_STATUS_DEFAULT_ORIGINATE))
1140 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1141 return 0;
1142 #ifdef HAVE_IPV6
1143 else if (p->family == AF_INET6 && p->prefixlen == 0)
1144 return 0;
1145 #endif /* HAVE_IPV6 */
1148 /* If the attribute has originator-id and it is same as remote
1149 peer's id. */
1150 if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
1152 if (IPV4_ADDR_SAME (&rsclient->remote_id,
1153 &ri->attr->extra->originator_id))
1155 if (BGP_DEBUG (filter, FILTER))
1156 zlog (rsclient->log, LOG_DEBUG,
1157 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1158 rsclient->host,
1159 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1160 p->prefixlen);
1161 return 0;
1165 /* ORF prefix-list filter check */
1166 if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1167 && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1168 || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1169 if (rsclient->orf_plist[afi][safi])
1171 if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1172 return 0;
1175 /* Output filter check. */
1176 if (bgp_output_filter (rsclient, p, ri->attr, afi, safi) == FILTER_DENY)
1178 if (BGP_DEBUG (filter, FILTER))
1179 zlog (rsclient->log, LOG_DEBUG,
1180 "%s [Update:SEND] %s/%d is filtered",
1181 rsclient->host,
1182 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1183 p->prefixlen);
1184 return 0;
1187 #ifdef BGP_SEND_ASPATH_CHECK
1188 /* AS path loop check. */
1189 if (aspath_loop_check (ri->attr->aspath, rsclient->as))
1191 if (BGP_DEBUG (filter, FILTER))
1192 zlog (rsclient->log, LOG_DEBUG,
1193 "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
1194 rsclient->host, rsclient->as);
1195 return 0;
1197 #endif /* BGP_SEND_ASPATH_CHECK */
1199 /* For modify attribute, copy it to temporary structure. */
1200 bgp_attr_dup (attr, ri->attr);
1202 /* next-hop-set */
1203 if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1204 #ifdef HAVE_IPV6
1205 || (p->family == AF_INET6 &&
1206 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
1207 #endif /* HAVE_IPV6 */
1210 /* Set IPv4 nexthop. */
1211 if (p->family == AF_INET)
1213 if (safi == SAFI_MPLS_VPN)
1214 memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
1215 IPV4_MAX_BYTELEN);
1216 else
1217 memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1219 #ifdef HAVE_IPV6
1220 /* Set IPv6 nexthop. */
1221 if (p->family == AF_INET6)
1223 /* IPv6 global nexthop must be included. */
1224 memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
1225 IPV6_MAX_BYTELEN);
1226 attr->extra->mp_nexthop_len = 16;
1228 #endif /* HAVE_IPV6 */
1231 #ifdef HAVE_IPV6
1232 if (p->family == AF_INET6)
1234 struct attr_extra *attre = attr->extra;
1236 assert (attr->extra);
1238 /* Left nexthop_local unchanged if so configured. */
1239 if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1240 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1242 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1243 attre->mp_nexthop_len=32;
1244 else
1245 attre->mp_nexthop_len=16;
1248 /* Default nexthop_local treatment for RS-Clients */
1249 else
1251 /* Announcer and RS-Client are both in the same network */
1252 if (rsclient->shared_network && from->shared_network &&
1253 (rsclient->ifindex == from->ifindex))
1255 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1256 attre->mp_nexthop_len=32;
1257 else
1258 attre->mp_nexthop_len=16;
1261 /* Set link-local address for shared network peer. */
1262 else if (rsclient->shared_network
1263 && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1265 memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
1266 IPV6_MAX_BYTELEN);
1267 attre->mp_nexthop_len = 32;
1270 else
1271 attre->mp_nexthop_len = 16;
1275 #endif /* HAVE_IPV6 */
1278 /* If this is EBGP peer and remove-private-AS is set. */
1279 if (peer_sort (rsclient) == BGP_PEER_EBGP
1280 && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1281 && aspath_private_as_check (attr->aspath))
1282 attr->aspath = aspath_empty_get ();
1284 /* Route map & unsuppress-map apply. */
1285 if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
1287 info.peer = rsclient;
1288 info.attr = attr;
1290 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1292 if (ri->extra && ri->extra->suppress)
1293 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1294 else
1295 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1297 rsclient->rmap_type = 0;
1299 if (ret == RMAP_DENYMATCH)
1301 bgp_attr_flush (attr);
1302 return 0;
1306 return 1;
1309 struct bgp_info_pair
1311 struct bgp_info *old;
1312 struct bgp_info *new;
1315 static void
1316 bgp_best_selection (struct bgp *bgp, struct bgp_node *rn, struct bgp_info_pair *result)
1318 struct bgp_info *new_select;
1319 struct bgp_info *old_select;
1320 struct bgp_info *ri;
1321 struct bgp_info *ri1;
1322 struct bgp_info *ri2;
1323 struct bgp_info *nextri = NULL;
1325 /* bgp deterministic-med */
1326 new_select = NULL;
1327 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1328 for (ri1 = rn->info; ri1; ri1 = ri1->next)
1330 if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1331 continue;
1332 if (BGP_INFO_HOLDDOWN (ri1))
1333 continue;
1335 new_select = ri1;
1336 if (ri1->next)
1337 for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1339 if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1340 continue;
1341 if (BGP_INFO_HOLDDOWN (ri2))
1342 continue;
1344 if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1345 || aspath_cmp_left_confed (ri1->attr->aspath,
1346 ri2->attr->aspath))
1348 if (bgp_info_cmp (bgp, ri2, new_select))
1350 bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1351 new_select = ri2;
1354 bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
1357 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1358 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1361 /* Check old selected route and new selected route. */
1362 old_select = NULL;
1363 new_select = NULL;
1364 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
1366 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1367 old_select = ri;
1369 if (BGP_INFO_HOLDDOWN (ri))
1371 /* reap REMOVED routes, if needs be
1372 * selected route must stay for a while longer though
1374 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1375 && (ri != old_select))
1376 bgp_info_reap (rn, ri);
1378 continue;
1381 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1382 && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1384 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1385 continue;
1387 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1388 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
1390 if (bgp_info_cmp (bgp, ri, new_select))
1391 new_select = ri;
1394 result->old = old_select;
1395 result->new = new_select;
1397 return;
1400 static int
1401 bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
1402 struct bgp_node *rn, afi_t afi, safi_t safi)
1404 struct prefix *p;
1405 struct attr attr = { 0 };
1407 p = &rn->p;
1409 /* Announce route to Established peer. */
1410 if (peer->status != Established)
1411 return 0;
1413 /* Address family configuration check. */
1414 if (! peer->afc_nego[afi][safi])
1415 return 0;
1417 /* First update is deferred until ORF or ROUTE-REFRESH is received */
1418 if (CHECK_FLAG (peer->af_sflags[afi][safi],
1419 PEER_STATUS_ORF_WAIT_REFRESH))
1420 return 0;
1422 switch (rn->table->type)
1424 case BGP_TABLE_MAIN:
1425 /* Announcement to peer->conf. If the route is filtered,
1426 withdraw it. */
1427 if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1428 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1429 else
1430 bgp_adj_out_unset (rn, peer, p, afi, safi);
1431 break;
1432 case BGP_TABLE_RSCLIENT:
1433 /* Announcement to peer->conf. If the route is filtered,
1434 withdraw it. */
1435 if (selected &&
1436 bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1437 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1438 else
1439 bgp_adj_out_unset (rn, peer, p, afi, safi);
1440 break;
1443 bgp_attr_extra_free (&attr);
1445 return 0;
1448 struct bgp_process_queue
1450 struct bgp *bgp;
1451 struct bgp_node *rn;
1452 afi_t afi;
1453 safi_t safi;
1456 static wq_item_status
1457 bgp_process_rsclient (struct work_queue *wq, void *data)
1459 struct bgp_process_queue *pq = data;
1460 struct bgp *bgp = pq->bgp;
1461 struct bgp_node *rn = pq->rn;
1462 afi_t afi = pq->afi;
1463 safi_t safi = pq->safi;
1464 struct bgp_info *new_select;
1465 struct bgp_info *old_select;
1466 struct bgp_info_pair old_and_new;
1467 struct listnode *node, *nnode;
1468 struct peer *rsclient = rn->table->owner;
1470 /* Best path selection. */
1471 bgp_best_selection (bgp, rn, &old_and_new);
1472 new_select = old_and_new.new;
1473 old_select = old_and_new.old;
1475 if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1477 if (rsclient->group)
1478 for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1480 /* Nothing to do. */
1481 if (old_select && old_select == new_select)
1482 if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1483 continue;
1485 if (old_select)
1486 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1487 if (new_select)
1489 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1490 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1493 bgp_process_announce_selected (rsclient, new_select, rn,
1494 afi, safi);
1497 else
1499 if (old_select)
1500 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1501 if (new_select)
1503 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1504 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1506 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
1509 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1510 bgp_info_reap (rn, old_select);
1512 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1513 return WQ_SUCCESS;
1516 static wq_item_status
1517 bgp_process_main (struct work_queue *wq, void *data)
1519 struct bgp_process_queue *pq = data;
1520 struct bgp *bgp = pq->bgp;
1521 struct bgp_node *rn = pq->rn;
1522 afi_t afi = pq->afi;
1523 safi_t safi = pq->safi;
1524 struct prefix *p = &rn->p;
1525 struct bgp_info *new_select;
1526 struct bgp_info *old_select;
1527 struct bgp_info_pair old_and_new;
1528 struct listnode *node, *nnode;
1529 struct peer *peer;
1531 /* Best path selection. */
1532 bgp_best_selection (bgp, rn, &old_and_new);
1533 old_select = old_and_new.old;
1534 new_select = old_and_new.new;
1536 /* Nothing to do. */
1537 if (old_select && old_select == new_select)
1539 if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1541 if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
1542 bgp_zebra_announce (p, old_select, bgp);
1544 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1545 return WQ_SUCCESS;
1549 if (old_select)
1550 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1551 if (new_select)
1553 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1554 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1558 /* Check each BGP peer. */
1559 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
1561 bgp_process_announce_selected (peer, new_select, rn, afi, safi);
1564 /* FIB update. */
1565 if (safi == SAFI_UNICAST && ! bgp->name &&
1566 ! bgp_option_check (BGP_OPT_NO_FIB))
1568 if (new_select
1569 && new_select->type == ZEBRA_ROUTE_BGP
1570 && new_select->sub_type == BGP_ROUTE_NORMAL)
1571 bgp_zebra_announce (p, new_select, bgp);
1572 else
1574 /* Withdraw the route from the kernel. */
1575 if (old_select
1576 && old_select->type == ZEBRA_ROUTE_BGP
1577 && old_select->sub_type == BGP_ROUTE_NORMAL)
1578 bgp_zebra_withdraw (p, old_select);
1582 /* Reap old select bgp_info, it it has been removed */
1583 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1584 bgp_info_reap (rn, old_select);
1586 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1587 return WQ_SUCCESS;
1590 static void
1591 bgp_processq_del (struct work_queue *wq, void *data)
1593 struct bgp_process_queue *pq = data;
1594 struct bgp_table *table = pq->rn->table;
1596 bgp_unlock (pq->bgp);
1597 bgp_unlock_node (pq->rn);
1598 bgp_table_unlock (table);
1599 XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1602 static void
1603 bgp_process_queue_init (void)
1605 bm->process_main_queue
1606 = work_queue_new (bm->master, "process_main_queue");
1607 bm->process_rsclient_queue
1608 = work_queue_new (bm->master, "process_rsclient_queue");
1610 if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1612 zlog_err ("%s: Failed to allocate work queue", __func__);
1613 exit (1);
1616 bm->process_main_queue->spec.workfunc = &bgp_process_main;
1617 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
1618 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
1619 bm->process_rsclient_queue->spec.del_item_data
1620 = bm->process_main_queue->spec.del_item_data;
1621 bm->process_main_queue->spec.max_retries
1622 = bm->process_main_queue->spec.max_retries = 0;
1623 bm->process_rsclient_queue->spec.hold
1624 = bm->process_main_queue->spec.hold = 50;
1627 void
1628 bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1630 struct bgp_process_queue *pqnode;
1632 /* already scheduled for processing? */
1633 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1634 return;
1636 if ( (bm->process_main_queue == NULL) ||
1637 (bm->process_rsclient_queue == NULL) )
1638 bgp_process_queue_init ();
1640 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1641 sizeof (struct bgp_process_queue));
1642 if (!pqnode)
1643 return;
1645 /* all unlocked in bgp_processq_del */
1646 bgp_table_lock (rn->table);
1647 pqnode->rn = bgp_lock_node (rn);
1648 pqnode->bgp = bgp;
1649 bgp_lock (bgp);
1650 pqnode->afi = afi;
1651 pqnode->safi = safi;
1653 switch (rn->table->type)
1655 case BGP_TABLE_MAIN:
1656 work_queue_add (bm->process_main_queue, pqnode);
1657 break;
1658 case BGP_TABLE_RSCLIENT:
1659 work_queue_add (bm->process_rsclient_queue, pqnode);
1660 break;
1663 return;
1666 static int
1667 bgp_maximum_prefix_restart_timer (struct thread *thread)
1669 struct peer *peer;
1671 peer = THREAD_ARG (thread);
1672 peer->t_pmax_restart = NULL;
1674 if (BGP_DEBUG (events, EVENTS))
1675 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1676 peer->host);
1678 peer_clear (peer);
1680 return 0;
1684 bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1685 safi_t safi, int always)
1687 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1688 return 0;
1690 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
1692 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1693 && ! always)
1694 return 0;
1696 zlog (peer->log, LOG_INFO,
1697 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1698 "limit %ld", afi_safi_print (afi, safi), peer->host,
1699 peer->pcount[afi][safi], peer->pmax[afi][safi]);
1700 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1702 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1703 return 0;
1706 u_int8_t ndata[7];
1708 if (safi == SAFI_MPLS_VPN)
1709 safi = BGP_SAFI_VPNV4;
1711 ndata[0] = (afi >> 8);
1712 ndata[1] = afi;
1713 ndata[2] = safi;
1714 ndata[3] = (peer->pmax[afi][safi] >> 24);
1715 ndata[4] = (peer->pmax[afi][safi] >> 16);
1716 ndata[5] = (peer->pmax[afi][safi] >> 8);
1717 ndata[6] = (peer->pmax[afi][safi]);
1719 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1720 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1721 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1724 /* restart timer start */
1725 if (peer->pmax_restart[afi][safi])
1727 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1729 if (BGP_DEBUG (events, EVENTS))
1730 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1731 peer->host, peer->v_pmax_restart);
1733 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1734 peer->v_pmax_restart);
1737 return 1;
1739 else
1740 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1742 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1744 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1745 && ! always)
1746 return 0;
1748 zlog (peer->log, LOG_INFO,
1749 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1750 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1751 peer->pmax[afi][safi]);
1752 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1754 else
1755 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1756 return 0;
1759 /* Unconditionally remove the route from the RIB, without taking
1760 * damping into consideration (eg, because the session went down)
1762 static void
1763 bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1764 afi_t afi, safi_t safi)
1766 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1768 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1769 bgp_info_delete (rn, ri); /* keep historical info */
1771 bgp_process (peer->bgp, rn, afi, safi);
1774 static void
1775 bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1776 afi_t afi, safi_t safi)
1778 int status = BGP_DAMP_NONE;
1780 /* apply dampening, if result is suppressed, we'll be retaining
1781 * the bgp_info in the RIB for historical reference.
1783 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1784 && peer_sort (peer) == BGP_PEER_EBGP)
1785 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1786 == BGP_DAMP_SUPPRESSED)
1788 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1789 return;
1792 bgp_rib_remove (rn, ri, peer, afi, safi);
1795 static void
1796 bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1797 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1798 int sub_type, struct prefix_rd *prd, u_char *tag)
1800 struct bgp_node *rn;
1801 struct bgp *bgp;
1802 struct attr new_attr = { 0 };
1803 struct attr *attr_new;
1804 struct attr *attr_new2;
1805 struct bgp_info *ri;
1806 struct bgp_info *new;
1807 const char *reason;
1808 char buf[SU_ADDRSTRLEN];
1810 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1811 if (peer == rsclient)
1812 return;
1814 bgp = peer->bgp;
1815 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1817 /* Check previously received route. */
1818 for (ri = rn->info; ri; ri = ri->next)
1819 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1820 break;
1822 /* AS path loop check. */
1823 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1825 reason = "as-path contains our own AS;";
1826 goto filtered;
1829 /* Route reflector originator ID check. */
1830 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
1831 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
1833 reason = "originator is us;";
1834 goto filtered;
1837 bgp_attr_dup (&new_attr, attr);
1839 /* Apply export policy. */
1840 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1841 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1843 reason = "export-policy;";
1844 goto filtered;
1847 attr_new2 = bgp_attr_intern (&new_attr);
1849 /* Apply import policy. */
1850 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1852 bgp_attr_unintern (attr_new2);
1854 reason = "import-policy;";
1855 goto filtered;
1858 attr_new = bgp_attr_intern (&new_attr);
1859 bgp_attr_unintern (attr_new2);
1861 /* IPv4 unicast next hop check. */
1862 if (afi == AFI_IP && safi == SAFI_UNICAST)
1864 /* Next hop must not be 0.0.0.0 nor Class E address. */
1865 if (new_attr.nexthop.s_addr == 0
1866 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
1868 bgp_attr_unintern (attr_new);
1870 reason = "martian next-hop;";
1871 goto filtered;
1875 /* new_attr isn't passed to any functions after here */
1876 bgp_attr_extra_free (&new_attr);
1878 /* If the update is implicit withdraw. */
1879 if (ri)
1881 ri->uptime = bgp_clock ();
1883 /* Same attribute comes in. */
1884 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1885 && attrhash_cmp (ri->attr, attr_new))
1888 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1890 if (BGP_DEBUG (update, UPDATE_IN))
1891 zlog (peer->log, LOG_DEBUG,
1892 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1893 peer->host,
1894 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1895 p->prefixlen, rsclient->host);
1897 bgp_unlock_node (rn);
1898 bgp_attr_unintern (attr_new);
1900 return;
1903 /* Withdraw/Announce before we fully processed the withdraw */
1904 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1905 bgp_info_restore (rn, ri);
1907 /* Received Logging. */
1908 if (BGP_DEBUG (update, UPDATE_IN))
1909 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1910 peer->host,
1911 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1912 p->prefixlen, rsclient->host);
1914 /* The attribute is changed. */
1915 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1917 /* Update to new attribute. */
1918 bgp_attr_unintern (ri->attr);
1919 ri->attr = attr_new;
1921 /* Update MPLS tag. */
1922 if (safi == SAFI_MPLS_VPN)
1923 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
1925 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
1927 /* Process change. */
1928 bgp_process (bgp, rn, afi, safi);
1929 bgp_unlock_node (rn);
1931 return;
1934 /* Received Logging. */
1935 if (BGP_DEBUG (update, UPDATE_IN))
1937 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1938 peer->host,
1939 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1940 p->prefixlen, rsclient->host);
1943 /* Make new BGP info. */
1944 new = bgp_info_new ();
1945 new->type = type;
1946 new->sub_type = sub_type;
1947 new->peer = peer;
1948 new->attr = attr_new;
1949 new->uptime = bgp_clock ();
1951 /* Update MPLS tag. */
1952 if (safi == SAFI_MPLS_VPN)
1953 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
1955 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
1957 /* Register new BGP information. */
1958 bgp_info_add (rn, new);
1960 /* route_node_get lock */
1961 bgp_unlock_node (rn);
1963 /* Process change. */
1964 bgp_process (bgp, rn, afi, safi);
1966 bgp_attr_extra_free (&new_attr);
1968 return;
1970 filtered:
1972 /* This BGP update is filtered. Log the reason then update BGP entry. */
1973 if (BGP_DEBUG (update, UPDATE_IN))
1974 zlog (peer->log, LOG_DEBUG,
1975 "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
1976 peer->host,
1977 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1978 p->prefixlen, rsclient->host, reason);
1980 if (ri)
1981 bgp_rib_remove (rn, ri, peer, afi, safi);
1983 bgp_unlock_node (rn);
1985 if (new_attr.extra)
1986 bgp_attr_extra_free (&new_attr);
1988 return;
1991 static void
1992 bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1993 struct peer *peer, struct prefix *p, int type, int sub_type,
1994 struct prefix_rd *prd, u_char *tag)
1996 struct bgp_node *rn;
1997 struct bgp_info *ri;
1998 char buf[SU_ADDRSTRLEN];
2000 if (rsclient == peer)
2001 return;
2003 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
2005 /* Lookup withdrawn route. */
2006 for (ri = rn->info; ri; ri = ri->next)
2007 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2008 break;
2010 /* Withdraw specified route from routing table. */
2011 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2012 bgp_rib_withdraw (rn, ri, peer, afi, safi);
2013 else if (BGP_DEBUG (update, UPDATE_IN))
2014 zlog (peer->log, LOG_DEBUG,
2015 "%s Can't find the route %s/%d", peer->host,
2016 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2017 p->prefixlen);
2019 /* Unlock bgp_node_get() lock. */
2020 bgp_unlock_node (rn);
2023 static int
2024 bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
2025 afi_t afi, safi_t safi, int type, int sub_type,
2026 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2028 int ret;
2029 int aspath_loop_count = 0;
2030 struct bgp_node *rn;
2031 struct bgp *bgp;
2032 struct attr new_attr = { 0 };
2033 struct attr *attr_new;
2034 struct bgp_info *ri;
2035 struct bgp_info *new;
2036 const char *reason;
2037 char buf[SU_ADDRSTRLEN];
2039 bgp = peer->bgp;
2040 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2042 /* When peer's soft reconfiguration enabled. Record input packet in
2043 Adj-RIBs-In. */
2044 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2045 && peer != bgp->peer_self && ! soft_reconfig)
2046 bgp_adj_in_set (rn, peer, attr);
2048 /* Check previously received route. */
2049 for (ri = rn->info; ri; ri = ri->next)
2050 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2051 break;
2053 /* AS path local-as loop check. */
2054 if (peer->change_local_as)
2056 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2057 aspath_loop_count = 1;
2059 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2061 reason = "as-path contains our own AS;";
2062 goto filtered;
2066 /* AS path loop check. */
2067 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2068 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2069 && aspath_loop_check(attr->aspath, bgp->confed_id)
2070 > peer->allowas_in[afi][safi]))
2072 reason = "as-path contains our own AS;";
2073 goto filtered;
2076 /* Route reflector originator ID check. */
2077 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
2078 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
2080 reason = "originator is us;";
2081 goto filtered;
2084 /* Route reflector cluster ID check. */
2085 if (bgp_cluster_filter (peer, attr))
2087 reason = "reflected from the same cluster;";
2088 goto filtered;
2091 /* Apply incoming filter. */
2092 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2094 reason = "filter;";
2095 goto filtered;
2098 /* Apply incoming route-map. */
2099 bgp_attr_dup (&new_attr, attr);
2101 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2103 reason = "route-map;";
2104 goto filtered;
2107 /* IPv4 unicast next hop check. */
2108 if (afi == AFI_IP && safi == SAFI_UNICAST)
2110 /* If the peer is EBGP and nexthop is not on connected route,
2111 discard it. */
2112 if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
2113 && ! bgp_nexthop_check_ebgp (afi, &new_attr)
2114 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
2116 reason = "non-connected next-hop;";
2117 goto filtered;
2120 /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
2121 must not be my own address. */
2122 if (bgp_nexthop_self (afi, &new_attr)
2123 || new_attr.nexthop.s_addr == 0
2124 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
2126 reason = "martian next-hop;";
2127 goto filtered;
2131 attr_new = bgp_attr_intern (&new_attr);
2133 /* If the update is implicit withdraw. */
2134 if (ri)
2136 ri->uptime = bgp_clock ();
2138 /* Same attribute comes in. */
2139 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2140 && attrhash_cmp (ri->attr, attr_new))
2142 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2144 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2145 && peer_sort (peer) == BGP_PEER_EBGP
2146 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2148 if (BGP_DEBUG (update, UPDATE_IN))
2149 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2150 peer->host,
2151 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2152 p->prefixlen);
2154 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2156 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2157 bgp_process (bgp, rn, afi, safi);
2160 else /* Duplicate - odd */
2162 if (BGP_DEBUG (update, UPDATE_IN))
2163 zlog (peer->log, LOG_DEBUG,
2164 "%s rcvd %s/%d...duplicate ignored",
2165 peer->host,
2166 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2167 p->prefixlen);
2169 /* graceful restart STALE flag unset. */
2170 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2172 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2173 bgp_process (bgp, rn, afi, safi);
2177 bgp_unlock_node (rn);
2178 bgp_attr_unintern (attr_new);
2179 bgp_attr_extra_free (&new_attr);
2181 return 0;
2184 /* Withdraw/Announce before we fully processed the withdraw */
2185 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2187 if (BGP_DEBUG (update, UPDATE_IN))
2188 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2189 peer->host,
2190 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2191 p->prefixlen);
2192 bgp_info_restore (rn, ri);
2195 /* Received Logging. */
2196 if (BGP_DEBUG (update, UPDATE_IN))
2197 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2198 peer->host,
2199 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2200 p->prefixlen);
2202 /* graceful restart STALE flag unset. */
2203 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2204 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2206 /* The attribute is changed. */
2207 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2209 /* implicit withdraw, decrement aggregate and pcount here.
2210 * only if update is accepted, they'll increment below.
2212 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2214 /* Update bgp route dampening information. */
2215 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2216 && peer_sort (peer) == BGP_PEER_EBGP)
2218 /* This is implicit withdraw so we should update dampening
2219 information. */
2220 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2221 bgp_damp_withdraw (ri, rn, afi, safi, 1);
2224 /* Update to new attribute. */
2225 bgp_attr_unintern (ri->attr);
2226 ri->attr = attr_new;
2228 /* Update MPLS tag. */
2229 if (safi == SAFI_MPLS_VPN)
2230 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
2232 /* Update bgp route dampening information. */
2233 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2234 && peer_sort (peer) == BGP_PEER_EBGP)
2236 /* Now we do normal update dampening. */
2237 ret = bgp_damp_update (ri, rn, afi, safi);
2238 if (ret == BGP_DAMP_SUPPRESSED)
2240 bgp_unlock_node (rn);
2241 bgp_attr_extra_free (&new_attr);
2242 return 0;
2246 /* Nexthop reachability check. */
2247 if ((afi == AFI_IP || afi == AFI_IP6)
2248 && safi == SAFI_UNICAST
2249 && (peer_sort (peer) == BGP_PEER_IBGP
2250 || peer_sort (peer) == BGP_PEER_CONFED
2251 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2252 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2254 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
2255 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2256 else
2257 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
2259 else
2260 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2262 /* Process change. */
2263 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2265 bgp_process (bgp, rn, afi, safi);
2266 bgp_unlock_node (rn);
2267 bgp_attr_extra_free (&new_attr);
2269 return 0;
2272 /* Received Logging. */
2273 if (BGP_DEBUG (update, UPDATE_IN))
2275 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2276 peer->host,
2277 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2278 p->prefixlen);
2281 /* Make new BGP info. */
2282 new = bgp_info_new ();
2283 new->type = type;
2284 new->sub_type = sub_type;
2285 new->peer = peer;
2286 new->attr = attr_new;
2287 new->uptime = bgp_clock ();
2289 /* Update MPLS tag. */
2290 if (safi == SAFI_MPLS_VPN)
2291 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
2293 /* Nexthop reachability check. */
2294 if ((afi == AFI_IP || afi == AFI_IP6)
2295 && safi == SAFI_UNICAST
2296 && (peer_sort (peer) == BGP_PEER_IBGP
2297 || peer_sort (peer) == BGP_PEER_CONFED
2298 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2299 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2301 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
2302 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2303 else
2304 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
2306 else
2307 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2309 /* Increment prefix */
2310 bgp_aggregate_increment (bgp, p, new, afi, safi);
2312 /* Register new BGP information. */
2313 bgp_info_add (rn, new);
2315 /* route_node_get lock */
2316 bgp_unlock_node (rn);
2318 bgp_attr_extra_free (&new_attr);
2320 /* If maximum prefix count is configured and current prefix
2321 count exeed it. */
2322 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2323 return -1;
2325 /* Process change. */
2326 bgp_process (bgp, rn, afi, safi);
2328 return 0;
2330 /* This BGP update is filtered. Log the reason then update BGP
2331 entry. */
2332 filtered:
2333 if (BGP_DEBUG (update, UPDATE_IN))
2334 zlog (peer->log, LOG_DEBUG,
2335 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2336 peer->host,
2337 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2338 p->prefixlen, reason);
2340 if (ri)
2341 bgp_rib_remove (rn, ri, peer, afi, safi);
2343 bgp_unlock_node (rn);
2345 bgp_attr_extra_free (&new_attr);
2347 return 0;
2351 bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2352 afi_t afi, safi_t safi, int type, int sub_type,
2353 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2355 struct peer *rsclient;
2356 struct listnode *node, *nnode;
2357 struct bgp *bgp;
2358 int ret;
2360 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2361 soft_reconfig);
2363 bgp = peer->bgp;
2365 /* Process the update for each RS-client. */
2366 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2368 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2369 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2370 sub_type, prd, tag);
2373 return ret;
2377 bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
2378 afi_t afi, safi_t safi, int type, int sub_type,
2379 struct prefix_rd *prd, u_char *tag)
2381 struct bgp *bgp;
2382 char buf[SU_ADDRSTRLEN];
2383 struct bgp_node *rn;
2384 struct bgp_info *ri;
2385 struct peer *rsclient;
2386 struct listnode *node, *nnode;
2388 bgp = peer->bgp;
2390 /* Process the withdraw for each RS-client. */
2391 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2393 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2394 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2397 /* Logging. */
2398 if (BGP_DEBUG (update, UPDATE_IN))
2399 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
2400 peer->host,
2401 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2402 p->prefixlen);
2404 /* Lookup node. */
2405 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2407 /* If peer is soft reconfiguration enabled. Record input packet for
2408 further calculation. */
2409 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2410 && peer != bgp->peer_self)
2411 bgp_adj_in_unset (rn, peer);
2413 /* Lookup withdrawn route. */
2414 for (ri = rn->info; ri; ri = ri->next)
2415 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2416 break;
2418 /* Withdraw specified route from routing table. */
2419 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2420 bgp_rib_withdraw (rn, ri, peer, afi, safi);
2421 else if (BGP_DEBUG (update, UPDATE_IN))
2422 zlog (peer->log, LOG_DEBUG,
2423 "%s Can't find the route %s/%d", peer->host,
2424 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2425 p->prefixlen);
2427 /* Unlock bgp_node_get() lock. */
2428 bgp_unlock_node (rn);
2430 return 0;
2433 void
2434 bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2436 struct bgp *bgp;
2437 struct attr attr = { 0 };
2438 struct aspath *aspath = { 0 };
2439 struct prefix p;
2440 struct bgp_info binfo;
2441 struct peer *from;
2442 int ret = RMAP_DENYMATCH;
2444 if (!(afi == AFI_IP || afi == AFI_IP6))
2445 return;
2447 bgp = peer->bgp;
2448 from = bgp->peer_self;
2450 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2451 aspath = attr.aspath;
2452 attr.local_pref = bgp->default_local_pref;
2453 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2455 if (afi == AFI_IP)
2456 str2prefix ("0.0.0.0/0", &p);
2457 #ifdef HAVE_IPV6
2458 else if (afi == AFI_IP6)
2460 struct attr_extra *ae;
2461 attr.extra = NULL;
2463 ae = bgp_attr_extra_get (&attr);
2464 attr.extra = ae;
2466 str2prefix ("::/0", &p);
2468 /* IPv6 global nexthop must be included. */
2469 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
2470 IPV6_MAX_BYTELEN);
2471 ae->mp_nexthop_len = 16;
2473 /* If the peer is on shared nextwork and we have link-local
2474 nexthop set it. */
2475 if (peer->shared_network
2476 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2478 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
2479 IPV6_MAX_BYTELEN);
2480 ae->mp_nexthop_len = 32;
2483 #endif /* HAVE_IPV6 */
2485 if (peer->default_rmap[afi][safi].name)
2487 binfo.peer = bgp->peer_self;
2488 binfo.attr = &attr;
2490 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2492 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2493 RMAP_BGP, &binfo);
2495 bgp->peer_self->rmap_type = 0;
2497 if (ret == RMAP_DENYMATCH)
2499 bgp_attr_flush (&attr);
2500 withdraw = 1;
2504 if (withdraw)
2506 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2507 bgp_default_withdraw_send (peer, afi, safi);
2508 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2510 else
2512 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2513 bgp_default_update_send (peer, &attr, afi, safi, from);
2516 bgp_attr_extra_free (&attr);
2517 aspath_unintern (aspath);
2520 static void
2521 bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
2522 struct bgp_table *table, int rsclient)
2524 struct bgp_node *rn;
2525 struct bgp_info *ri;
2526 struct attr attr = { 0 };
2528 if (! table)
2529 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
2531 if (safi != SAFI_MPLS_VPN
2532 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2533 bgp_default_originate (peer, afi, safi, 0);
2535 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2536 for (ri = rn->info; ri; ri = ri->next)
2537 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2539 if ( (rsclient) ?
2540 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2541 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
2542 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2543 else
2544 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
2546 bgp_attr_extra_free (&attr);
2550 void
2551 bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2553 struct bgp_node *rn;
2554 struct bgp_table *table;
2556 if (peer->status != Established)
2557 return;
2559 if (! peer->afc_nego[afi][safi])
2560 return;
2562 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2563 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2564 return;
2566 if (safi != SAFI_MPLS_VPN)
2567 bgp_announce_table (peer, afi, safi, NULL, 0);
2568 else
2569 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2570 rn = bgp_route_next(rn))
2571 if ((table = (rn->info)) != NULL)
2572 bgp_announce_table (peer, afi, safi, table, 0);
2574 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2575 bgp_announce_table (peer, afi, safi, NULL, 1);
2578 void
2579 bgp_announce_route_all (struct peer *peer)
2581 afi_t afi;
2582 safi_t safi;
2584 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2585 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2586 bgp_announce_route (peer, afi, safi);
2589 static void
2590 bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2591 safi_t safi, struct bgp_table *table)
2593 struct bgp_node *rn;
2594 struct bgp_adj_in *ain;
2596 if (! table)
2597 table = rsclient->bgp->rib[afi][safi];
2599 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2600 for (ain = rn->adj_in; ain; ain = ain->next)
2602 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2603 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2607 void
2608 bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2610 struct bgp_table *table;
2611 struct bgp_node *rn;
2613 if (safi != SAFI_MPLS_VPN)
2614 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2616 else
2617 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2618 rn = bgp_route_next (rn))
2619 if ((table = rn->info) != NULL)
2620 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2623 static void
2624 bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2625 struct bgp_table *table)
2627 int ret;
2628 struct bgp_node *rn;
2629 struct bgp_adj_in *ain;
2631 if (! table)
2632 table = peer->bgp->rib[afi][safi];
2634 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2635 for (ain = rn->adj_in; ain; ain = ain->next)
2637 if (ain->peer == peer)
2639 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2640 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2641 NULL, NULL, 1);
2642 if (ret < 0)
2644 bgp_unlock_node (rn);
2645 return;
2647 continue;
2652 void
2653 bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2655 struct bgp_node *rn;
2656 struct bgp_table *table;
2658 if (peer->status != Established)
2659 return;
2661 if (safi != SAFI_MPLS_VPN)
2662 bgp_soft_reconfig_table (peer, afi, safi, NULL);
2663 else
2664 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2665 rn = bgp_route_next (rn))
2666 if ((table = rn->info) != NULL)
2667 bgp_soft_reconfig_table (peer, afi, safi, table);
2671 struct bgp_clear_node_queue
2673 struct bgp_node *rn;
2674 enum bgp_clear_route_type purpose;
2677 static wq_item_status
2678 bgp_clear_route_node (struct work_queue *wq, void *data)
2680 struct bgp_clear_node_queue *cnq = data;
2681 struct bgp_node *rn = cnq->rn;
2682 struct peer *peer = wq->spec.data;
2683 struct bgp_info *ri;
2684 afi_t afi = rn->table->afi;
2685 safi_t safi = rn->table->safi;
2687 assert (rn && peer);
2689 for (ri = rn->info; ri; ri = ri->next)
2690 if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2692 /* graceful restart STALE flag set. */
2693 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2694 && peer->nsf[afi][safi]
2695 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
2696 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2697 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
2698 else
2699 bgp_rib_remove (rn, ri, peer, afi, safi);
2700 break;
2702 return WQ_SUCCESS;
2705 static void
2706 bgp_clear_node_queue_del (struct work_queue *wq, void *data)
2708 struct bgp_clear_node_queue *cnq = data;
2709 struct bgp_node *rn = cnq->rn;
2710 struct bgp_table *table = rn->table;
2712 bgp_unlock_node (rn);
2713 bgp_table_unlock (table);
2714 XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
2717 static void
2718 bgp_clear_node_complete (struct work_queue *wq)
2720 struct peer *peer = wq->spec.data;
2722 /* Tickle FSM to start moving again */
2723 BGP_EVENT_ADD (peer, Clearing_Completed);
2725 peer_unlock (peer); /* bgp_clear_route */
2728 static void
2729 bgp_clear_node_queue_init (struct peer *peer)
2731 char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
2733 snprintf (wname, sizeof(wname), "clear %s", peer->host);
2734 #undef CLEAR_QUEUE_NAME_LEN
2736 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
2738 zlog_err ("%s: Failed to allocate work queue", __func__);
2739 exit (1);
2741 peer->clear_node_queue->spec.hold = 10;
2742 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2743 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2744 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2745 peer->clear_node_queue->spec.max_retries = 0;
2747 /* we only 'lock' this peer reference when the queue is actually active */
2748 peer->clear_node_queue->spec.data = peer;
2751 static void
2752 bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
2753 struct bgp_table *table, struct peer *rsclient,
2754 enum bgp_clear_route_type purpose)
2756 struct bgp_node *rn;
2759 if (! table)
2760 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
2762 /* If still no table => afi/safi isn't configured at all or smth. */
2763 if (! table)
2764 return;
2766 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2768 struct bgp_info *ri;
2769 struct bgp_adj_in *ain;
2770 struct bgp_adj_out *aout;
2772 if (rn->info == NULL)
2773 continue;
2775 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2776 * queued for every clearing peer, regardless of whether it is
2777 * relevant to the peer at hand.
2779 * Overview: There are 3 different indices which need to be
2780 * scrubbed, potentially, when a peer is removed:
2782 * 1 peer's routes visible via the RIB (ie accepted routes)
2783 * 2 peer's routes visible by the (optional) peer's adj-in index
2784 * 3 other routes visible by the peer's adj-out index
2786 * 3 there is no hurry in scrubbing, once the struct peer is
2787 * removed from bgp->peer, we could just GC such deleted peer's
2788 * adj-outs at our leisure.
2790 * 1 and 2 must be 'scrubbed' in some way, at least made
2791 * invisible via RIB index before peer session is allowed to be
2792 * brought back up. So one needs to know when such a 'search' is
2793 * complete.
2795 * Ideally:
2797 * - there'd be a single global queue or a single RIB walker
2798 * - rather than tracking which route_nodes still need to be
2799 * examined on a peer basis, we'd track which peers still
2800 * aren't cleared
2802 * Given that our per-peer prefix-counts now should be reliable,
2803 * this may actually be achievable. It doesn't seem to be a huge
2804 * problem at this time,
2806 for (ri = rn->info; ri; ri = ri->next)
2807 if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2809 struct bgp_clear_node_queue *cnq;
2811 /* both unlocked in bgp_clear_node_queue_del */
2812 bgp_table_lock (rn->table);
2813 bgp_lock_node (rn);
2814 cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2815 sizeof (struct bgp_clear_node_queue));
2816 cnq->rn = rn;
2817 cnq->purpose = purpose;
2818 work_queue_add (peer->clear_node_queue, cnq);
2819 break;
2822 for (ain = rn->adj_in; ain; ain = ain->next)
2823 if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2825 bgp_adj_in_remove (rn, ain);
2826 bgp_unlock_node (rn);
2827 break;
2829 for (aout = rn->adj_out; aout; aout = aout->next)
2830 if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2832 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2833 bgp_unlock_node (rn);
2834 break;
2837 return;
2840 void
2841 bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2842 enum bgp_clear_route_type purpose)
2844 struct bgp_node *rn;
2845 struct bgp_table *table;
2846 struct peer *rsclient;
2847 struct listnode *node, *nnode;
2849 if (peer->clear_node_queue == NULL)
2850 bgp_clear_node_queue_init (peer);
2852 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2853 * Idle until it receives a Clearing_Completed event. This protects
2854 * against peers which flap faster than we can we clear, which could
2855 * lead to:
2857 * a) race with routes from the new session being installed before
2858 * clear_route_node visits the node (to delete the route of that
2859 * peer)
2860 * b) resource exhaustion, clear_route_node likely leads to an entry
2861 * on the process_main queue. Fast-flapping could cause that queue
2862 * to grow and grow.
2864 if (!peer->clear_node_queue->thread)
2865 peer_lock (peer); /* bgp_clear_node_complete */
2867 switch (purpose)
2869 case BGP_CLEAR_ROUTE_NORMAL:
2870 if (safi != SAFI_MPLS_VPN)
2871 bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2872 else
2873 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2874 rn = bgp_route_next (rn))
2875 if ((table = rn->info) != NULL)
2876 bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2878 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2879 if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2880 PEER_FLAG_RSERVER_CLIENT))
2881 bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2882 break;
2884 case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2885 bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2886 break;
2888 default:
2889 assert (0);
2890 break;
2893 /* If no routes were cleared, nothing was added to workqueue, the
2894 * completion function won't be run by workqueue code - call it here.
2895 * XXX: Actually, this assumption doesn't hold, see
2896 * bgp_clear_route_table(), we queue all non-empty nodes.
2898 * Additionally, there is a presumption in FSM that clearing is only
2899 * really needed if peer state is Established - peers in
2900 * pre-Established states shouldn't have any route-update state
2901 * associated with them (in or out).
2903 * We still can get here in pre-Established though, through
2904 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2905 * check to ensure the assumption above holds.
2907 * At some future point, this check could be move to the top of the
2908 * function, and do a quick early-return when state is
2909 * pre-Established, avoiding above list and table scans. Once we're
2910 * sure it is safe..
2912 if (!peer->clear_node_queue->thread)
2913 bgp_clear_node_complete (peer->clear_node_queue);
2916 void
2917 bgp_clear_route_all (struct peer *peer)
2919 afi_t afi;
2920 safi_t safi;
2922 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2923 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2924 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
2927 void
2928 bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2930 struct bgp_table *table;
2931 struct bgp_node *rn;
2932 struct bgp_adj_in *ain;
2934 table = peer->bgp->rib[afi][safi];
2936 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2937 for (ain = rn->adj_in; ain ; ain = ain->next)
2938 if (ain->peer == peer)
2940 bgp_adj_in_remove (rn, ain);
2941 bgp_unlock_node (rn);
2942 break;
2946 void
2947 bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2949 struct bgp_node *rn;
2950 struct bgp_info *ri;
2951 struct bgp_table *table;
2953 table = peer->bgp->rib[afi][safi];
2955 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2957 for (ri = rn->info; ri; ri = ri->next)
2958 if (ri->peer == peer)
2960 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2961 bgp_rib_remove (rn, ri, peer, afi, safi);
2962 break;
2967 /* Delete all kernel routes. */
2968 void
2969 bgp_cleanup_routes (void)
2971 struct bgp *bgp;
2972 struct listnode *node, *nnode;
2973 struct bgp_node *rn;
2974 struct bgp_table *table;
2975 struct bgp_info *ri;
2977 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
2979 table = bgp->rib[AFI_IP][SAFI_UNICAST];
2981 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2982 for (ri = rn->info; ri; ri = ri->next)
2983 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2984 && ri->type == ZEBRA_ROUTE_BGP
2985 && ri->sub_type == BGP_ROUTE_NORMAL)
2986 bgp_zebra_withdraw (&rn->p, ri);
2988 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
2990 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2991 for (ri = rn->info; ri; ri = ri->next)
2992 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2993 && ri->type == ZEBRA_ROUTE_BGP
2994 && ri->sub_type == BGP_ROUTE_NORMAL)
2995 bgp_zebra_withdraw (&rn->p, ri);
2999 void
3000 bgp_reset (void)
3002 vty_reset ();
3003 bgp_zclient_reset ();
3004 access_list_reset ();
3005 prefix_list_reset ();
3008 /* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
3009 value. */
3011 bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
3013 u_char *pnt;
3014 u_char *lim;
3015 struct prefix p;
3016 int psize;
3017 int ret;
3019 /* Check peer status. */
3020 if (peer->status != Established)
3021 return 0;
3023 pnt = packet->nlri;
3024 lim = pnt + packet->length;
3026 for (; pnt < lim; pnt += psize)
3028 /* Clear prefix structure. */
3029 memset (&p, 0, sizeof (struct prefix));
3031 /* Fetch prefix length. */
3032 p.prefixlen = *pnt++;
3033 p.family = afi2family (packet->afi);
3035 /* Already checked in nlri_sanity_check(). We do double check
3036 here. */
3037 if ((packet->afi == AFI_IP && p.prefixlen > 32)
3038 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
3039 return -1;
3041 /* Packet size overflow check. */
3042 psize = PSIZE (p.prefixlen);
3044 /* When packet overflow occur return immediately. */
3045 if (pnt + psize > lim)
3046 return -1;
3048 /* Fetch prefix from NLRI packet. */
3049 memcpy (&p.u.prefix, pnt, psize);
3051 /* Check address. */
3052 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3054 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3057 * From draft-ietf-idr-bgp4-22, Section 6.3:
3058 * If a BGP router receives an UPDATE message with a
3059 * semantically incorrect NLRI field, in which a prefix is
3060 * semantically incorrect (eg. an unexpected multicast IP
3061 * address), it should ignore the prefix.
3063 zlog (peer->log, LOG_ERR,
3064 "IPv4 unicast NLRI is multicast address %s",
3065 inet_ntoa (p.u.prefix4));
3067 return -1;
3071 #ifdef HAVE_IPV6
3072 /* Check address. */
3073 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3075 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3077 char buf[BUFSIZ];
3079 zlog (peer->log, LOG_WARNING,
3080 "IPv6 link-local NLRI received %s ignore this NLRI",
3081 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3083 continue;
3086 #endif /* HAVE_IPV6 */
3088 /* Normal process. */
3089 if (attr)
3090 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3091 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3092 else
3093 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3094 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3096 /* Address family configuration mismatch or maximum-prefix count
3097 overflow. */
3098 if (ret < 0)
3099 return -1;
3102 /* Packet length consistency check. */
3103 if (pnt != lim)
3104 return -1;
3106 return 0;
3109 /* NLRI encode syntax check routine. */
3111 bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3112 bgp_size_t length)
3114 u_char *end;
3115 u_char prefixlen;
3116 int psize;
3118 end = pnt + length;
3120 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3121 syntactic validity. If the field is syntactically incorrect,
3122 then the Error Subcode is set to Invalid Network Field. */
3124 while (pnt < end)
3126 prefixlen = *pnt++;
3128 /* Prefix length check. */
3129 if ((afi == AFI_IP && prefixlen > 32)
3130 || (afi == AFI_IP6 && prefixlen > 128))
3132 plog_err (peer->log,
3133 "%s [Error] Update packet error (wrong prefix length %d)",
3134 peer->host, prefixlen);
3135 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3136 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3137 return -1;
3140 /* Packet size overflow check. */
3141 psize = PSIZE (prefixlen);
3143 if (pnt + psize > end)
3145 plog_err (peer->log,
3146 "%s [Error] Update packet error"
3147 " (prefix data overflow prefix size is %d)",
3148 peer->host, psize);
3149 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3150 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3151 return -1;
3154 pnt += psize;
3157 /* Packet length consistency check. */
3158 if (pnt != end)
3160 plog_err (peer->log,
3161 "%s [Error] Update packet error"
3162 " (prefix length mismatch with total length)",
3163 peer->host);
3164 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3165 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3166 return -1;
3168 return 0;
3171 static struct bgp_static *
3172 bgp_static_new (void)
3174 return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
3177 static void
3178 bgp_static_free (struct bgp_static *bgp_static)
3180 if (bgp_static->rmap.name)
3181 free (bgp_static->rmap.name);
3182 XFREE (MTYPE_BGP_STATIC, bgp_static);
3185 static void
3186 bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3187 struct prefix *p, afi_t afi, safi_t safi)
3189 struct bgp_node *rn;
3190 struct bgp_info *ri;
3192 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3194 /* Check selected route and self inserted route. */
3195 for (ri = rn->info; ri; ri = ri->next)
3196 if (ri->peer == bgp->peer_self
3197 && ri->type == ZEBRA_ROUTE_BGP
3198 && ri->sub_type == BGP_ROUTE_STATIC)
3199 break;
3201 /* Withdraw static BGP route from routing table. */
3202 if (ri)
3204 bgp_info_delete (rn, ri);
3205 bgp_process (bgp, rn, afi, safi);
3208 /* Unlock bgp_node_lookup. */
3209 bgp_unlock_node (rn);
3212 static void
3213 bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
3214 struct bgp_static *bgp_static,
3215 afi_t afi, safi_t safi)
3217 struct bgp_node *rn;
3218 struct bgp_info *ri;
3219 struct bgp_info *new;
3220 struct bgp_info info;
3221 struct attr *attr_new;
3222 struct attr attr = {0 };
3223 struct attr new_attr = { .extra = 0 };
3224 struct bgp *bgp;
3225 int ret;
3226 char buf[SU_ADDRSTRLEN];
3228 bgp = rsclient->bgp;
3230 assert (bgp_static);
3231 if (!bgp_static)
3232 return;
3234 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3236 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3238 attr.nexthop = bgp_static->igpnexthop;
3239 attr.med = bgp_static->igpmetric;
3240 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3242 if (bgp_static->ttl)
3244 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT);
3245 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3246 attr.pathlimit.as = 0;
3247 attr.pathlimit.ttl = bgp_static->ttl;
3250 if (bgp_static->atomic)
3251 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3253 /* Apply network route-map for export to this rsclient. */
3254 if (bgp_static->rmap.name)
3256 struct attr attr_tmp = attr;
3257 info.peer = rsclient;
3258 info.attr = &attr_tmp;
3260 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3261 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3263 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3265 rsclient->rmap_type = 0;
3267 if (ret == RMAP_DENYMATCH)
3269 /* Free uninterned attribute. */
3270 bgp_attr_flush (&attr_tmp);
3272 /* Unintern original. */
3273 aspath_unintern (attr.aspath);
3274 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3275 bgp_attr_extra_free (&attr);
3277 return;
3279 attr_new = bgp_attr_intern (&attr_tmp);
3281 else
3282 attr_new = bgp_attr_intern (&attr);
3284 new_attr = *attr_new;
3286 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3288 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3289 == RMAP_DENY)
3291 /* This BGP update is filtered. Log the reason then update BGP entry. */
3292 if (BGP_DEBUG (update, UPDATE_IN))
3293 zlog (rsclient->log, LOG_DEBUG,
3294 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3295 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3296 p->prefixlen, rsclient->host);
3298 bgp->peer_self->rmap_type = 0;
3300 bgp_attr_unintern (attr_new);
3301 aspath_unintern (attr.aspath);
3302 bgp_attr_extra_free (&attr);
3304 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3306 return;
3309 bgp->peer_self->rmap_type = 0;
3311 bgp_attr_unintern (attr_new);
3312 attr_new = bgp_attr_intern (&new_attr);
3314 for (ri = rn->info; ri; ri = ri->next)
3315 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3316 && ri->sub_type == BGP_ROUTE_STATIC)
3317 break;
3319 if (ri)
3321 if (attrhash_cmp (ri->attr, attr_new) &&
3322 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3324 bgp_unlock_node (rn);
3325 bgp_attr_unintern (attr_new);
3326 aspath_unintern (attr.aspath);
3327 bgp_attr_extra_free (&attr);
3328 return;
3330 else
3332 /* The attribute is changed. */
3333 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3335 /* Rewrite BGP route information. */
3336 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3337 bgp_info_restore(rn, ri);
3338 bgp_attr_unintern (ri->attr);
3339 ri->attr = attr_new;
3340 ri->uptime = bgp_clock ();
3342 /* Process change. */
3343 bgp_process (bgp, rn, afi, safi);
3344 bgp_unlock_node (rn);
3345 aspath_unintern (attr.aspath);
3346 bgp_attr_extra_free (&attr);
3347 return;
3351 /* Make new BGP info. */
3352 new = bgp_info_new ();
3353 new->type = ZEBRA_ROUTE_BGP;
3354 new->sub_type = BGP_ROUTE_STATIC;
3355 new->peer = bgp->peer_self;
3356 SET_FLAG (new->flags, BGP_INFO_VALID);
3357 new->attr = attr_new;
3358 new->uptime = bgp_clock ();
3360 /* Register new BGP information. */
3361 bgp_info_add (rn, new);
3363 /* route_node_get lock */
3364 bgp_unlock_node (rn);
3366 /* Process change. */
3367 bgp_process (bgp, rn, afi, safi);
3369 /* Unintern original. */
3370 aspath_unintern (attr.aspath);
3371 bgp_attr_extra_free (&attr);
3374 static void
3375 bgp_static_update_main (struct bgp *bgp, struct prefix *p,
3376 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3378 struct bgp_node *rn;
3379 struct bgp_info *ri;
3380 struct bgp_info *new;
3381 struct bgp_info info;
3382 struct attr attr = { 0 };
3383 struct attr *attr_new;
3384 int ret;
3386 assert (bgp_static);
3387 if (!bgp_static)
3388 return;
3390 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3392 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3394 attr.nexthop = bgp_static->igpnexthop;
3395 attr.med = bgp_static->igpmetric;
3396 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3398 if (bgp_static->ttl)
3400 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT);
3401 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3402 attr.pathlimit.as = 0;
3403 attr.pathlimit.ttl = bgp_static->ttl;
3406 if (bgp_static->atomic)
3407 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3409 /* Apply route-map. */
3410 if (bgp_static->rmap.name)
3412 struct attr attr_tmp = attr;
3413 info.peer = bgp->peer_self;
3414 info.attr = &attr_tmp;
3416 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3418 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3420 bgp->peer_self->rmap_type = 0;
3422 if (ret == RMAP_DENYMATCH)
3424 /* Free uninterned attribute. */
3425 bgp_attr_flush (&attr_tmp);
3427 /* Unintern original. */
3428 aspath_unintern (attr.aspath);
3429 bgp_attr_extra_free (&attr);
3430 bgp_static_withdraw (bgp, p, afi, safi);
3431 return;
3433 attr_new = bgp_attr_intern (&attr_tmp);
3435 else
3436 attr_new = bgp_attr_intern (&attr);
3438 for (ri = rn->info; ri; ri = ri->next)
3439 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3440 && ri->sub_type == BGP_ROUTE_STATIC)
3441 break;
3443 if (ri)
3445 if (attrhash_cmp (ri->attr, attr_new) &&
3446 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3448 bgp_unlock_node (rn);
3449 bgp_attr_unintern (attr_new);
3450 aspath_unintern (attr.aspath);
3451 bgp_attr_extra_free (&attr);
3452 return;
3454 else
3456 /* The attribute is changed. */
3457 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3459 /* Rewrite BGP route information. */
3460 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3461 bgp_info_restore(rn, ri);
3462 else
3463 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3464 bgp_attr_unintern (ri->attr);
3465 ri->attr = attr_new;
3466 ri->uptime = bgp_clock ();
3468 /* Process change. */
3469 bgp_aggregate_increment (bgp, p, ri, afi, safi);
3470 bgp_process (bgp, rn, afi, safi);
3471 bgp_unlock_node (rn);
3472 aspath_unintern (attr.aspath);
3473 bgp_attr_extra_free (&attr);
3474 return;
3478 /* Make new BGP info. */
3479 new = bgp_info_new ();
3480 new->type = ZEBRA_ROUTE_BGP;
3481 new->sub_type = BGP_ROUTE_STATIC;
3482 new->peer = bgp->peer_self;
3483 SET_FLAG (new->flags, BGP_INFO_VALID);
3484 new->attr = attr_new;
3485 new->uptime = bgp_clock ();
3487 /* Aggregate address increment. */
3488 bgp_aggregate_increment (bgp, p, new, afi, safi);
3490 /* Register new BGP information. */
3491 bgp_info_add (rn, new);
3493 /* route_node_get lock */
3494 bgp_unlock_node (rn);
3496 /* Process change. */
3497 bgp_process (bgp, rn, afi, safi);
3499 /* Unintern original. */
3500 aspath_unintern (attr.aspath);
3501 bgp_attr_extra_free (&attr);
3504 void
3505 bgp_static_update (struct bgp *bgp, struct prefix *p,
3506 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3508 struct peer *rsclient;
3509 struct listnode *node, *nnode;
3511 bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3513 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
3515 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3516 bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
3520 static void
3521 bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
3522 u_char safi, struct prefix_rd *prd, u_char *tag)
3524 struct bgp_node *rn;
3525 struct bgp_info *new;
3527 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3529 /* Make new BGP info. */
3530 new = bgp_info_new ();
3531 new->type = ZEBRA_ROUTE_BGP;
3532 new->sub_type = BGP_ROUTE_STATIC;
3533 new->peer = bgp->peer_self;
3534 new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3535 SET_FLAG (new->flags, BGP_INFO_VALID);
3536 new->uptime = bgp_clock ();
3537 new->extra = bgp_info_extra_new();
3538 memcpy (new->extra->tag, tag, 3);
3540 /* Aggregate address increment. */
3541 bgp_aggregate_increment (bgp, p, new, afi, safi);
3543 /* Register new BGP information. */
3544 bgp_info_add (rn, new);
3546 /* route_node_get lock */
3547 bgp_unlock_node (rn);
3549 /* Process change. */
3550 bgp_process (bgp, rn, afi, safi);
3553 void
3554 bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3555 safi_t safi)
3557 struct bgp_node *rn;
3558 struct bgp_info *ri;
3560 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3562 /* Check selected route and self inserted route. */
3563 for (ri = rn->info; ri; ri = ri->next)
3564 if (ri->peer == bgp->peer_self
3565 && ri->type == ZEBRA_ROUTE_BGP
3566 && ri->sub_type == BGP_ROUTE_STATIC)
3567 break;
3569 /* Withdraw static BGP route from routing table. */
3570 if (ri)
3572 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3573 bgp_info_delete (rn, ri);
3574 bgp_process (bgp, rn, afi, safi);
3577 /* Unlock bgp_node_lookup. */
3578 bgp_unlock_node (rn);
3581 void
3582 bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3584 struct bgp_static *bgp_static;
3585 struct bgp *bgp;
3586 struct bgp_node *rn;
3587 struct prefix *p;
3589 bgp = rsclient->bgp;
3591 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3592 if ((bgp_static = rn->info) != NULL)
3594 p = &rn->p;
3596 bgp_static_update_rsclient (rsclient, p, bgp_static,
3597 afi, safi);
3601 static void
3602 bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
3603 u_char safi, struct prefix_rd *prd, u_char *tag)
3605 struct bgp_node *rn;
3606 struct bgp_info *ri;
3608 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3610 /* Check selected route and self inserted route. */
3611 for (ri = rn->info; ri; ri = ri->next)
3612 if (ri->peer == bgp->peer_self
3613 && ri->type == ZEBRA_ROUTE_BGP
3614 && ri->sub_type == BGP_ROUTE_STATIC)
3615 break;
3617 /* Withdraw static BGP route from routing table. */
3618 if (ri)
3620 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3621 bgp_info_delete (rn, ri);
3622 bgp_process (bgp, rn, afi, safi);
3625 /* Unlock bgp_node_lookup. */
3626 bgp_unlock_node (rn);
3629 static void
3630 bgp_pathlimit_update_parents (struct bgp *bgp, struct bgp_node *rn,
3631 int ttl_edge)
3633 struct bgp_node *parent = rn;
3634 struct bgp_static *sp;
3636 /* Existing static changed TTL, search parents and adjust their atomic */
3637 while ((parent = parent->parent))
3638 if ((sp = parent->info))
3640 int sp_level = (sp->atomic ? 1 : 0);
3641 ttl_edge ? sp->atomic++ : sp->atomic--;
3643 /* did we change state of parent whether atomic is set or not? */
3644 if (sp_level != (sp->atomic ? 1 : 0))
3646 bgp_static_update (bgp, &parent->p, sp,
3647 rn->table->afi, rn->table->safi);
3652 /* Configure static BGP network. When user don't run zebra, static
3653 route should be installed as valid. */
3654 static int
3655 bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
3656 u_int16_t afi, u_char safi, const char *rmap, int backdoor,
3657 u_char ttl)
3659 int ret;
3660 struct prefix p;
3661 struct bgp_static *bgp_static;
3662 struct bgp_node *rn;
3663 u_char need_update = 0;
3664 u_char ttl_change = 0;
3665 u_char ttl_edge = (ttl ? 1 : 0);
3666 u_char new = 0;
3668 /* Convert IP prefix string to struct prefix. */
3669 ret = str2prefix (ip_str, &p);
3670 if (! ret)
3672 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3673 return CMD_WARNING;
3675 #ifdef HAVE_IPV6
3676 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3678 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3679 VTY_NEWLINE);
3680 return CMD_WARNING;
3682 #endif /* HAVE_IPV6 */
3684 apply_mask (&p);
3686 /* Set BGP static route configuration. */
3687 rn = bgp_node_get (bgp->route[afi][safi], &p);
3689 if (rn->info)
3691 /* Configuration change. */
3692 bgp_static = rn->info;
3694 /* Check previous routes are installed into BGP. */
3695 if (bgp_static->valid)
3697 if (bgp_static->backdoor != backdoor
3698 || bgp_static->ttl != ttl)
3699 need_update = 1;
3702 /* need to catch TTL set/unset transitions for handling of
3703 * ATOMIC_AGGREGATE
3705 if ((bgp_static->ttl ? 1 : 0) != ttl_edge)
3706 ttl_change = 1;
3708 bgp_static->backdoor = backdoor;
3709 bgp_static->ttl = ttl;
3711 if (rmap)
3713 if (bgp_static->rmap.name)
3714 free (bgp_static->rmap.name);
3715 bgp_static->rmap.name = strdup (rmap);
3716 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3718 else
3720 if (bgp_static->rmap.name)
3721 free (bgp_static->rmap.name);
3722 bgp_static->rmap.name = NULL;
3723 bgp_static->rmap.map = NULL;
3724 bgp_static->valid = 0;
3726 bgp_unlock_node (rn);
3728 else
3730 /* New configuration. */
3731 bgp_static = bgp_static_new ();
3732 bgp_static->backdoor = backdoor;
3733 bgp_static->valid = 0;
3734 bgp_static->igpmetric = 0;
3735 bgp_static->igpnexthop.s_addr = 0;
3736 bgp_static->ttl = ttl;
3737 ttl_change = ttl_edge;
3738 new = 1;
3740 if (rmap)
3742 if (bgp_static->rmap.name)
3743 free (bgp_static->rmap.name);
3744 bgp_static->rmap.name = strdup (rmap);
3745 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3747 rn->info = bgp_static;
3750 /* ".. sites that choose to advertise the
3751 * AS_PATHLIMIT path attribute SHOULD advertise the ATOMIC_AGGREGATE on
3752 * all less specific covering prefixes as well as the more specific
3753 * prefixes."
3755 * So:
3756 * Prefix that has just had pathlimit set/unset:
3757 * - Must bump ATOMIC refcount on all parents.
3759 * To catch less specific prefixes:
3760 * - Must search children for ones with TTL, bump atomic refcount
3761 * (we dont care if we're deleting a less specific prefix..)
3763 if (ttl_change)
3765 /* Existing static changed TTL, search parents and adjust their atomic */
3766 bgp_pathlimit_update_parents (bgp, rn, ttl_edge);
3769 if (new)
3771 struct bgp_node *child;
3772 struct bgp_static *sc;
3774 /* New static, search children and bump this statics atomic.. */
3775 child = bgp_lock_node (rn); /* route_next_until unlocks it.. */
3776 while ((child = bgp_route_next_until (child, rn)))
3778 if ((sc = child->info) && sc->ttl)
3779 bgp_static->atomic++;
3783 /* If BGP scan is not enabled, we should install this route here. */
3784 if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3786 bgp_static->valid = 1;
3788 if (need_update)
3789 bgp_static_withdraw (bgp, &p, afi, safi);
3791 if (! bgp_static->backdoor)
3792 bgp_static_update (bgp, &p, bgp_static, afi, safi);
3795 return CMD_SUCCESS;
3798 /* Configure static BGP network. */
3799 static int
3800 bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
3801 u_int16_t afi, u_char safi)
3803 int ret;
3804 struct prefix p;
3805 struct bgp_static *bgp_static;
3806 struct bgp_node *rn;
3808 /* Convert IP prefix string to struct prefix. */
3809 ret = str2prefix (ip_str, &p);
3810 if (! ret)
3812 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3813 return CMD_WARNING;
3815 #ifdef HAVE_IPV6
3816 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3818 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3819 VTY_NEWLINE);
3820 return CMD_WARNING;
3822 #endif /* HAVE_IPV6 */
3824 apply_mask (&p);
3826 rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3827 if (! rn)
3829 vty_out (vty, "%% Can't find specified static route configuration.%s",
3830 VTY_NEWLINE);
3831 return CMD_WARNING;
3834 bgp_static = rn->info;
3836 /* decrement atomic in parents, see bgp_static_set */
3837 bgp_pathlimit_update_parents (bgp, rn, 0);
3839 /* Update BGP RIB. */
3840 if (! bgp_static->backdoor)
3841 bgp_static_withdraw (bgp, &p, afi, safi);
3843 /* Clear configuration. */
3844 bgp_static_free (bgp_static);
3845 rn->info = NULL;
3846 bgp_unlock_node (rn);
3847 bgp_unlock_node (rn);
3849 return CMD_SUCCESS;
3852 /* Called from bgp_delete(). Delete all static routes from the BGP
3853 instance. */
3854 void
3855 bgp_static_delete (struct bgp *bgp)
3857 afi_t afi;
3858 safi_t safi;
3859 struct bgp_node *rn;
3860 struct bgp_node *rm;
3861 struct bgp_table *table;
3862 struct bgp_static *bgp_static;
3864 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3865 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3866 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3867 if (rn->info != NULL)
3869 if (safi == SAFI_MPLS_VPN)
3871 table = rn->info;
3873 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3875 bgp_static = rn->info;
3876 bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3877 AFI_IP, SAFI_MPLS_VPN,
3878 (struct prefix_rd *)&rn->p,
3879 bgp_static->tag);
3880 bgp_static_free (bgp_static);
3881 rn->info = NULL;
3882 bgp_unlock_node (rn);
3885 else
3887 bgp_static = rn->info;
3888 bgp_static_withdraw (bgp, &rn->p, afi, safi);
3889 bgp_static_free (bgp_static);
3890 rn->info = NULL;
3891 bgp_unlock_node (rn);
3897 bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3898 const char *tag_str)
3900 int ret;
3901 struct prefix p;
3902 struct prefix_rd prd;
3903 struct bgp *bgp;
3904 struct bgp_node *prn;
3905 struct bgp_node *rn;
3906 struct bgp_table *table;
3907 struct bgp_static *bgp_static;
3908 u_char tag[3];
3910 bgp = vty->index;
3912 ret = str2prefix (ip_str, &p);
3913 if (! ret)
3915 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3916 return CMD_WARNING;
3918 apply_mask (&p);
3920 ret = str2prefix_rd (rd_str, &prd);
3921 if (! ret)
3923 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3924 return CMD_WARNING;
3927 ret = str2tag (tag_str, tag);
3928 if (! ret)
3930 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3931 return CMD_WARNING;
3934 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3935 (struct prefix *)&prd);
3936 if (prn->info == NULL)
3937 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
3938 else
3939 bgp_unlock_node (prn);
3940 table = prn->info;
3942 rn = bgp_node_get (table, &p);
3944 if (rn->info)
3946 vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3947 bgp_unlock_node (rn);
3949 else
3951 /* New configuration. */
3952 bgp_static = bgp_static_new ();
3953 bgp_static->valid = 1;
3954 memcpy (bgp_static->tag, tag, 3);
3955 rn->info = bgp_static;
3957 bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3960 return CMD_SUCCESS;
3963 /* Configure static BGP network. */
3965 bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3966 const char *rd_str, const char *tag_str)
3968 int ret;
3969 struct bgp *bgp;
3970 struct prefix p;
3971 struct prefix_rd prd;
3972 struct bgp_node *prn;
3973 struct bgp_node *rn;
3974 struct bgp_table *table;
3975 struct bgp_static *bgp_static;
3976 u_char tag[3];
3978 bgp = vty->index;
3980 /* Convert IP prefix string to struct prefix. */
3981 ret = str2prefix (ip_str, &p);
3982 if (! ret)
3984 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3985 return CMD_WARNING;
3987 apply_mask (&p);
3989 ret = str2prefix_rd (rd_str, &prd);
3990 if (! ret)
3992 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3993 return CMD_WARNING;
3996 ret = str2tag (tag_str, tag);
3997 if (! ret)
3999 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
4000 return CMD_WARNING;
4003 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
4004 (struct prefix *)&prd);
4005 if (prn->info == NULL)
4006 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
4007 else
4008 bgp_unlock_node (prn);
4009 table = prn->info;
4011 rn = bgp_node_lookup (table, &p);
4013 if (rn)
4015 bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
4017 bgp_static = rn->info;
4018 bgp_static_free (bgp_static);
4019 rn->info = NULL;
4020 bgp_unlock_node (rn);
4021 bgp_unlock_node (rn);
4023 else
4024 vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
4026 return CMD_SUCCESS;
4029 DEFUN (bgp_network,
4030 bgp_network_cmd,
4031 "network A.B.C.D/M",
4032 "Specify a network to announce via BGP\n"
4033 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4035 u_char ttl = 0;
4037 if (argc == 2)
4038 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4040 return bgp_static_set (vty, vty->index, argv[0],
4041 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
4044 ALIAS (bgp_network,
4045 bgp_network_ttl_cmd,
4046 "network A.B.C.D/M pathlimit <0-255>",
4047 "Specify a network to announce via BGP\n"
4048 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4049 "AS-Path hopcount limit attribute\n"
4050 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4052 DEFUN (bgp_network_route_map,
4053 bgp_network_route_map_cmd,
4054 "network A.B.C.D/M route-map WORD",
4055 "Specify a network to announce via BGP\n"
4056 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4057 "Route-map to modify the attributes\n"
4058 "Name of the route map\n")
4060 return bgp_static_set (vty, vty->index, argv[0],
4061 AFI_IP, bgp_node_safi (vty), argv[1], 0, 0);
4064 DEFUN (bgp_network_backdoor,
4065 bgp_network_backdoor_cmd,
4066 "network A.B.C.D/M backdoor",
4067 "Specify a network to announce via BGP\n"
4068 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4069 "Specify a BGP backdoor route\n")
4071 u_char ttl = 0;
4073 if (argc == 2)
4074 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4076 return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
4077 NULL, 1, ttl);
4080 ALIAS (bgp_network_backdoor,
4081 bgp_network_backdoor_ttl_cmd,
4082 "network A.B.C.D/M backdoor pathlimit <0-255>",
4083 "Specify a network to announce via BGP\n"
4084 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4085 "Specify a BGP backdoor route\n"
4086 "AS-Path hopcount limit attribute\n"
4087 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4089 DEFUN (bgp_network_mask,
4090 bgp_network_mask_cmd,
4091 "network A.B.C.D mask A.B.C.D",
4092 "Specify a network to announce via BGP\n"
4093 "Network number\n"
4094 "Network mask\n"
4095 "Network mask\n")
4097 int ret;
4098 char prefix_str[BUFSIZ];
4099 u_char ttl = 0;
4101 if (argc == 3)
4102 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[2], 1, 255);
4104 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4105 if (! ret)
4107 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4108 return CMD_WARNING;
4111 return bgp_static_set (vty, vty->index, prefix_str,
4112 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
4115 ALIAS (bgp_network_mask,
4116 bgp_network_mask_ttl_cmd,
4117 "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4118 "Specify a network to announce via BGP\n"
4119 "Network number\n"
4120 "Network mask\n"
4121 "Network mask\n"
4122 "AS-Path hopcount limit attribute\n"
4123 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4125 DEFUN (bgp_network_mask_route_map,
4126 bgp_network_mask_route_map_cmd,
4127 "network A.B.C.D mask A.B.C.D route-map WORD",
4128 "Specify a network to announce via BGP\n"
4129 "Network number\n"
4130 "Network mask\n"
4131 "Network mask\n"
4132 "Route-map to modify the attributes\n"
4133 "Name of the route map\n")
4135 int ret;
4136 char prefix_str[BUFSIZ];
4138 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4139 if (! ret)
4141 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4142 return CMD_WARNING;
4145 return bgp_static_set (vty, vty->index, prefix_str,
4146 AFI_IP, bgp_node_safi (vty), argv[2], 0, 0);
4149 DEFUN (bgp_network_mask_backdoor,
4150 bgp_network_mask_backdoor_cmd,
4151 "network A.B.C.D mask A.B.C.D backdoor",
4152 "Specify a network to announce via BGP\n"
4153 "Network number\n"
4154 "Network mask\n"
4155 "Network mask\n"
4156 "Specify a BGP backdoor route\n")
4158 int ret;
4159 char prefix_str[BUFSIZ];
4160 u_char ttl = 0;
4162 if (argc == 3)
4163 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[2], 1, 255);
4165 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4166 if (! ret)
4168 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4169 return CMD_WARNING;
4172 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4173 NULL, 1, ttl);
4176 ALIAS (bgp_network_mask_backdoor,
4177 bgp_network_mask_backdoor_ttl_cmd,
4178 "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4179 "Specify a network to announce via BGP\n"
4180 "Network number\n"
4181 "Network mask\n"
4182 "Network mask\n"
4183 "Specify a BGP backdoor route\n"
4184 "AS-Path hopcount limit attribute\n"
4185 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4187 DEFUN (bgp_network_mask_natural,
4188 bgp_network_mask_natural_cmd,
4189 "network A.B.C.D",
4190 "Specify a network to announce via BGP\n"
4191 "Network number\n")
4193 int ret;
4194 char prefix_str[BUFSIZ];
4195 u_char ttl = 0;
4197 if (argc == 2)
4198 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4200 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4201 if (! ret)
4203 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4204 return CMD_WARNING;
4207 return bgp_static_set (vty, vty->index, prefix_str,
4208 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
4211 ALIAS (bgp_network_mask_natural,
4212 bgp_network_mask_natural_ttl_cmd,
4213 "network A.B.C.D pathlimit <0-255>",
4214 "Specify a network to announce via BGP\n"
4215 "Network number\n"
4216 "AS-Path hopcount limit attribute\n"
4217 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4219 DEFUN (bgp_network_mask_natural_route_map,
4220 bgp_network_mask_natural_route_map_cmd,
4221 "network A.B.C.D route-map WORD",
4222 "Specify a network to announce via BGP\n"
4223 "Network number\n"
4224 "Route-map to modify the attributes\n"
4225 "Name of the route map\n")
4227 int ret;
4228 char prefix_str[BUFSIZ];
4230 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4231 if (! ret)
4233 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4234 return CMD_WARNING;
4237 return bgp_static_set (vty, vty->index, prefix_str,
4238 AFI_IP, bgp_node_safi (vty), argv[1], 0, 0);
4241 DEFUN (bgp_network_mask_natural_backdoor,
4242 bgp_network_mask_natural_backdoor_cmd,
4243 "network A.B.C.D backdoor",
4244 "Specify a network to announce via BGP\n"
4245 "Network number\n"
4246 "Specify a BGP backdoor route\n")
4248 int ret;
4249 char prefix_str[BUFSIZ];
4250 u_char ttl = 0;
4252 if (argc == 2)
4253 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4255 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4256 if (! ret)
4258 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4259 return CMD_WARNING;
4262 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4263 NULL, 1, ttl);
4266 ALIAS (bgp_network_mask_natural_backdoor,
4267 bgp_network_mask_natural_backdoor_ttl_cmd,
4268 "network A.B.C.D backdoor pathlimit (1-255>",
4269 "Specify a network to announce via BGP\n"
4270 "Network number\n"
4271 "Specify a BGP backdoor route\n"
4272 "AS-Path hopcount limit attribute\n"
4273 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4275 DEFUN (no_bgp_network,
4276 no_bgp_network_cmd,
4277 "no network A.B.C.D/M",
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")
4282 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4283 bgp_node_safi (vty));
4286 ALIAS (no_bgp_network,
4287 no_bgp_network_ttl_cmd,
4288 "no network A.B.C.D/M pathlimit <0-255>",
4289 NO_STR
4290 "Specify a network to announce via BGP\n"
4291 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4292 "AS-Path hopcount limit attribute\n"
4293 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4295 ALIAS (no_bgp_network,
4296 no_bgp_network_route_map_cmd,
4297 "no network A.B.C.D/M route-map WORD",
4298 NO_STR
4299 "Specify a network to announce via BGP\n"
4300 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4301 "Route-map to modify the attributes\n"
4302 "Name of the route map\n")
4304 ALIAS (no_bgp_network,
4305 no_bgp_network_backdoor_cmd,
4306 "no network A.B.C.D/M backdoor",
4307 NO_STR
4308 "Specify a network to announce via BGP\n"
4309 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4310 "Specify a BGP backdoor route\n")
4312 ALIAS (no_bgp_network,
4313 no_bgp_network_backdoor_ttl_cmd,
4314 "no network A.B.C.D/M backdoor pathlimit <0-255>",
4315 NO_STR
4316 "Specify a network to announce via BGP\n"
4317 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4318 "Specify a BGP backdoor route\n"
4319 "AS-Path hopcount limit attribute\n"
4320 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4322 DEFUN (no_bgp_network_mask,
4323 no_bgp_network_mask_cmd,
4324 "no network A.B.C.D mask A.B.C.D",
4325 NO_STR
4326 "Specify a network to announce via BGP\n"
4327 "Network number\n"
4328 "Network mask\n"
4329 "Network mask\n")
4331 int ret;
4332 char prefix_str[BUFSIZ];
4334 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4335 if (! ret)
4337 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4338 return CMD_WARNING;
4341 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4342 bgp_node_safi (vty));
4345 ALIAS (no_bgp_network,
4346 no_bgp_network_mask_ttl_cmd,
4347 "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4348 NO_STR
4349 "Specify a network to announce via BGP\n"
4350 "Network number\n"
4351 "Network mask\n"
4352 "Network mask\n"
4353 "AS-Path hopcount limit attribute\n"
4354 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4356 ALIAS (no_bgp_network_mask,
4357 no_bgp_network_mask_route_map_cmd,
4358 "no network A.B.C.D mask A.B.C.D route-map WORD",
4359 NO_STR
4360 "Specify a network to announce via BGP\n"
4361 "Network number\n"
4362 "Network mask\n"
4363 "Network mask\n"
4364 "Route-map to modify the attributes\n"
4365 "Name of the route map\n")
4367 ALIAS (no_bgp_network_mask,
4368 no_bgp_network_mask_backdoor_cmd,
4369 "no network A.B.C.D mask A.B.C.D backdoor",
4370 NO_STR
4371 "Specify a network to announce via BGP\n"
4372 "Network number\n"
4373 "Network mask\n"
4374 "Network mask\n"
4375 "Specify a BGP backdoor route\n")
4377 ALIAS (no_bgp_network_mask,
4378 no_bgp_network_mask_backdoor_ttl_cmd,
4379 "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4380 NO_STR
4381 "Specify a network to announce via BGP\n"
4382 "Network number\n"
4383 "Network mask\n"
4384 "Network mask\n"
4385 "Specify a BGP backdoor route\n"
4386 "AS-Path hopcount limit attribute\n"
4387 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4389 DEFUN (no_bgp_network_mask_natural,
4390 no_bgp_network_mask_natural_cmd,
4391 "no network A.B.C.D",
4392 NO_STR
4393 "Specify a network to announce via BGP\n"
4394 "Network number\n")
4396 int ret;
4397 char prefix_str[BUFSIZ];
4399 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4400 if (! ret)
4402 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4403 return CMD_WARNING;
4406 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4407 bgp_node_safi (vty));
4410 ALIAS (no_bgp_network_mask_natural,
4411 no_bgp_network_mask_natural_route_map_cmd,
4412 "no network A.B.C.D route-map WORD",
4413 NO_STR
4414 "Specify a network to announce via BGP\n"
4415 "Network number\n"
4416 "Route-map to modify the attributes\n"
4417 "Name of the route map\n")
4419 ALIAS (no_bgp_network_mask_natural,
4420 no_bgp_network_mask_natural_backdoor_cmd,
4421 "no network A.B.C.D backdoor",
4422 NO_STR
4423 "Specify a network to announce via BGP\n"
4424 "Network number\n"
4425 "Specify a BGP backdoor route\n")
4427 ALIAS (no_bgp_network_mask_natural,
4428 no_bgp_network_mask_natural_ttl_cmd,
4429 "no network A.B.C.D pathlimit <0-255>",
4430 NO_STR
4431 "Specify a network to announce via BGP\n"
4432 "Network number\n"
4433 "AS-Path hopcount limit attribute\n"
4434 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4436 ALIAS (no_bgp_network_mask_natural,
4437 no_bgp_network_mask_natural_backdoor_ttl_cmd,
4438 "no network A.B.C.D backdoor pathlimit <0-255>",
4439 NO_STR
4440 "Specify a network to announce via BGP\n"
4441 "Network number\n"
4442 "Specify a BGP backdoor route\n"
4443 "AS-Path hopcount limit attribute\n"
4444 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4446 #ifdef HAVE_IPV6
4447 DEFUN (ipv6_bgp_network,
4448 ipv6_bgp_network_cmd,
4449 "network X:X::X:X/M",
4450 "Specify a network to announce via BGP\n"
4451 "IPv6 prefix <network>/<length>\n")
4453 u_char ttl = 0;
4455 if (argc == 2)
4456 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4458 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST,
4459 NULL, 0, ttl);
4462 ALIAS (ipv6_bgp_network,
4463 ipv6_bgp_network_ttl_cmd,
4464 "network X:X::X:X/M pathlimit <0-255>",
4465 "Specify a network to announce via BGP\n"
4466 "IPv6 prefix <network>/<length>\n"
4467 "AS-Path hopcount limit attribute\n"
4468 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4470 DEFUN (ipv6_bgp_network_route_map,
4471 ipv6_bgp_network_route_map_cmd,
4472 "network X:X::X:X/M route-map WORD",
4473 "Specify a network to announce via BGP\n"
4474 "IPv6 prefix <network>/<length>\n"
4475 "Route-map to modify the attributes\n"
4476 "Name of the route map\n")
4478 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
4479 bgp_node_safi (vty), argv[1], 0, 0);
4482 DEFUN (no_ipv6_bgp_network,
4483 no_ipv6_bgp_network_cmd,
4484 "no network X:X::X:X/M",
4485 NO_STR
4486 "Specify a network to announce via BGP\n"
4487 "IPv6 prefix <network>/<length>\n")
4489 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
4492 ALIAS (no_ipv6_bgp_network,
4493 no_ipv6_bgp_network_route_map_cmd,
4494 "no network X:X::X:X/M route-map WORD",
4495 NO_STR
4496 "Specify a network to announce via BGP\n"
4497 "IPv6 prefix <network>/<length>\n"
4498 "Route-map to modify the attributes\n"
4499 "Name of the route map\n")
4501 ALIAS (no_ipv6_bgp_network,
4502 no_ipv6_bgp_network_ttl_cmd,
4503 "no network X:X::X:X/M pathlimit <0-255>",
4504 NO_STR
4505 "Specify a network to announce via BGP\n"
4506 "IPv6 prefix <network>/<length>\n"
4507 "AS-Path hopcount limit attribute\n"
4508 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4510 ALIAS (ipv6_bgp_network,
4511 old_ipv6_bgp_network_cmd,
4512 "ipv6 bgp network X:X::X:X/M",
4513 IPV6_STR
4514 BGP_STR
4515 "Specify a network to announce via BGP\n"
4516 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4518 ALIAS (no_ipv6_bgp_network,
4519 old_no_ipv6_bgp_network_cmd,
4520 "no ipv6 bgp network X:X::X:X/M",
4521 NO_STR
4522 IPV6_STR
4523 BGP_STR
4524 "Specify a network to announce via BGP\n"
4525 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4526 #endif /* HAVE_IPV6 */
4528 /* Aggreagete address:
4530 advertise-map Set condition to advertise attribute
4531 as-set Generate AS set path information
4532 attribute-map Set attributes of aggregate
4533 route-map Set parameters of aggregate
4534 summary-only Filter more specific routes from updates
4535 suppress-map Conditionally filter more specific routes from updates
4536 <cr>
4538 struct bgp_aggregate
4540 /* Summary-only flag. */
4541 u_char summary_only;
4543 /* AS set generation. */
4544 u_char as_set;
4546 /* Route-map for aggregated route. */
4547 struct route_map *map;
4549 /* Suppress-count. */
4550 unsigned long count;
4552 /* SAFI configuration. */
4553 safi_t safi;
4556 static struct bgp_aggregate *
4557 bgp_aggregate_new (void)
4559 return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
4562 static void
4563 bgp_aggregate_free (struct bgp_aggregate *aggregate)
4565 XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4568 static void
4569 bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4570 afi_t afi, safi_t safi, struct bgp_info *del,
4571 struct bgp_aggregate *aggregate)
4573 struct bgp_table *table;
4574 struct bgp_node *top;
4575 struct bgp_node *rn;
4576 u_char origin;
4577 struct aspath *aspath = NULL;
4578 struct aspath *asmerge = NULL;
4579 struct community *community = NULL;
4580 struct community *commerge = NULL;
4581 struct in_addr nexthop;
4582 u_int32_t med = 0;
4583 struct bgp_info *ri;
4584 struct bgp_info *new;
4585 int first = 1;
4586 unsigned long match = 0;
4588 /* Record adding route's nexthop and med. */
4589 if (rinew)
4591 nexthop = rinew->attr->nexthop;
4592 med = rinew->attr->med;
4595 /* ORIGIN attribute: If at least one route among routes that are
4596 aggregated has ORIGIN with the value INCOMPLETE, then the
4597 aggregated route must have the ORIGIN attribute with the value
4598 INCOMPLETE. Otherwise, if at least one route among routes that
4599 are aggregated has ORIGIN with the value EGP, then the aggregated
4600 route must have the origin attribute with the value EGP. In all
4601 other case the value of the ORIGIN attribute of the aggregated
4602 route is INTERNAL. */
4603 origin = BGP_ORIGIN_IGP;
4605 table = bgp->rib[afi][safi];
4607 top = bgp_node_get (table, p);
4608 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4609 if (rn->p.prefixlen > p->prefixlen)
4611 match = 0;
4613 for (ri = rn->info; ri; ri = ri->next)
4615 if (BGP_INFO_HOLDDOWN (ri))
4616 continue;
4618 if (del && ri == del)
4619 continue;
4621 if (! rinew && first)
4623 nexthop = ri->attr->nexthop;
4624 med = ri->attr->med;
4625 first = 0;
4628 #ifdef AGGREGATE_NEXTHOP_CHECK
4629 if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4630 || ri->attr->med != med)
4632 if (aspath)
4633 aspath_free (aspath);
4634 if (community)
4635 community_free (community);
4636 bgp_unlock_node (rn);
4637 bgp_unlock_node (top);
4638 return;
4640 #endif /* AGGREGATE_NEXTHOP_CHECK */
4642 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4644 if (aggregate->summary_only)
4646 (bgp_info_extra_get (ri))->suppress++;
4647 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4648 match++;
4651 aggregate->count++;
4653 if (aggregate->as_set)
4655 if (origin < ri->attr->origin)
4656 origin = ri->attr->origin;
4658 if (aspath)
4660 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4661 aspath_free (aspath);
4662 aspath = asmerge;
4664 else
4665 aspath = aspath_dup (ri->attr->aspath);
4667 if (ri->attr->community)
4669 if (community)
4671 commerge = community_merge (community,
4672 ri->attr->community);
4673 community = community_uniq_sort (commerge);
4674 community_free (commerge);
4676 else
4677 community = community_dup (ri->attr->community);
4682 if (match)
4683 bgp_process (bgp, rn, afi, safi);
4685 bgp_unlock_node (top);
4687 if (rinew)
4689 aggregate->count++;
4691 if (aggregate->summary_only)
4692 (bgp_info_extra_get (rinew))->suppress++;
4694 if (aggregate->as_set)
4696 if (origin < rinew->attr->origin)
4697 origin = rinew->attr->origin;
4699 if (aspath)
4701 asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4702 aspath_free (aspath);
4703 aspath = asmerge;
4705 else
4706 aspath = aspath_dup (rinew->attr->aspath);
4708 if (rinew->attr->community)
4710 if (community)
4712 commerge = community_merge (community,
4713 rinew->attr->community);
4714 community = community_uniq_sort (commerge);
4715 community_free (commerge);
4717 else
4718 community = community_dup (rinew->attr->community);
4723 if (aggregate->count > 0)
4725 rn = bgp_node_get (table, p);
4726 new = bgp_info_new ();
4727 new->type = ZEBRA_ROUTE_BGP;
4728 new->sub_type = BGP_ROUTE_AGGREGATE;
4729 new->peer = bgp->peer_self;
4730 SET_FLAG (new->flags, BGP_INFO_VALID);
4731 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4732 new->uptime = bgp_clock ();
4734 bgp_info_add (rn, new);
4735 bgp_unlock_node (rn);
4736 bgp_process (bgp, rn, afi, safi);
4738 else
4740 if (aspath)
4741 aspath_free (aspath);
4742 if (community)
4743 community_free (community);
4747 void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4748 struct bgp_aggregate *);
4750 void
4751 bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4752 struct bgp_info *ri, afi_t afi, safi_t safi)
4754 struct bgp_node *child;
4755 struct bgp_node *rn;
4756 struct bgp_aggregate *aggregate;
4758 /* MPLS-VPN aggregation is not yet supported. */
4759 if (safi == SAFI_MPLS_VPN)
4760 return;
4762 if (p->prefixlen == 0)
4763 return;
4765 if (BGP_INFO_HOLDDOWN (ri))
4766 return;
4768 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4770 /* Aggregate address configuration check. */
4771 for (rn = child; rn; rn = rn->parent)
4772 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4774 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4775 bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
4777 bgp_unlock_node (child);
4780 void
4781 bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4782 struct bgp_info *del, afi_t afi, safi_t safi)
4784 struct bgp_node *child;
4785 struct bgp_node *rn;
4786 struct bgp_aggregate *aggregate;
4788 /* MPLS-VPN aggregation is not yet supported. */
4789 if (safi == SAFI_MPLS_VPN)
4790 return;
4792 if (p->prefixlen == 0)
4793 return;
4795 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4797 /* Aggregate address configuration check. */
4798 for (rn = child; rn; rn = rn->parent)
4799 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4801 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4802 bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
4804 bgp_unlock_node (child);
4807 static void
4808 bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4809 struct bgp_aggregate *aggregate)
4811 struct bgp_table *table;
4812 struct bgp_node *top;
4813 struct bgp_node *rn;
4814 struct bgp_info *new;
4815 struct bgp_info *ri;
4816 unsigned long match;
4817 u_char origin = BGP_ORIGIN_IGP;
4818 struct aspath *aspath = NULL;
4819 struct aspath *asmerge = NULL;
4820 struct community *community = NULL;
4821 struct community *commerge = NULL;
4823 table = bgp->rib[afi][safi];
4825 /* Sanity check. */
4826 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4827 return;
4828 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4829 return;
4831 /* If routes exists below this node, generate aggregate routes. */
4832 top = bgp_node_get (table, p);
4833 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4834 if (rn->p.prefixlen > p->prefixlen)
4836 match = 0;
4838 for (ri = rn->info; ri; ri = ri->next)
4840 if (BGP_INFO_HOLDDOWN (ri))
4841 continue;
4843 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4845 /* summary-only aggregate route suppress aggregated
4846 route announcement. */
4847 if (aggregate->summary_only)
4849 (bgp_info_extra_get (ri))->suppress++;
4850 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4851 match++;
4853 /* as-set aggregate route generate origin, as path,
4854 community aggregation. */
4855 if (aggregate->as_set)
4857 if (origin < ri->attr->origin)
4858 origin = ri->attr->origin;
4860 if (aspath)
4862 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4863 aspath_free (aspath);
4864 aspath = asmerge;
4866 else
4867 aspath = aspath_dup (ri->attr->aspath);
4869 if (ri->attr->community)
4871 if (community)
4873 commerge = community_merge (community,
4874 ri->attr->community);
4875 community = community_uniq_sort (commerge);
4876 community_free (commerge);
4878 else
4879 community = community_dup (ri->attr->community);
4882 aggregate->count++;
4886 /* If this node is suppressed, process the change. */
4887 if (match)
4888 bgp_process (bgp, rn, afi, safi);
4890 bgp_unlock_node (top);
4892 /* Add aggregate route to BGP table. */
4893 if (aggregate->count)
4895 rn = bgp_node_get (table, p);
4897 new = bgp_info_new ();
4898 new->type = ZEBRA_ROUTE_BGP;
4899 new->sub_type = BGP_ROUTE_AGGREGATE;
4900 new->peer = bgp->peer_self;
4901 SET_FLAG (new->flags, BGP_INFO_VALID);
4902 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4903 new->uptime = bgp_clock ();
4905 bgp_info_add (rn, new);
4906 bgp_unlock_node (rn);
4908 /* Process change. */
4909 bgp_process (bgp, rn, afi, safi);
4913 void
4914 bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4915 safi_t safi, struct bgp_aggregate *aggregate)
4917 struct bgp_table *table;
4918 struct bgp_node *top;
4919 struct bgp_node *rn;
4920 struct bgp_info *ri;
4921 unsigned long match;
4923 table = bgp->rib[afi][safi];
4925 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4926 return;
4927 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4928 return;
4930 /* If routes exists below this node, generate aggregate routes. */
4931 top = bgp_node_get (table, p);
4932 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4933 if (rn->p.prefixlen > p->prefixlen)
4935 match = 0;
4937 for (ri = rn->info; ri; ri = ri->next)
4939 if (BGP_INFO_HOLDDOWN (ri))
4940 continue;
4942 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4944 if (aggregate->summary_only && ri->extra)
4946 ri->extra->suppress--;
4948 if (ri->extra->suppress == 0)
4950 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4951 match++;
4954 aggregate->count--;
4958 /* If this node was suppressed, process the change. */
4959 if (match)
4960 bgp_process (bgp, rn, afi, safi);
4962 bgp_unlock_node (top);
4964 /* Delete aggregate route from BGP table. */
4965 rn = bgp_node_get (table, p);
4967 for (ri = rn->info; ri; ri = ri->next)
4968 if (ri->peer == bgp->peer_self
4969 && ri->type == ZEBRA_ROUTE_BGP
4970 && ri->sub_type == BGP_ROUTE_AGGREGATE)
4971 break;
4973 /* Withdraw static BGP route from routing table. */
4974 if (ri)
4976 bgp_info_delete (rn, ri);
4977 bgp_process (bgp, rn, afi, safi);
4980 /* Unlock bgp_node_lookup. */
4981 bgp_unlock_node (rn);
4984 /* Aggregate route attribute. */
4985 #define AGGREGATE_SUMMARY_ONLY 1
4986 #define AGGREGATE_AS_SET 1
4988 static int
4989 bgp_aggregate_set (struct vty *vty, const char *prefix_str,
4990 afi_t afi, safi_t safi,
4991 u_char summary_only, u_char as_set)
4993 int ret;
4994 struct prefix p;
4995 struct bgp_node *rn;
4996 struct bgp *bgp;
4997 struct bgp_aggregate *aggregate;
4999 /* Convert string to prefix structure. */
5000 ret = str2prefix (prefix_str, &p);
5001 if (!ret)
5003 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
5004 return CMD_WARNING;
5006 apply_mask (&p);
5008 /* Get BGP structure. */
5009 bgp = vty->index;
5011 /* Old configuration check. */
5012 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
5014 if (rn->info)
5016 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
5017 bgp_unlock_node (rn);
5018 return CMD_WARNING;
5021 /* Make aggregate address structure. */
5022 aggregate = bgp_aggregate_new ();
5023 aggregate->summary_only = summary_only;
5024 aggregate->as_set = as_set;
5025 aggregate->safi = safi;
5026 rn->info = aggregate;
5028 /* Aggregate address insert into BGP routing table. */
5029 if (safi & SAFI_UNICAST)
5030 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
5031 if (safi & SAFI_MULTICAST)
5032 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5034 return CMD_SUCCESS;
5037 static int
5038 bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
5039 afi_t afi, safi_t safi)
5041 int ret;
5042 struct prefix p;
5043 struct bgp_node *rn;
5044 struct bgp *bgp;
5045 struct bgp_aggregate *aggregate;
5047 /* Convert string to prefix structure. */
5048 ret = str2prefix (prefix_str, &p);
5049 if (!ret)
5051 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
5052 return CMD_WARNING;
5054 apply_mask (&p);
5056 /* Get BGP structure. */
5057 bgp = vty->index;
5059 /* Old configuration check. */
5060 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
5061 if (! rn)
5063 vty_out (vty, "%% There is no aggregate-address configuration.%s",
5064 VTY_NEWLINE);
5065 return CMD_WARNING;
5068 aggregate = rn->info;
5069 if (aggregate->safi & SAFI_UNICAST)
5070 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
5071 if (aggregate->safi & SAFI_MULTICAST)
5072 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5074 /* Unlock aggregate address configuration. */
5075 rn->info = NULL;
5076 bgp_aggregate_free (aggregate);
5077 bgp_unlock_node (rn);
5078 bgp_unlock_node (rn);
5080 return CMD_SUCCESS;
5083 DEFUN (aggregate_address,
5084 aggregate_address_cmd,
5085 "aggregate-address A.B.C.D/M",
5086 "Configure BGP aggregate entries\n"
5087 "Aggregate prefix\n")
5089 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
5092 DEFUN (aggregate_address_mask,
5093 aggregate_address_mask_cmd,
5094 "aggregate-address A.B.C.D A.B.C.D",
5095 "Configure BGP aggregate entries\n"
5096 "Aggregate address\n"
5097 "Aggregate mask\n")
5099 int ret;
5100 char prefix_str[BUFSIZ];
5102 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5104 if (! ret)
5106 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5107 return CMD_WARNING;
5110 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5111 0, 0);
5114 DEFUN (aggregate_address_summary_only,
5115 aggregate_address_summary_only_cmd,
5116 "aggregate-address A.B.C.D/M summary-only",
5117 "Configure BGP aggregate entries\n"
5118 "Aggregate prefix\n"
5119 "Filter more specific routes from updates\n")
5121 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5122 AGGREGATE_SUMMARY_ONLY, 0);
5125 DEFUN (aggregate_address_mask_summary_only,
5126 aggregate_address_mask_summary_only_cmd,
5127 "aggregate-address A.B.C.D A.B.C.D summary-only",
5128 "Configure BGP aggregate entries\n"
5129 "Aggregate address\n"
5130 "Aggregate mask\n"
5131 "Filter more specific routes from updates\n")
5133 int ret;
5134 char prefix_str[BUFSIZ];
5136 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5138 if (! ret)
5140 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5141 return CMD_WARNING;
5144 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5145 AGGREGATE_SUMMARY_ONLY, 0);
5148 DEFUN (aggregate_address_as_set,
5149 aggregate_address_as_set_cmd,
5150 "aggregate-address A.B.C.D/M as-set",
5151 "Configure BGP aggregate entries\n"
5152 "Aggregate prefix\n"
5153 "Generate AS set path information\n")
5155 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5156 0, AGGREGATE_AS_SET);
5159 DEFUN (aggregate_address_mask_as_set,
5160 aggregate_address_mask_as_set_cmd,
5161 "aggregate-address A.B.C.D A.B.C.D as-set",
5162 "Configure BGP aggregate entries\n"
5163 "Aggregate address\n"
5164 "Aggregate mask\n"
5165 "Generate AS set path information\n")
5167 int ret;
5168 char prefix_str[BUFSIZ];
5170 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5172 if (! ret)
5174 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5175 return CMD_WARNING;
5178 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5179 0, AGGREGATE_AS_SET);
5183 DEFUN (aggregate_address_as_set_summary,
5184 aggregate_address_as_set_summary_cmd,
5185 "aggregate-address A.B.C.D/M as-set summary-only",
5186 "Configure BGP aggregate entries\n"
5187 "Aggregate prefix\n"
5188 "Generate AS set path information\n"
5189 "Filter more specific routes from updates\n")
5191 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5192 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5195 ALIAS (aggregate_address_as_set_summary,
5196 aggregate_address_summary_as_set_cmd,
5197 "aggregate-address A.B.C.D/M summary-only as-set",
5198 "Configure BGP aggregate entries\n"
5199 "Aggregate prefix\n"
5200 "Filter more specific routes from updates\n"
5201 "Generate AS set path information\n")
5203 DEFUN (aggregate_address_mask_as_set_summary,
5204 aggregate_address_mask_as_set_summary_cmd,
5205 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5206 "Configure BGP aggregate entries\n"
5207 "Aggregate address\n"
5208 "Aggregate mask\n"
5209 "Generate AS set path information\n"
5210 "Filter more specific routes from updates\n")
5212 int ret;
5213 char prefix_str[BUFSIZ];
5215 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5217 if (! ret)
5219 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5220 return CMD_WARNING;
5223 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5224 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5227 ALIAS (aggregate_address_mask_as_set_summary,
5228 aggregate_address_mask_summary_as_set_cmd,
5229 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5230 "Configure BGP aggregate entries\n"
5231 "Aggregate address\n"
5232 "Aggregate mask\n"
5233 "Filter more specific routes from updates\n"
5234 "Generate AS set path information\n")
5236 DEFUN (no_aggregate_address,
5237 no_aggregate_address_cmd,
5238 "no aggregate-address A.B.C.D/M",
5239 NO_STR
5240 "Configure BGP aggregate entries\n"
5241 "Aggregate prefix\n")
5243 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5246 ALIAS (no_aggregate_address,
5247 no_aggregate_address_summary_only_cmd,
5248 "no aggregate-address A.B.C.D/M summary-only",
5249 NO_STR
5250 "Configure BGP aggregate entries\n"
5251 "Aggregate prefix\n"
5252 "Filter more specific routes from updates\n")
5254 ALIAS (no_aggregate_address,
5255 no_aggregate_address_as_set_cmd,
5256 "no aggregate-address A.B.C.D/M as-set",
5257 NO_STR
5258 "Configure BGP aggregate entries\n"
5259 "Aggregate prefix\n"
5260 "Generate AS set path information\n")
5262 ALIAS (no_aggregate_address,
5263 no_aggregate_address_as_set_summary_cmd,
5264 "no aggregate-address A.B.C.D/M as-set summary-only",
5265 NO_STR
5266 "Configure BGP aggregate entries\n"
5267 "Aggregate prefix\n"
5268 "Generate AS set path information\n"
5269 "Filter more specific routes from updates\n")
5271 ALIAS (no_aggregate_address,
5272 no_aggregate_address_summary_as_set_cmd,
5273 "no aggregate-address A.B.C.D/M summary-only as-set",
5274 NO_STR
5275 "Configure BGP aggregate entries\n"
5276 "Aggregate prefix\n"
5277 "Filter more specific routes from updates\n"
5278 "Generate AS set path information\n")
5280 DEFUN (no_aggregate_address_mask,
5281 no_aggregate_address_mask_cmd,
5282 "no aggregate-address A.B.C.D A.B.C.D",
5283 NO_STR
5284 "Configure BGP aggregate entries\n"
5285 "Aggregate address\n"
5286 "Aggregate mask\n")
5288 int ret;
5289 char prefix_str[BUFSIZ];
5291 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5293 if (! ret)
5295 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5296 return CMD_WARNING;
5299 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5302 ALIAS (no_aggregate_address_mask,
5303 no_aggregate_address_mask_summary_only_cmd,
5304 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5305 NO_STR
5306 "Configure BGP aggregate entries\n"
5307 "Aggregate address\n"
5308 "Aggregate mask\n"
5309 "Filter more specific routes from updates\n")
5311 ALIAS (no_aggregate_address_mask,
5312 no_aggregate_address_mask_as_set_cmd,
5313 "no aggregate-address A.B.C.D A.B.C.D as-set",
5314 NO_STR
5315 "Configure BGP aggregate entries\n"
5316 "Aggregate address\n"
5317 "Aggregate mask\n"
5318 "Generate AS set path information\n")
5320 ALIAS (no_aggregate_address_mask,
5321 no_aggregate_address_mask_as_set_summary_cmd,
5322 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5323 NO_STR
5324 "Configure BGP aggregate entries\n"
5325 "Aggregate address\n"
5326 "Aggregate mask\n"
5327 "Generate AS set path information\n"
5328 "Filter more specific routes from updates\n")
5330 ALIAS (no_aggregate_address_mask,
5331 no_aggregate_address_mask_summary_as_set_cmd,
5332 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5333 NO_STR
5334 "Configure BGP aggregate entries\n"
5335 "Aggregate address\n"
5336 "Aggregate mask\n"
5337 "Filter more specific routes from updates\n"
5338 "Generate AS set path information\n")
5340 #ifdef HAVE_IPV6
5341 DEFUN (ipv6_aggregate_address,
5342 ipv6_aggregate_address_cmd,
5343 "aggregate-address X:X::X:X/M",
5344 "Configure BGP aggregate entries\n"
5345 "Aggregate prefix\n")
5347 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5350 DEFUN (ipv6_aggregate_address_summary_only,
5351 ipv6_aggregate_address_summary_only_cmd,
5352 "aggregate-address X:X::X:X/M summary-only",
5353 "Configure BGP aggregate entries\n"
5354 "Aggregate prefix\n"
5355 "Filter more specific routes from updates\n")
5357 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5358 AGGREGATE_SUMMARY_ONLY, 0);
5361 DEFUN (no_ipv6_aggregate_address,
5362 no_ipv6_aggregate_address_cmd,
5363 "no aggregate-address X:X::X:X/M",
5364 NO_STR
5365 "Configure BGP aggregate entries\n"
5366 "Aggregate prefix\n")
5368 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5371 DEFUN (no_ipv6_aggregate_address_summary_only,
5372 no_ipv6_aggregate_address_summary_only_cmd,
5373 "no aggregate-address X:X::X:X/M summary-only",
5374 NO_STR
5375 "Configure BGP aggregate entries\n"
5376 "Aggregate prefix\n"
5377 "Filter more specific routes from updates\n")
5379 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5382 ALIAS (ipv6_aggregate_address,
5383 old_ipv6_aggregate_address_cmd,
5384 "ipv6 bgp aggregate-address X:X::X:X/M",
5385 IPV6_STR
5386 BGP_STR
5387 "Configure BGP aggregate entries\n"
5388 "Aggregate prefix\n")
5390 ALIAS (ipv6_aggregate_address_summary_only,
5391 old_ipv6_aggregate_address_summary_only_cmd,
5392 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5393 IPV6_STR
5394 BGP_STR
5395 "Configure BGP aggregate entries\n"
5396 "Aggregate prefix\n"
5397 "Filter more specific routes from updates\n")
5399 ALIAS (no_ipv6_aggregate_address,
5400 old_no_ipv6_aggregate_address_cmd,
5401 "no ipv6 bgp aggregate-address X:X::X:X/M",
5402 NO_STR
5403 IPV6_STR
5404 BGP_STR
5405 "Configure BGP aggregate entries\n"
5406 "Aggregate prefix\n")
5408 ALIAS (no_ipv6_aggregate_address_summary_only,
5409 old_no_ipv6_aggregate_address_summary_only_cmd,
5410 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5411 NO_STR
5412 IPV6_STR
5413 BGP_STR
5414 "Configure BGP aggregate entries\n"
5415 "Aggregate prefix\n"
5416 "Filter more specific routes from updates\n")
5417 #endif /* HAVE_IPV6 */
5419 /* Redistribute route treatment. */
5420 void
5421 bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
5422 u_int32_t metric, u_char type)
5424 struct bgp *bgp;
5425 struct listnode *node, *nnode;
5426 struct bgp_info *new;
5427 struct bgp_info *bi;
5428 struct bgp_info info;
5429 struct bgp_node *bn;
5430 struct attr attr = { 0 };
5431 struct attr attr_new = { 0 };
5432 struct attr *new_attr;
5433 afi_t afi;
5434 int ret;
5436 /* Make default attribute. */
5437 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5438 if (nexthop)
5439 attr.nexthop = *nexthop;
5441 attr.med = metric;
5442 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5444 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5446 afi = family2afi (p->family);
5448 if (bgp->redist[afi][type])
5450 /* Copy attribute for modification. */
5451 bgp_attr_dup (&attr_new, &attr);
5453 if (bgp->redist_metric_flag[afi][type])
5454 attr_new.med = bgp->redist_metric[afi][type];
5456 /* Apply route-map. */
5457 if (bgp->rmap[afi][type].map)
5459 info.peer = bgp->peer_self;
5460 info.attr = &attr_new;
5462 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5464 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5465 &info);
5467 bgp->peer_self->rmap_type = 0;
5469 if (ret == RMAP_DENYMATCH)
5471 /* Free uninterned attribute. */
5472 bgp_attr_flush (&attr_new);
5473 bgp_attr_extra_free (&attr_new);
5475 /* Unintern original. */
5476 aspath_unintern (attr.aspath);
5477 bgp_attr_extra_free (&attr);
5478 bgp_redistribute_delete (p, type);
5479 return;
5483 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5484 afi, SAFI_UNICAST, p, NULL);
5486 new_attr = bgp_attr_intern (&attr_new);
5487 bgp_attr_extra_free (&attr_new);
5489 for (bi = bn->info; bi; bi = bi->next)
5490 if (bi->peer == bgp->peer_self
5491 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5492 break;
5494 if (bi)
5496 if (attrhash_cmp (bi->attr, new_attr) &&
5497 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5499 bgp_attr_unintern (new_attr);
5500 aspath_unintern (attr.aspath);
5501 bgp_attr_extra_free (&attr);
5502 bgp_unlock_node (bn);
5503 return;
5505 else
5507 /* The attribute is changed. */
5508 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
5510 /* Rewrite BGP route information. */
5511 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5512 bgp_info_restore(bn, bi);
5513 else
5514 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
5515 bgp_attr_unintern (bi->attr);
5516 bi->attr = new_attr;
5517 bi->uptime = bgp_clock ();
5519 /* Process change. */
5520 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5521 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5522 bgp_unlock_node (bn);
5523 aspath_unintern (attr.aspath);
5524 bgp_attr_extra_free (&attr);
5525 return;
5529 new = bgp_info_new ();
5530 new->type = type;
5531 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5532 new->peer = bgp->peer_self;
5533 SET_FLAG (new->flags, BGP_INFO_VALID);
5534 new->attr = new_attr;
5535 new->uptime = bgp_clock ();
5537 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5538 bgp_info_add (bn, new);
5539 bgp_unlock_node (bn);
5540 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5544 /* Unintern original. */
5545 aspath_unintern (attr.aspath);
5546 bgp_attr_extra_free (&attr);
5549 void
5550 bgp_redistribute_delete (struct prefix *p, u_char type)
5552 struct bgp *bgp;
5553 struct listnode *node, *nnode;
5554 afi_t afi;
5555 struct bgp_node *rn;
5556 struct bgp_info *ri;
5558 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5560 afi = family2afi (p->family);
5562 if (bgp->redist[afi][type])
5564 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
5566 for (ri = rn->info; ri; ri = ri->next)
5567 if (ri->peer == bgp->peer_self
5568 && ri->type == type)
5569 break;
5571 if (ri)
5573 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
5574 bgp_info_delete (rn, ri);
5575 bgp_process (bgp, rn, afi, SAFI_UNICAST);
5577 bgp_unlock_node (rn);
5582 /* Withdraw specified route type's route. */
5583 void
5584 bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5586 struct bgp_node *rn;
5587 struct bgp_info *ri;
5588 struct bgp_table *table;
5590 table = bgp->rib[afi][SAFI_UNICAST];
5592 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5594 for (ri = rn->info; ri; ri = ri->next)
5595 if (ri->peer == bgp->peer_self
5596 && ri->type == type)
5597 break;
5599 if (ri)
5601 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
5602 bgp_info_delete (rn, ri);
5603 bgp_process (bgp, rn, afi, SAFI_UNICAST);
5608 /* Static function to display route. */
5609 static void
5610 route_vty_out_route (struct prefix *p, struct vty *vty)
5612 int len;
5613 u_int32_t destination;
5614 char buf[BUFSIZ];
5616 if (p->family == AF_INET)
5618 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5619 destination = ntohl (p->u.prefix4.s_addr);
5621 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5622 || (IN_CLASSB (destination) && p->prefixlen == 16)
5623 || (IN_CLASSA (destination) && p->prefixlen == 8)
5624 || p->u.prefix4.s_addr == 0)
5626 /* When mask is natural, mask is not displayed. */
5628 else
5629 len += vty_out (vty, "/%d", p->prefixlen);
5631 else
5632 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5633 p->prefixlen);
5635 len = 17 - len;
5636 if (len < 1)
5637 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5638 else
5639 vty_out (vty, "%*s", len, " ");
5642 enum bgp_display_type
5644 normal_list,
5647 /* Print the short form route status for a bgp_info */
5648 static void
5649 route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
5651 /* Route status display. */
5652 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5653 vty_out (vty, "R");
5654 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5655 vty_out (vty, "S");
5656 else if (binfo->extra && binfo->extra->suppress)
5657 vty_out (vty, "s");
5658 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5659 vty_out (vty, "*");
5660 else
5661 vty_out (vty, " ");
5663 /* Selected */
5664 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5665 vty_out (vty, "h");
5666 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5667 vty_out (vty, "d");
5668 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5669 vty_out (vty, ">");
5670 else
5671 vty_out (vty, " ");
5673 /* Internal route. */
5674 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5675 vty_out (vty, "i");
5676 else
5677 vty_out (vty, " ");
5680 /* called from terminal list command */
5681 void
5682 route_vty_out (struct vty *vty, struct prefix *p,
5683 struct bgp_info *binfo, int display, safi_t safi)
5685 struct attr *attr;
5687 /* short status lead text */
5688 route_vty_short_status_out (vty, binfo);
5690 /* print prefix and mask */
5691 if (! display)
5692 route_vty_out_route (p, vty);
5693 else
5694 vty_out (vty, "%*s", 17, " ");
5696 /* Print attribute */
5697 attr = binfo->attr;
5698 if (attr)
5700 if (p->family == AF_INET)
5702 if (safi == SAFI_MPLS_VPN)
5703 vty_out (vty, "%-16s",
5704 inet_ntoa (attr->extra->mp_nexthop_global_in));
5705 else
5706 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5708 #ifdef HAVE_IPV6
5709 else if (p->family == AF_INET6)
5711 int len;
5712 char buf[BUFSIZ];
5714 len = vty_out (vty, "%s",
5715 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5716 buf, BUFSIZ));
5717 len = 16 - len;
5718 if (len < 1)
5719 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5720 else
5721 vty_out (vty, "%*s", len, " ");
5723 #endif /* HAVE_IPV6 */
5725 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5726 vty_out (vty, "%10d", attr->med);
5727 else
5728 vty_out (vty, " ");
5730 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5731 vty_out (vty, "%7d", attr->local_pref);
5732 else
5733 vty_out (vty, " ");
5735 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
5737 /* Print aspath */
5738 if (attr->aspath)
5739 aspath_print_vty (vty, "%s", attr->aspath, " ");
5741 /* Print origin */
5742 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5744 vty_out (vty, "%s", VTY_NEWLINE);
5747 /* called from terminal list command */
5748 void
5749 route_vty_out_tmp (struct vty *vty, struct prefix *p,
5750 struct attr *attr, safi_t safi)
5752 /* Route status display. */
5753 vty_out (vty, "*");
5754 vty_out (vty, ">");
5755 vty_out (vty, " ");
5757 /* print prefix and mask */
5758 route_vty_out_route (p, vty);
5760 /* Print attribute */
5761 if (attr)
5763 if (p->family == AF_INET)
5765 if (safi == SAFI_MPLS_VPN)
5766 vty_out (vty, "%-16s",
5767 inet_ntoa (attr->extra->mp_nexthop_global_in));
5768 else
5769 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5771 #ifdef HAVE_IPV6
5772 else if (p->family == AF_INET6)
5774 int len;
5775 char buf[BUFSIZ];
5777 assert (attr->extra);
5779 len = vty_out (vty, "%s",
5780 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5781 buf, BUFSIZ));
5782 len = 16 - len;
5783 if (len < 1)
5784 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5785 else
5786 vty_out (vty, "%*s", len, " ");
5788 #endif /* HAVE_IPV6 */
5790 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5791 vty_out (vty, "%10d", attr->med);
5792 else
5793 vty_out (vty, " ");
5795 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5796 vty_out (vty, "%7d", attr->local_pref);
5797 else
5798 vty_out (vty, " ");
5800 vty_out (vty, "%7d ", (attr->extra ? attr->extra->weight : 0));
5802 /* Print aspath */
5803 if (attr->aspath)
5804 aspath_print_vty (vty, "%s", attr->aspath, " ");
5806 /* Print origin */
5807 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5810 vty_out (vty, "%s", VTY_NEWLINE);
5813 void
5814 route_vty_out_tag (struct vty *vty, struct prefix *p,
5815 struct bgp_info *binfo, int display, safi_t safi)
5817 struct attr *attr;
5818 u_int32_t label = 0;
5820 if (!binfo->extra)
5821 return;
5823 /* short status lead text */
5824 route_vty_short_status_out (vty, binfo);
5826 /* print prefix and mask */
5827 if (! display)
5828 route_vty_out_route (p, vty);
5829 else
5830 vty_out (vty, "%*s", 17, " ");
5832 /* Print attribute */
5833 attr = binfo->attr;
5834 if (attr)
5836 if (p->family == AF_INET)
5838 if (safi == SAFI_MPLS_VPN)
5839 vty_out (vty, "%-16s",
5840 inet_ntoa (attr->extra->mp_nexthop_global_in));
5841 else
5842 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5844 #ifdef HAVE_IPV6
5845 else if (p->family == AF_INET6)
5847 assert (attr->extra);
5848 char buf[BUFSIZ];
5849 char buf1[BUFSIZ];
5850 if (attr->extra->mp_nexthop_len == 16)
5851 vty_out (vty, "%s",
5852 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5853 buf, BUFSIZ));
5854 else if (attr->extra->mp_nexthop_len == 32)
5855 vty_out (vty, "%s(%s)",
5856 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5857 buf, BUFSIZ),
5858 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5859 buf1, BUFSIZ));
5862 #endif /* HAVE_IPV6 */
5865 label = decode_label (binfo->extra->tag);
5867 vty_out (vty, "notag/%d", label);
5869 vty_out (vty, "%s", VTY_NEWLINE);
5872 /* dampening route */
5873 static void
5874 damp_route_vty_out (struct vty *vty, struct prefix *p,
5875 struct bgp_info *binfo, int display, safi_t safi)
5877 struct attr *attr;
5878 int len;
5879 char timebuf[BGP_UPTIME_LEN];
5881 /* short status lead text */
5882 route_vty_short_status_out (vty, binfo);
5884 /* print prefix and mask */
5885 if (! display)
5886 route_vty_out_route (p, vty);
5887 else
5888 vty_out (vty, "%*s", 17, " ");
5890 len = vty_out (vty, "%s", binfo->peer->host);
5891 len = 17 - len;
5892 if (len < 1)
5893 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5894 else
5895 vty_out (vty, "%*s", len, " ");
5897 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
5899 /* Print attribute */
5900 attr = binfo->attr;
5901 if (attr)
5903 /* Print aspath */
5904 if (attr->aspath)
5905 aspath_print_vty (vty, "%s", attr->aspath, " ");
5907 /* Print origin */
5908 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5910 vty_out (vty, "%s", VTY_NEWLINE);
5913 /* flap route */
5914 static void
5915 flap_route_vty_out (struct vty *vty, struct prefix *p,
5916 struct bgp_info *binfo, int display, safi_t safi)
5918 struct attr *attr;
5919 struct bgp_damp_info *bdi;
5920 char timebuf[BGP_UPTIME_LEN];
5921 int len;
5923 if (!binfo->extra)
5924 return;
5926 bdi = binfo->extra->damp_info;
5928 /* short status lead text */
5929 route_vty_short_status_out (vty, binfo);
5931 /* print prefix and mask */
5932 if (! display)
5933 route_vty_out_route (p, vty);
5934 else
5935 vty_out (vty, "%*s", 17, " ");
5937 len = vty_out (vty, "%s", binfo->peer->host);
5938 len = 16 - len;
5939 if (len < 1)
5940 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5941 else
5942 vty_out (vty, "%*s", len, " ");
5944 len = vty_out (vty, "%d", bdi->flap);
5945 len = 5 - len;
5946 if (len < 1)
5947 vty_out (vty, " ");
5948 else
5949 vty_out (vty, "%*s ", len, " ");
5951 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5952 timebuf, BGP_UPTIME_LEN));
5954 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5955 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5956 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
5957 else
5958 vty_out (vty, "%*s ", 8, " ");
5960 /* Print attribute */
5961 attr = binfo->attr;
5962 if (attr)
5964 /* Print aspath */
5965 if (attr->aspath)
5966 aspath_print_vty (vty, "%s", attr->aspath, " ");
5968 /* Print origin */
5969 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5971 vty_out (vty, "%s", VTY_NEWLINE);
5974 static void
5975 route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5976 struct bgp_info *binfo, afi_t afi, safi_t safi)
5978 char buf[INET6_ADDRSTRLEN];
5979 char buf1[BUFSIZ];
5980 struct attr *attr;
5981 int sockunion_vty_out (struct vty *, union sockunion *);
5983 attr = binfo->attr;
5985 if (attr)
5987 /* Line1 display AS-path, Aggregator */
5988 if (attr->aspath)
5990 vty_out (vty, " ");
5991 if (aspath_count_hops (attr->aspath) == 0)
5992 vty_out (vty, "Local");
5993 else
5994 aspath_print_vty (vty, "%s", attr->aspath, "");
5997 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5998 vty_out (vty, ", (removed)");
5999 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
6000 vty_out (vty, ", (stale)");
6001 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
6002 vty_out (vty, ", (aggregated by %u %s)",
6003 attr->extra->aggregator_as,
6004 inet_ntoa (attr->extra->aggregator_addr));
6005 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
6006 vty_out (vty, ", (Received from a RR-client)");
6007 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
6008 vty_out (vty, ", (Received from a RS-client)");
6009 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6010 vty_out (vty, ", (history entry)");
6011 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
6012 vty_out (vty, ", (suppressed due to dampening)");
6013 vty_out (vty, "%s", VTY_NEWLINE);
6015 /* Line2 display Next-hop, Neighbor, Router-id */
6016 if (p->family == AF_INET)
6018 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
6019 inet_ntoa (attr->extra->mp_nexthop_global_in) :
6020 inet_ntoa (attr->nexthop));
6022 #ifdef HAVE_IPV6
6023 else
6025 assert (attr->extra);
6026 vty_out (vty, " %s",
6027 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
6028 buf, INET6_ADDRSTRLEN));
6030 #endif /* HAVE_IPV6 */
6032 if (binfo->peer == bgp->peer_self)
6034 vty_out (vty, " from %s ",
6035 p->family == AF_INET ? "0.0.0.0" : "::");
6036 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
6038 else
6040 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
6041 vty_out (vty, " (inaccessible)");
6042 else if (binfo->extra && binfo->extra->igpmetric)
6043 vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
6044 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
6045 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6046 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
6047 else
6048 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
6050 vty_out (vty, "%s", VTY_NEWLINE);
6052 #ifdef HAVE_IPV6
6053 /* display nexthop local */
6054 if (attr->extra && attr->extra->mp_nexthop_len == 32)
6056 vty_out (vty, " (%s)%s",
6057 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
6058 buf, INET6_ADDRSTRLEN),
6059 VTY_NEWLINE);
6061 #endif /* HAVE_IPV6 */
6063 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
6064 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
6066 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
6067 vty_out (vty, ", metric %d", attr->med);
6069 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
6070 vty_out (vty, ", localpref %d", attr->local_pref);
6071 else
6072 vty_out (vty, ", localpref %d", bgp->default_local_pref);
6074 if (attr->extra && attr->extra->weight != 0)
6075 vty_out (vty, ", weight %d", attr->extra->weight);
6077 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6078 vty_out (vty, ", valid");
6080 if (binfo->peer != bgp->peer_self)
6082 if (binfo->peer->as == binfo->peer->local_as)
6083 vty_out (vty, ", internal");
6084 else
6085 vty_out (vty, ", %s",
6086 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
6088 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
6089 vty_out (vty, ", aggregated, local");
6090 else if (binfo->type != ZEBRA_ROUTE_BGP)
6091 vty_out (vty, ", sourced");
6092 else
6093 vty_out (vty, ", sourced, local");
6095 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
6096 vty_out (vty, ", atomic-aggregate");
6098 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
6099 vty_out (vty, ", best");
6101 vty_out (vty, "%s", VTY_NEWLINE);
6103 /* Line 4 display Community */
6104 if (attr->community)
6105 vty_out (vty, " Community: %s%s", attr->community->str,
6106 VTY_NEWLINE);
6108 /* Line 5 display Extended-community */
6109 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
6110 vty_out (vty, " Extended Community: %s%s",
6111 attr->extra->ecommunity->str, VTY_NEWLINE);
6113 /* Line 6 display Originator, Cluster-id */
6114 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
6115 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
6117 assert (attr->extra);
6118 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6119 vty_out (vty, " Originator: %s",
6120 inet_ntoa (attr->extra->originator_id));
6122 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
6124 int i;
6125 vty_out (vty, ", Cluster list: ");
6126 for (i = 0; i < attr->extra->cluster->length / 4; i++)
6127 vty_out (vty, "%s ",
6128 inet_ntoa (attr->extra->cluster->list[i]));
6130 vty_out (vty, "%s", VTY_NEWLINE);
6133 /* 7: AS Pathlimit */
6134 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_AS_PATHLIMIT))
6137 vty_out (vty, " AS-Pathlimit: %u",
6138 attr->pathlimit.ttl);
6139 if (attr->pathlimit.as)
6140 vty_out (vty, " (%u)", attr->pathlimit.as);
6141 vty_out (vty, "%s", VTY_NEWLINE);
6144 if (binfo->extra && binfo->extra->damp_info)
6145 bgp_damp_info_vty (vty, binfo);
6147 /* Line 7 display Uptime */
6148 vty_out (vty, " Last update: %s", ctime (&binfo->uptime));
6150 vty_out (vty, "%s", VTY_NEWLINE);
6153 #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"
6154 #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
6155 #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
6156 #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
6157 #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
6159 enum bgp_show_type
6161 bgp_show_type_normal,
6162 bgp_show_type_regexp,
6163 bgp_show_type_prefix_list,
6164 bgp_show_type_filter_list,
6165 bgp_show_type_route_map,
6166 bgp_show_type_neighbor,
6167 bgp_show_type_cidr_only,
6168 bgp_show_type_prefix_longer,
6169 bgp_show_type_community_all,
6170 bgp_show_type_community,
6171 bgp_show_type_community_exact,
6172 bgp_show_type_community_list,
6173 bgp_show_type_community_list_exact,
6174 bgp_show_type_flap_statistics,
6175 bgp_show_type_flap_address,
6176 bgp_show_type_flap_prefix,
6177 bgp_show_type_flap_cidr_only,
6178 bgp_show_type_flap_regexp,
6179 bgp_show_type_flap_filter_list,
6180 bgp_show_type_flap_prefix_list,
6181 bgp_show_type_flap_prefix_longer,
6182 bgp_show_type_flap_route_map,
6183 bgp_show_type_flap_neighbor,
6184 bgp_show_type_dampend_paths,
6185 bgp_show_type_damp_neighbor
6188 static int
6189 bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
6190 enum bgp_show_type type, void *output_arg)
6192 struct bgp_info *ri;
6193 struct bgp_node *rn;
6194 int header = 1;
6195 int display;
6196 unsigned long output_count;
6198 /* This is first entry point, so reset total line. */
6199 output_count = 0;
6201 /* Start processing of routes. */
6202 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6203 if (rn->info != NULL)
6205 display = 0;
6207 for (ri = rn->info; ri; ri = ri->next)
6209 if (type == bgp_show_type_flap_statistics
6210 || type == bgp_show_type_flap_address
6211 || type == bgp_show_type_flap_prefix
6212 || type == bgp_show_type_flap_cidr_only
6213 || type == bgp_show_type_flap_regexp
6214 || type == bgp_show_type_flap_filter_list
6215 || type == bgp_show_type_flap_prefix_list
6216 || type == bgp_show_type_flap_prefix_longer
6217 || type == bgp_show_type_flap_route_map
6218 || type == bgp_show_type_flap_neighbor
6219 || type == bgp_show_type_dampend_paths
6220 || type == bgp_show_type_damp_neighbor)
6222 if (!(ri->extra && ri->extra->damp_info))
6223 continue;
6225 if (type == bgp_show_type_regexp
6226 || type == bgp_show_type_flap_regexp)
6228 regex_t *regex = output_arg;
6230 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6231 continue;
6233 if (type == bgp_show_type_prefix_list
6234 || type == bgp_show_type_flap_prefix_list)
6236 struct prefix_list *plist = output_arg;
6238 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6239 continue;
6241 if (type == bgp_show_type_filter_list
6242 || type == bgp_show_type_flap_filter_list)
6244 struct as_list *as_list = output_arg;
6246 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6247 continue;
6249 if (type == bgp_show_type_route_map
6250 || type == bgp_show_type_flap_route_map)
6252 struct route_map *rmap = output_arg;
6253 struct bgp_info binfo;
6254 struct attr dummy_attr = { 0 };
6255 int ret;
6257 bgp_attr_dup (&dummy_attr, ri->attr);
6258 binfo.peer = ri->peer;
6259 binfo.attr = &dummy_attr;
6261 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
6263 bgp_attr_extra_free (&dummy_attr);
6265 if (ret == RMAP_DENYMATCH)
6266 continue;
6268 if (type == bgp_show_type_neighbor
6269 || type == bgp_show_type_flap_neighbor
6270 || type == bgp_show_type_damp_neighbor)
6272 union sockunion *su = output_arg;
6274 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6275 continue;
6277 if (type == bgp_show_type_cidr_only
6278 || type == bgp_show_type_flap_cidr_only)
6280 u_int32_t destination;
6282 destination = ntohl (rn->p.u.prefix4.s_addr);
6283 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6284 continue;
6285 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6286 continue;
6287 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6288 continue;
6290 if (type == bgp_show_type_prefix_longer
6291 || type == bgp_show_type_flap_prefix_longer)
6293 struct prefix *p = output_arg;
6295 if (! prefix_match (p, &rn->p))
6296 continue;
6298 if (type == bgp_show_type_community_all)
6300 if (! ri->attr->community)
6301 continue;
6303 if (type == bgp_show_type_community)
6305 struct community *com = output_arg;
6307 if (! ri->attr->community ||
6308 ! community_match (ri->attr->community, com))
6309 continue;
6311 if (type == bgp_show_type_community_exact)
6313 struct community *com = output_arg;
6315 if (! ri->attr->community ||
6316 ! community_cmp (ri->attr->community, com))
6317 continue;
6319 if (type == bgp_show_type_community_list)
6321 struct community_list *list = output_arg;
6323 if (! community_list_match (ri->attr->community, list))
6324 continue;
6326 if (type == bgp_show_type_community_list_exact)
6328 struct community_list *list = output_arg;
6330 if (! community_list_exact_match (ri->attr->community, list))
6331 continue;
6333 if (type == bgp_show_type_flap_address
6334 || type == bgp_show_type_flap_prefix)
6336 struct prefix *p = output_arg;
6338 if (! prefix_match (&rn->p, p))
6339 continue;
6341 if (type == bgp_show_type_flap_prefix)
6342 if (p->prefixlen != rn->p.prefixlen)
6343 continue;
6345 if (type == bgp_show_type_dampend_paths
6346 || type == bgp_show_type_damp_neighbor)
6348 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6349 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6350 continue;
6353 if (header)
6355 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6356 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6357 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6358 if (type == bgp_show_type_dampend_paths
6359 || type == bgp_show_type_damp_neighbor)
6360 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6361 else if (type == bgp_show_type_flap_statistics
6362 || type == bgp_show_type_flap_address
6363 || type == bgp_show_type_flap_prefix
6364 || type == bgp_show_type_flap_cidr_only
6365 || type == bgp_show_type_flap_regexp
6366 || type == bgp_show_type_flap_filter_list
6367 || type == bgp_show_type_flap_prefix_list
6368 || type == bgp_show_type_flap_prefix_longer
6369 || type == bgp_show_type_flap_route_map
6370 || type == bgp_show_type_flap_neighbor)
6371 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6372 else
6373 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
6374 header = 0;
6377 if (type == bgp_show_type_dampend_paths
6378 || type == bgp_show_type_damp_neighbor)
6379 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6380 else if (type == bgp_show_type_flap_statistics
6381 || type == bgp_show_type_flap_address
6382 || type == bgp_show_type_flap_prefix
6383 || type == bgp_show_type_flap_cidr_only
6384 || type == bgp_show_type_flap_regexp
6385 || type == bgp_show_type_flap_filter_list
6386 || type == bgp_show_type_flap_prefix_list
6387 || type == bgp_show_type_flap_prefix_longer
6388 || type == bgp_show_type_flap_route_map
6389 || type == bgp_show_type_flap_neighbor)
6390 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6391 else
6392 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6393 display++;
6395 if (display)
6396 output_count++;
6399 /* No route is displayed */
6400 if (output_count == 0)
6402 if (type == bgp_show_type_normal)
6403 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6405 else
6406 vty_out (vty, "%sTotal number of prefixes %ld%s",
6407 VTY_NEWLINE, output_count, VTY_NEWLINE);
6409 return CMD_SUCCESS;
6412 static int
6413 bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
6414 enum bgp_show_type type, void *output_arg)
6416 struct bgp_table *table;
6418 if (bgp == NULL) {
6419 bgp = bgp_get_default ();
6422 if (bgp == NULL)
6424 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6425 return CMD_WARNING;
6429 table = bgp->rib[afi][safi];
6431 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
6434 /* Header of detailed BGP route information */
6435 static void
6436 route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6437 struct bgp_node *rn,
6438 struct prefix_rd *prd, afi_t afi, safi_t safi)
6440 struct bgp_info *ri;
6441 struct prefix *p;
6442 struct peer *peer;
6443 struct listnode *node, *nnode;
6444 char buf1[INET6_ADDRSTRLEN];
6445 char buf2[INET6_ADDRSTRLEN];
6446 int count = 0;
6447 int best = 0;
6448 int suppress = 0;
6449 int no_export = 0;
6450 int no_advertise = 0;
6451 int local_as = 0;
6452 int first = 0;
6454 p = &rn->p;
6455 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6456 (safi == SAFI_MPLS_VPN ?
6457 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6458 safi == SAFI_MPLS_VPN ? ":" : "",
6459 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6460 p->prefixlen, VTY_NEWLINE);
6462 for (ri = rn->info; ri; ri = ri->next)
6464 count++;
6465 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6467 best = count;
6468 if (ri->extra && ri->extra->suppress)
6469 suppress = 1;
6470 if (ri->attr->community != NULL)
6472 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6473 no_advertise = 1;
6474 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6475 no_export = 1;
6476 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6477 local_as = 1;
6482 vty_out (vty, "Paths: (%d available", count);
6483 if (best)
6485 vty_out (vty, ", best #%d", best);
6486 if (safi == SAFI_UNICAST)
6487 vty_out (vty, ", table Default-IP-Routing-Table");
6489 else
6490 vty_out (vty, ", no best path");
6491 if (no_advertise)
6492 vty_out (vty, ", not advertised to any peer");
6493 else if (no_export)
6494 vty_out (vty, ", not advertised to EBGP peer");
6495 else if (local_as)
6496 vty_out (vty, ", not advertised outside local AS");
6497 if (suppress)
6498 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6499 vty_out (vty, ")%s", VTY_NEWLINE);
6501 /* advertised peer */
6502 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6504 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6506 if (! first)
6507 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6508 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6509 first = 1;
6512 if (! first)
6513 vty_out (vty, " Not advertised to any peer");
6514 vty_out (vty, "%s", VTY_NEWLINE);
6517 /* Display specified route of BGP table. */
6518 static int
6519 bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
6520 struct bgp_table *rib, const char *ip_str,
6521 afi_t afi, safi_t safi, struct prefix_rd *prd,
6522 int prefix_check)
6524 int ret;
6525 int header;
6526 int display = 0;
6527 struct prefix match;
6528 struct bgp_node *rn;
6529 struct bgp_node *rm;
6530 struct bgp_info *ri;
6531 struct bgp_table *table;
6533 /* Check IP address argument. */
6534 ret = str2prefix (ip_str, &match);
6535 if (! ret)
6537 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6538 return CMD_WARNING;
6541 match.family = afi2family (afi);
6543 if (safi == SAFI_MPLS_VPN)
6545 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
6547 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6548 continue;
6550 if ((table = rn->info) != NULL)
6552 header = 1;
6554 if ((rm = bgp_node_match (table, &match)) != NULL)
6556 if (prefix_check && rm->p.prefixlen != match.prefixlen)
6557 continue;
6559 for (ri = rm->info; ri; ri = ri->next)
6561 if (header)
6563 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6564 AFI_IP, SAFI_MPLS_VPN);
6566 header = 0;
6568 display++;
6569 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6575 else
6577 header = 1;
6579 if ((rn = bgp_node_match (rib, &match)) != NULL)
6581 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6583 for (ri = rn->info; ri; ri = ri->next)
6585 if (header)
6587 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6588 header = 0;
6590 display++;
6591 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6597 if (! display)
6599 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6600 return CMD_WARNING;
6603 return CMD_SUCCESS;
6606 /* Display specified route of Main RIB */
6607 static int
6608 bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
6609 afi_t afi, safi_t safi, struct prefix_rd *prd,
6610 int prefix_check)
6612 struct bgp *bgp;
6614 /* BGP structure lookup. */
6615 if (view_name)
6617 bgp = bgp_lookup_by_name (view_name);
6618 if (bgp == NULL)
6620 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6621 return CMD_WARNING;
6624 else
6626 bgp = bgp_get_default ();
6627 if (bgp == NULL)
6629 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6630 return CMD_WARNING;
6634 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6635 afi, safi, prd, prefix_check);
6638 /* BGP route print out function. */
6639 DEFUN (show_ip_bgp,
6640 show_ip_bgp_cmd,
6641 "show ip bgp",
6642 SHOW_STR
6643 IP_STR
6644 BGP_STR)
6646 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6649 DEFUN (show_ip_bgp_ipv4,
6650 show_ip_bgp_ipv4_cmd,
6651 "show ip bgp ipv4 (unicast|multicast)",
6652 SHOW_STR
6653 IP_STR
6654 BGP_STR
6655 "Address family\n"
6656 "Address Family modifier\n"
6657 "Address Family modifier\n")
6659 if (strncmp (argv[0], "m", 1) == 0)
6660 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6661 NULL);
6663 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6666 DEFUN (show_ip_bgp_route,
6667 show_ip_bgp_route_cmd,
6668 "show ip bgp A.B.C.D",
6669 SHOW_STR
6670 IP_STR
6671 BGP_STR
6672 "Network in the BGP routing table to display\n")
6674 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6677 DEFUN (show_ip_bgp_ipv4_route,
6678 show_ip_bgp_ipv4_route_cmd,
6679 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6680 SHOW_STR
6681 IP_STR
6682 BGP_STR
6683 "Address family\n"
6684 "Address Family modifier\n"
6685 "Address Family modifier\n"
6686 "Network in the BGP routing table to display\n")
6688 if (strncmp (argv[0], "m", 1) == 0)
6689 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6691 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6694 DEFUN (show_ip_bgp_vpnv4_all_route,
6695 show_ip_bgp_vpnv4_all_route_cmd,
6696 "show ip bgp vpnv4 all A.B.C.D",
6697 SHOW_STR
6698 IP_STR
6699 BGP_STR
6700 "Display VPNv4 NLRI specific information\n"
6701 "Display information about all VPNv4 NLRIs\n"
6702 "Network in the BGP routing table to display\n")
6704 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6707 DEFUN (show_ip_bgp_vpnv4_rd_route,
6708 show_ip_bgp_vpnv4_rd_route_cmd,
6709 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6710 SHOW_STR
6711 IP_STR
6712 BGP_STR
6713 "Display VPNv4 NLRI specific information\n"
6714 "Display information for a route distinguisher\n"
6715 "VPN Route Distinguisher\n"
6716 "Network in the BGP routing table to display\n")
6718 int ret;
6719 struct prefix_rd prd;
6721 ret = str2prefix_rd (argv[0], &prd);
6722 if (! ret)
6724 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6725 return CMD_WARNING;
6727 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6730 DEFUN (show_ip_bgp_prefix,
6731 show_ip_bgp_prefix_cmd,
6732 "show ip bgp A.B.C.D/M",
6733 SHOW_STR
6734 IP_STR
6735 BGP_STR
6736 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6738 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6741 DEFUN (show_ip_bgp_ipv4_prefix,
6742 show_ip_bgp_ipv4_prefix_cmd,
6743 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6744 SHOW_STR
6745 IP_STR
6746 BGP_STR
6747 "Address family\n"
6748 "Address Family modifier\n"
6749 "Address Family modifier\n"
6750 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6752 if (strncmp (argv[0], "m", 1) == 0)
6753 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6755 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6758 DEFUN (show_ip_bgp_vpnv4_all_prefix,
6759 show_ip_bgp_vpnv4_all_prefix_cmd,
6760 "show ip bgp vpnv4 all A.B.C.D/M",
6761 SHOW_STR
6762 IP_STR
6763 BGP_STR
6764 "Display VPNv4 NLRI specific information\n"
6765 "Display information about all VPNv4 NLRIs\n"
6766 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6768 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6771 DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6772 show_ip_bgp_vpnv4_rd_prefix_cmd,
6773 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6774 SHOW_STR
6775 IP_STR
6776 BGP_STR
6777 "Display VPNv4 NLRI specific information\n"
6778 "Display information for a route distinguisher\n"
6779 "VPN Route Distinguisher\n"
6780 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6782 int ret;
6783 struct prefix_rd prd;
6785 ret = str2prefix_rd (argv[0], &prd);
6786 if (! ret)
6788 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6789 return CMD_WARNING;
6791 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6794 DEFUN (show_ip_bgp_view,
6795 show_ip_bgp_view_cmd,
6796 "show ip bgp view WORD",
6797 SHOW_STR
6798 IP_STR
6799 BGP_STR
6800 "BGP view\n"
6801 "BGP view name\n")
6803 struct bgp *bgp;
6805 /* BGP structure lookup. */
6806 bgp = bgp_lookup_by_name (argv[0]);
6807 if (bgp == NULL)
6809 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6810 return CMD_WARNING;
6813 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6816 DEFUN (show_ip_bgp_view_route,
6817 show_ip_bgp_view_route_cmd,
6818 "show ip bgp view WORD A.B.C.D",
6819 SHOW_STR
6820 IP_STR
6821 BGP_STR
6822 "BGP view\n"
6823 "BGP view name\n"
6824 "Network in the BGP routing table to display\n")
6826 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6829 DEFUN (show_ip_bgp_view_prefix,
6830 show_ip_bgp_view_prefix_cmd,
6831 "show ip bgp view WORD A.B.C.D/M",
6832 SHOW_STR
6833 IP_STR
6834 BGP_STR
6835 "BGP view\n"
6836 "BGP view name\n"
6837 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6839 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6842 #ifdef HAVE_IPV6
6843 DEFUN (show_bgp,
6844 show_bgp_cmd,
6845 "show bgp",
6846 SHOW_STR
6847 BGP_STR)
6849 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6850 NULL);
6853 ALIAS (show_bgp,
6854 show_bgp_ipv6_cmd,
6855 "show bgp ipv6",
6856 SHOW_STR
6857 BGP_STR
6858 "Address family\n")
6860 /* old command */
6861 DEFUN (show_ipv6_bgp,
6862 show_ipv6_bgp_cmd,
6863 "show ipv6 bgp",
6864 SHOW_STR
6865 IP_STR
6866 BGP_STR)
6868 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6869 NULL);
6872 DEFUN (show_bgp_route,
6873 show_bgp_route_cmd,
6874 "show bgp X:X::X:X",
6875 SHOW_STR
6876 BGP_STR
6877 "Network in the BGP routing table to display\n")
6879 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6882 ALIAS (show_bgp_route,
6883 show_bgp_ipv6_route_cmd,
6884 "show bgp ipv6 X:X::X:X",
6885 SHOW_STR
6886 BGP_STR
6887 "Address family\n"
6888 "Network in the BGP routing table to display\n")
6890 /* old command */
6891 DEFUN (show_ipv6_bgp_route,
6892 show_ipv6_bgp_route_cmd,
6893 "show ipv6 bgp X:X::X:X",
6894 SHOW_STR
6895 IP_STR
6896 BGP_STR
6897 "Network in the BGP routing table to display\n")
6899 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6902 DEFUN (show_bgp_prefix,
6903 show_bgp_prefix_cmd,
6904 "show bgp X:X::X:X/M",
6905 SHOW_STR
6906 BGP_STR
6907 "IPv6 prefix <network>/<length>\n")
6909 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6912 ALIAS (show_bgp_prefix,
6913 show_bgp_ipv6_prefix_cmd,
6914 "show bgp ipv6 X:X::X:X/M",
6915 SHOW_STR
6916 BGP_STR
6917 "Address family\n"
6918 "IPv6 prefix <network>/<length>\n")
6920 /* old command */
6921 DEFUN (show_ipv6_bgp_prefix,
6922 show_ipv6_bgp_prefix_cmd,
6923 "show ipv6 bgp X:X::X:X/M",
6924 SHOW_STR
6925 IP_STR
6926 BGP_STR
6927 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6929 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6932 DEFUN (show_bgp_view,
6933 show_bgp_view_cmd,
6934 "show bgp view WORD",
6935 SHOW_STR
6936 BGP_STR
6937 "BGP view\n"
6938 "View name\n")
6940 struct bgp *bgp;
6942 /* BGP structure lookup. */
6943 bgp = bgp_lookup_by_name (argv[0]);
6944 if (bgp == NULL)
6946 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6947 return CMD_WARNING;
6950 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6953 ALIAS (show_bgp_view,
6954 show_bgp_view_ipv6_cmd,
6955 "show bgp view WORD ipv6",
6956 SHOW_STR
6957 BGP_STR
6958 "BGP view\n"
6959 "View name\n"
6960 "Address family\n")
6962 DEFUN (show_bgp_view_route,
6963 show_bgp_view_route_cmd,
6964 "show bgp view WORD X:X::X:X",
6965 SHOW_STR
6966 BGP_STR
6967 "BGP view\n"
6968 "View name\n"
6969 "Network in the BGP routing table to display\n")
6971 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6974 ALIAS (show_bgp_view_route,
6975 show_bgp_view_ipv6_route_cmd,
6976 "show bgp view WORD ipv6 X:X::X:X",
6977 SHOW_STR
6978 BGP_STR
6979 "BGP view\n"
6980 "View name\n"
6981 "Address family\n"
6982 "Network in the BGP routing table to display\n")
6984 DEFUN (show_bgp_view_prefix,
6985 show_bgp_view_prefix_cmd,
6986 "show bgp view WORD X:X::X:X/M",
6987 SHOW_STR
6988 BGP_STR
6989 "BGP view\n"
6990 "View name\n"
6991 "IPv6 prefix <network>/<length>\n")
6993 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6996 ALIAS (show_bgp_view_prefix,
6997 show_bgp_view_ipv6_prefix_cmd,
6998 "show bgp view WORD ipv6 X:X::X:X/M",
6999 SHOW_STR
7000 BGP_STR
7001 "BGP view\n"
7002 "View name\n"
7003 "Address family\n"
7004 "IPv6 prefix <network>/<length>\n")
7006 /* old command */
7007 DEFUN (show_ipv6_mbgp,
7008 show_ipv6_mbgp_cmd,
7009 "show ipv6 mbgp",
7010 SHOW_STR
7011 IP_STR
7012 MBGP_STR)
7014 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
7015 NULL);
7018 /* old command */
7019 DEFUN (show_ipv6_mbgp_route,
7020 show_ipv6_mbgp_route_cmd,
7021 "show ipv6 mbgp X:X::X:X",
7022 SHOW_STR
7023 IP_STR
7024 MBGP_STR
7025 "Network in the MBGP routing table to display\n")
7027 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
7030 /* old command */
7031 DEFUN (show_ipv6_mbgp_prefix,
7032 show_ipv6_mbgp_prefix_cmd,
7033 "show ipv6 mbgp X:X::X:X/M",
7034 SHOW_STR
7035 IP_STR
7036 MBGP_STR
7037 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7039 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
7041 #endif
7044 static int
7045 bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
7046 safi_t safi, enum bgp_show_type type)
7048 int i;
7049 struct buffer *b;
7050 char *regstr;
7051 int first;
7052 regex_t *regex;
7053 int rc;
7055 first = 0;
7056 b = buffer_new (1024);
7057 for (i = 0; i < argc; i++)
7059 if (first)
7060 buffer_putc (b, ' ');
7061 else
7063 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7064 continue;
7065 first = 1;
7068 buffer_putstr (b, argv[i]);
7070 buffer_putc (b, '\0');
7072 regstr = buffer_getstr (b);
7073 buffer_free (b);
7075 regex = bgp_regcomp (regstr);
7076 XFREE(MTYPE_TMP, regstr);
7077 if (! regex)
7079 vty_out (vty, "Can't compile regexp %s%s", argv[0],
7080 VTY_NEWLINE);
7081 return CMD_WARNING;
7084 rc = bgp_show (vty, NULL, afi, safi, type, regex);
7085 bgp_regex_free (regex);
7086 return rc;
7089 DEFUN (show_ip_bgp_regexp,
7090 show_ip_bgp_regexp_cmd,
7091 "show ip bgp regexp .LINE",
7092 SHOW_STR
7093 IP_STR
7094 BGP_STR
7095 "Display routes matching the AS path regular expression\n"
7096 "A regular-expression to match the BGP AS paths\n")
7098 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7099 bgp_show_type_regexp);
7102 DEFUN (show_ip_bgp_flap_regexp,
7103 show_ip_bgp_flap_regexp_cmd,
7104 "show ip bgp flap-statistics regexp .LINE",
7105 SHOW_STR
7106 IP_STR
7107 BGP_STR
7108 "Display flap statistics of routes\n"
7109 "Display routes matching the AS path regular expression\n"
7110 "A regular-expression to match the BGP AS paths\n")
7112 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7113 bgp_show_type_flap_regexp);
7116 DEFUN (show_ip_bgp_ipv4_regexp,
7117 show_ip_bgp_ipv4_regexp_cmd,
7118 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7119 SHOW_STR
7120 IP_STR
7121 BGP_STR
7122 "Address family\n"
7123 "Address Family modifier\n"
7124 "Address Family modifier\n"
7125 "Display routes matching the AS path regular expression\n"
7126 "A regular-expression to match the BGP AS paths\n")
7128 if (strncmp (argv[0], "m", 1) == 0)
7129 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7130 bgp_show_type_regexp);
7132 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7133 bgp_show_type_regexp);
7136 #ifdef HAVE_IPV6
7137 DEFUN (show_bgp_regexp,
7138 show_bgp_regexp_cmd,
7139 "show bgp regexp .LINE",
7140 SHOW_STR
7141 BGP_STR
7142 "Display routes matching the AS path regular expression\n"
7143 "A regular-expression to match the BGP AS paths\n")
7145 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7146 bgp_show_type_regexp);
7149 ALIAS (show_bgp_regexp,
7150 show_bgp_ipv6_regexp_cmd,
7151 "show bgp ipv6 regexp .LINE",
7152 SHOW_STR
7153 BGP_STR
7154 "Address family\n"
7155 "Display routes matching the AS path regular expression\n"
7156 "A regular-expression to match the BGP AS paths\n")
7158 /* old command */
7159 DEFUN (show_ipv6_bgp_regexp,
7160 show_ipv6_bgp_regexp_cmd,
7161 "show ipv6 bgp regexp .LINE",
7162 SHOW_STR
7163 IP_STR
7164 BGP_STR
7165 "Display routes matching the AS path regular expression\n"
7166 "A regular-expression to match the BGP AS paths\n")
7168 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7169 bgp_show_type_regexp);
7172 /* old command */
7173 DEFUN (show_ipv6_mbgp_regexp,
7174 show_ipv6_mbgp_regexp_cmd,
7175 "show ipv6 mbgp regexp .LINE",
7176 SHOW_STR
7177 IP_STR
7178 BGP_STR
7179 "Display routes matching the AS path regular expression\n"
7180 "A regular-expression to match the MBGP AS paths\n")
7182 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7183 bgp_show_type_regexp);
7185 #endif /* HAVE_IPV6 */
7187 static int
7188 bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
7189 safi_t safi, enum bgp_show_type type)
7191 struct prefix_list *plist;
7193 plist = prefix_list_lookup (afi, prefix_list_str);
7194 if (plist == NULL)
7196 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7197 prefix_list_str, VTY_NEWLINE);
7198 return CMD_WARNING;
7201 return bgp_show (vty, NULL, afi, safi, type, plist);
7204 DEFUN (show_ip_bgp_prefix_list,
7205 show_ip_bgp_prefix_list_cmd,
7206 "show ip bgp prefix-list WORD",
7207 SHOW_STR
7208 IP_STR
7209 BGP_STR
7210 "Display routes conforming to the prefix-list\n"
7211 "IP prefix-list name\n")
7213 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7214 bgp_show_type_prefix_list);
7217 DEFUN (show_ip_bgp_flap_prefix_list,
7218 show_ip_bgp_flap_prefix_list_cmd,
7219 "show ip bgp flap-statistics prefix-list WORD",
7220 SHOW_STR
7221 IP_STR
7222 BGP_STR
7223 "Display flap statistics of routes\n"
7224 "Display routes conforming to the prefix-list\n"
7225 "IP prefix-list name\n")
7227 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7228 bgp_show_type_flap_prefix_list);
7231 DEFUN (show_ip_bgp_ipv4_prefix_list,
7232 show_ip_bgp_ipv4_prefix_list_cmd,
7233 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7234 SHOW_STR
7235 IP_STR
7236 BGP_STR
7237 "Address family\n"
7238 "Address Family modifier\n"
7239 "Address Family modifier\n"
7240 "Display routes conforming to the prefix-list\n"
7241 "IP prefix-list name\n")
7243 if (strncmp (argv[0], "m", 1) == 0)
7244 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7245 bgp_show_type_prefix_list);
7247 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7248 bgp_show_type_prefix_list);
7251 #ifdef HAVE_IPV6
7252 DEFUN (show_bgp_prefix_list,
7253 show_bgp_prefix_list_cmd,
7254 "show bgp prefix-list WORD",
7255 SHOW_STR
7256 BGP_STR
7257 "Display routes conforming to the prefix-list\n"
7258 "IPv6 prefix-list name\n")
7260 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7261 bgp_show_type_prefix_list);
7264 ALIAS (show_bgp_prefix_list,
7265 show_bgp_ipv6_prefix_list_cmd,
7266 "show bgp ipv6 prefix-list WORD",
7267 SHOW_STR
7268 BGP_STR
7269 "Address family\n"
7270 "Display routes conforming to the prefix-list\n"
7271 "IPv6 prefix-list name\n")
7273 /* old command */
7274 DEFUN (show_ipv6_bgp_prefix_list,
7275 show_ipv6_bgp_prefix_list_cmd,
7276 "show ipv6 bgp prefix-list WORD",
7277 SHOW_STR
7278 IPV6_STR
7279 BGP_STR
7280 "Display routes matching the prefix-list\n"
7281 "IPv6 prefix-list name\n")
7283 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7284 bgp_show_type_prefix_list);
7287 /* old command */
7288 DEFUN (show_ipv6_mbgp_prefix_list,
7289 show_ipv6_mbgp_prefix_list_cmd,
7290 "show ipv6 mbgp prefix-list WORD",
7291 SHOW_STR
7292 IPV6_STR
7293 MBGP_STR
7294 "Display routes matching the prefix-list\n"
7295 "IPv6 prefix-list name\n")
7297 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7298 bgp_show_type_prefix_list);
7300 #endif /* HAVE_IPV6 */
7302 static int
7303 bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
7304 safi_t safi, enum bgp_show_type type)
7306 struct as_list *as_list;
7308 as_list = as_list_lookup (filter);
7309 if (as_list == NULL)
7311 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7312 return CMD_WARNING;
7315 return bgp_show (vty, NULL, afi, safi, type, as_list);
7318 DEFUN (show_ip_bgp_filter_list,
7319 show_ip_bgp_filter_list_cmd,
7320 "show ip bgp filter-list WORD",
7321 SHOW_STR
7322 IP_STR
7323 BGP_STR
7324 "Display routes conforming to the filter-list\n"
7325 "Regular expression access list name\n")
7327 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7328 bgp_show_type_filter_list);
7331 DEFUN (show_ip_bgp_flap_filter_list,
7332 show_ip_bgp_flap_filter_list_cmd,
7333 "show ip bgp flap-statistics filter-list WORD",
7334 SHOW_STR
7335 IP_STR
7336 BGP_STR
7337 "Display flap statistics of routes\n"
7338 "Display routes conforming to the filter-list\n"
7339 "Regular expression access list name\n")
7341 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7342 bgp_show_type_flap_filter_list);
7345 DEFUN (show_ip_bgp_ipv4_filter_list,
7346 show_ip_bgp_ipv4_filter_list_cmd,
7347 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7348 SHOW_STR
7349 IP_STR
7350 BGP_STR
7351 "Address family\n"
7352 "Address Family modifier\n"
7353 "Address Family modifier\n"
7354 "Display routes conforming to the filter-list\n"
7355 "Regular expression access list name\n")
7357 if (strncmp (argv[0], "m", 1) == 0)
7358 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7359 bgp_show_type_filter_list);
7361 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7362 bgp_show_type_filter_list);
7365 #ifdef HAVE_IPV6
7366 DEFUN (show_bgp_filter_list,
7367 show_bgp_filter_list_cmd,
7368 "show bgp filter-list WORD",
7369 SHOW_STR
7370 BGP_STR
7371 "Display routes conforming to the filter-list\n"
7372 "Regular expression access list name\n")
7374 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7375 bgp_show_type_filter_list);
7378 ALIAS (show_bgp_filter_list,
7379 show_bgp_ipv6_filter_list_cmd,
7380 "show bgp ipv6 filter-list WORD",
7381 SHOW_STR
7382 BGP_STR
7383 "Address family\n"
7384 "Display routes conforming to the filter-list\n"
7385 "Regular expression access list name\n")
7387 /* old command */
7388 DEFUN (show_ipv6_bgp_filter_list,
7389 show_ipv6_bgp_filter_list_cmd,
7390 "show ipv6 bgp filter-list WORD",
7391 SHOW_STR
7392 IPV6_STR
7393 BGP_STR
7394 "Display routes conforming to the filter-list\n"
7395 "Regular expression access list name\n")
7397 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7398 bgp_show_type_filter_list);
7401 /* old command */
7402 DEFUN (show_ipv6_mbgp_filter_list,
7403 show_ipv6_mbgp_filter_list_cmd,
7404 "show ipv6 mbgp filter-list WORD",
7405 SHOW_STR
7406 IPV6_STR
7407 MBGP_STR
7408 "Display routes conforming to the filter-list\n"
7409 "Regular expression access list name\n")
7411 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7412 bgp_show_type_filter_list);
7414 #endif /* HAVE_IPV6 */
7416 static int
7417 bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
7418 safi_t safi, enum bgp_show_type type)
7420 struct route_map *rmap;
7422 rmap = route_map_lookup_by_name (rmap_str);
7423 if (! rmap)
7425 vty_out (vty, "%% %s is not a valid route-map name%s",
7426 rmap_str, VTY_NEWLINE);
7427 return CMD_WARNING;
7430 return bgp_show (vty, NULL, afi, safi, type, rmap);
7433 DEFUN (show_ip_bgp_route_map,
7434 show_ip_bgp_route_map_cmd,
7435 "show ip bgp route-map WORD",
7436 SHOW_STR
7437 IP_STR
7438 BGP_STR
7439 "Display routes matching the route-map\n"
7440 "A route-map to match on\n")
7442 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7443 bgp_show_type_route_map);
7446 DEFUN (show_ip_bgp_flap_route_map,
7447 show_ip_bgp_flap_route_map_cmd,
7448 "show ip bgp flap-statistics route-map WORD",
7449 SHOW_STR
7450 IP_STR
7451 BGP_STR
7452 "Display flap statistics of routes\n"
7453 "Display routes matching the route-map\n"
7454 "A route-map to match on\n")
7456 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7457 bgp_show_type_flap_route_map);
7460 DEFUN (show_ip_bgp_ipv4_route_map,
7461 show_ip_bgp_ipv4_route_map_cmd,
7462 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7463 SHOW_STR
7464 IP_STR
7465 BGP_STR
7466 "Address family\n"
7467 "Address Family modifier\n"
7468 "Address Family modifier\n"
7469 "Display routes matching the route-map\n"
7470 "A route-map to match on\n")
7472 if (strncmp (argv[0], "m", 1) == 0)
7473 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7474 bgp_show_type_route_map);
7476 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7477 bgp_show_type_route_map);
7480 DEFUN (show_bgp_route_map,
7481 show_bgp_route_map_cmd,
7482 "show bgp route-map WORD",
7483 SHOW_STR
7484 BGP_STR
7485 "Display routes matching the route-map\n"
7486 "A route-map to match on\n")
7488 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7489 bgp_show_type_route_map);
7492 ALIAS (show_bgp_route_map,
7493 show_bgp_ipv6_route_map_cmd,
7494 "show bgp ipv6 route-map WORD",
7495 SHOW_STR
7496 BGP_STR
7497 "Address family\n"
7498 "Display routes matching the route-map\n"
7499 "A route-map to match on\n")
7501 DEFUN (show_ip_bgp_cidr_only,
7502 show_ip_bgp_cidr_only_cmd,
7503 "show ip bgp cidr-only",
7504 SHOW_STR
7505 IP_STR
7506 BGP_STR
7507 "Display only routes with non-natural netmasks\n")
7509 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7510 bgp_show_type_cidr_only, NULL);
7513 DEFUN (show_ip_bgp_flap_cidr_only,
7514 show_ip_bgp_flap_cidr_only_cmd,
7515 "show ip bgp flap-statistics cidr-only",
7516 SHOW_STR
7517 IP_STR
7518 BGP_STR
7519 "Display flap statistics of routes\n"
7520 "Display only routes with non-natural netmasks\n")
7522 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7523 bgp_show_type_flap_cidr_only, NULL);
7526 DEFUN (show_ip_bgp_ipv4_cidr_only,
7527 show_ip_bgp_ipv4_cidr_only_cmd,
7528 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7529 SHOW_STR
7530 IP_STR
7531 BGP_STR
7532 "Address family\n"
7533 "Address Family modifier\n"
7534 "Address Family modifier\n"
7535 "Display only routes with non-natural netmasks\n")
7537 if (strncmp (argv[0], "m", 1) == 0)
7538 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7539 bgp_show_type_cidr_only, NULL);
7541 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7542 bgp_show_type_cidr_only, NULL);
7545 DEFUN (show_ip_bgp_community_all,
7546 show_ip_bgp_community_all_cmd,
7547 "show ip bgp community",
7548 SHOW_STR
7549 IP_STR
7550 BGP_STR
7551 "Display routes matching the communities\n")
7553 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7554 bgp_show_type_community_all, NULL);
7557 DEFUN (show_ip_bgp_ipv4_community_all,
7558 show_ip_bgp_ipv4_community_all_cmd,
7559 "show ip bgp ipv4 (unicast|multicast) community",
7560 SHOW_STR
7561 IP_STR
7562 BGP_STR
7563 "Address family\n"
7564 "Address Family modifier\n"
7565 "Address Family modifier\n"
7566 "Display routes matching the communities\n")
7568 if (strncmp (argv[0], "m", 1) == 0)
7569 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7570 bgp_show_type_community_all, NULL);
7572 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7573 bgp_show_type_community_all, NULL);
7576 #ifdef HAVE_IPV6
7577 DEFUN (show_bgp_community_all,
7578 show_bgp_community_all_cmd,
7579 "show bgp community",
7580 SHOW_STR
7581 BGP_STR
7582 "Display routes matching the communities\n")
7584 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7585 bgp_show_type_community_all, NULL);
7588 ALIAS (show_bgp_community_all,
7589 show_bgp_ipv6_community_all_cmd,
7590 "show bgp ipv6 community",
7591 SHOW_STR
7592 BGP_STR
7593 "Address family\n"
7594 "Display routes matching the communities\n")
7596 /* old command */
7597 DEFUN (show_ipv6_bgp_community_all,
7598 show_ipv6_bgp_community_all_cmd,
7599 "show ipv6 bgp community",
7600 SHOW_STR
7601 IPV6_STR
7602 BGP_STR
7603 "Display routes matching the communities\n")
7605 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7606 bgp_show_type_community_all, NULL);
7609 /* old command */
7610 DEFUN (show_ipv6_mbgp_community_all,
7611 show_ipv6_mbgp_community_all_cmd,
7612 "show ipv6 mbgp community",
7613 SHOW_STR
7614 IPV6_STR
7615 MBGP_STR
7616 "Display routes matching the communities\n")
7618 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
7619 bgp_show_type_community_all, NULL);
7621 #endif /* HAVE_IPV6 */
7623 static int
7624 bgp_show_community (struct vty *vty, int argc, const char **argv, int exact,
7625 u_int16_t afi, u_char safi)
7627 struct community *com;
7628 struct buffer *b;
7629 int i;
7630 char *str;
7631 int first = 0;
7633 b = buffer_new (1024);
7634 for (i = 0; i < argc; i++)
7636 if (first)
7637 buffer_putc (b, ' ');
7638 else
7640 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7641 continue;
7642 first = 1;
7645 buffer_putstr (b, argv[i]);
7647 buffer_putc (b, '\0');
7649 str = buffer_getstr (b);
7650 buffer_free (b);
7652 com = community_str2com (str);
7653 XFREE (MTYPE_TMP, str);
7654 if (! com)
7656 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7657 return CMD_WARNING;
7660 return bgp_show (vty, NULL, afi, safi,
7661 (exact ? bgp_show_type_community_exact :
7662 bgp_show_type_community), com);
7665 DEFUN (show_ip_bgp_community,
7666 show_ip_bgp_community_cmd,
7667 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7668 SHOW_STR
7669 IP_STR
7670 BGP_STR
7671 "Display routes matching the communities\n"
7672 "community number\n"
7673 "Do not send outside local AS (well-known community)\n"
7674 "Do not advertise to any peer (well-known community)\n"
7675 "Do not export to next AS (well-known community)\n")
7677 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7680 ALIAS (show_ip_bgp_community,
7681 show_ip_bgp_community2_cmd,
7682 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7683 SHOW_STR
7684 IP_STR
7685 BGP_STR
7686 "Display routes matching the communities\n"
7687 "community number\n"
7688 "Do not send outside local AS (well-known community)\n"
7689 "Do not advertise to any peer (well-known community)\n"
7690 "Do not export to next AS (well-known community)\n"
7691 "community number\n"
7692 "Do not send outside local AS (well-known community)\n"
7693 "Do not advertise to any peer (well-known community)\n"
7694 "Do not export to next AS (well-known community)\n")
7696 ALIAS (show_ip_bgp_community,
7697 show_ip_bgp_community3_cmd,
7698 "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)",
7699 SHOW_STR
7700 IP_STR
7701 BGP_STR
7702 "Display routes matching the communities\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")
7716 ALIAS (show_ip_bgp_community,
7717 show_ip_bgp_community4_cmd,
7718 "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)",
7719 SHOW_STR
7720 IP_STR
7721 BGP_STR
7722 "Display routes matching the communities\n"
7723 "community number\n"
7724 "Do not send outside local AS (well-known community)\n"
7725 "Do not advertise to any peer (well-known community)\n"
7726 "Do not export to next AS (well-known community)\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 "community number\n"
7732 "Do not send outside local AS (well-known community)\n"
7733 "Do not advertise to any peer (well-known community)\n"
7734 "Do not export to next AS (well-known community)\n"
7735 "community number\n"
7736 "Do not send outside local AS (well-known community)\n"
7737 "Do not advertise to any peer (well-known community)\n"
7738 "Do not export to next AS (well-known community)\n")
7740 DEFUN (show_ip_bgp_ipv4_community,
7741 show_ip_bgp_ipv4_community_cmd,
7742 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7743 SHOW_STR
7744 IP_STR
7745 BGP_STR
7746 "Address family\n"
7747 "Address Family modifier\n"
7748 "Address Family modifier\n"
7749 "Display routes matching the communities\n"
7750 "community number\n"
7751 "Do not send outside local AS (well-known community)\n"
7752 "Do not advertise to any peer (well-known community)\n"
7753 "Do not export to next AS (well-known community)\n")
7755 if (strncmp (argv[0], "m", 1) == 0)
7756 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
7758 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7761 ALIAS (show_ip_bgp_ipv4_community,
7762 show_ip_bgp_ipv4_community2_cmd,
7763 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7764 SHOW_STR
7765 IP_STR
7766 BGP_STR
7767 "Address family\n"
7768 "Address Family modifier\n"
7769 "Address Family modifier\n"
7770 "Display routes matching the communities\n"
7771 "community number\n"
7772 "Do not send outside local AS (well-known community)\n"
7773 "Do not advertise to any peer (well-known community)\n"
7774 "Do not export to next AS (well-known community)\n"
7775 "community number\n"
7776 "Do not send outside local AS (well-known community)\n"
7777 "Do not advertise to any peer (well-known community)\n"
7778 "Do not export to next AS (well-known community)\n")
7780 ALIAS (show_ip_bgp_ipv4_community,
7781 show_ip_bgp_ipv4_community3_cmd,
7782 "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)",
7783 SHOW_STR
7784 IP_STR
7785 BGP_STR
7786 "Address family\n"
7787 "Address Family modifier\n"
7788 "Address Family modifier\n"
7789 "Display routes matching the communities\n"
7790 "community number\n"
7791 "Do not send outside local AS (well-known community)\n"
7792 "Do not advertise to any peer (well-known community)\n"
7793 "Do not export to next AS (well-known community)\n"
7794 "community number\n"
7795 "Do not send outside local AS (well-known community)\n"
7796 "Do not advertise to any peer (well-known community)\n"
7797 "Do not export to next AS (well-known community)\n"
7798 "community number\n"
7799 "Do not send outside local AS (well-known community)\n"
7800 "Do not advertise to any peer (well-known community)\n"
7801 "Do not export to next AS (well-known community)\n")
7803 ALIAS (show_ip_bgp_ipv4_community,
7804 show_ip_bgp_ipv4_community4_cmd,
7805 "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)",
7806 SHOW_STR
7807 IP_STR
7808 BGP_STR
7809 "Address family\n"
7810 "Address Family modifier\n"
7811 "Address Family modifier\n"
7812 "Display routes matching the communities\n"
7813 "community number\n"
7814 "Do not send outside local AS (well-known community)\n"
7815 "Do not advertise to any peer (well-known community)\n"
7816 "Do not export to next AS (well-known community)\n"
7817 "community number\n"
7818 "Do not send outside local AS (well-known community)\n"
7819 "Do not advertise to any peer (well-known community)\n"
7820 "Do not export to next AS (well-known community)\n"
7821 "community number\n"
7822 "Do not send outside local AS (well-known community)\n"
7823 "Do not advertise to any peer (well-known community)\n"
7824 "Do not export to next AS (well-known community)\n"
7825 "community number\n"
7826 "Do not send outside local AS (well-known community)\n"
7827 "Do not advertise to any peer (well-known community)\n"
7828 "Do not export to next AS (well-known community)\n")
7830 DEFUN (show_ip_bgp_community_exact,
7831 show_ip_bgp_community_exact_cmd,
7832 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7833 SHOW_STR
7834 IP_STR
7835 BGP_STR
7836 "Display routes matching the communities\n"
7837 "community number\n"
7838 "Do not send outside local AS (well-known community)\n"
7839 "Do not advertise to any peer (well-known community)\n"
7840 "Do not export to next AS (well-known community)\n"
7841 "Exact match of the communities")
7843 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7846 ALIAS (show_ip_bgp_community_exact,
7847 show_ip_bgp_community2_exact_cmd,
7848 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7849 SHOW_STR
7850 IP_STR
7851 BGP_STR
7852 "Display routes matching the communities\n"
7853 "community number\n"
7854 "Do not send outside local AS (well-known community)\n"
7855 "Do not advertise to any peer (well-known community)\n"
7856 "Do not export to next AS (well-known community)\n"
7857 "community number\n"
7858 "Do not send outside local AS (well-known community)\n"
7859 "Do not advertise to any peer (well-known community)\n"
7860 "Do not export to next AS (well-known community)\n"
7861 "Exact match of the communities")
7863 ALIAS (show_ip_bgp_community_exact,
7864 show_ip_bgp_community3_exact_cmd,
7865 "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",
7866 SHOW_STR
7867 IP_STR
7868 BGP_STR
7869 "Display routes matching the communities\n"
7870 "community number\n"
7871 "Do not send outside local AS (well-known community)\n"
7872 "Do not advertise to any peer (well-known community)\n"
7873 "Do not export to next AS (well-known community)\n"
7874 "community number\n"
7875 "Do not send outside local AS (well-known community)\n"
7876 "Do not advertise to any peer (well-known community)\n"
7877 "Do not export to next AS (well-known community)\n"
7878 "community number\n"
7879 "Do not send outside local AS (well-known community)\n"
7880 "Do not advertise to any peer (well-known community)\n"
7881 "Do not export to next AS (well-known community)\n"
7882 "Exact match of the communities")
7884 ALIAS (show_ip_bgp_community_exact,
7885 show_ip_bgp_community4_exact_cmd,
7886 "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",
7887 SHOW_STR
7888 IP_STR
7889 BGP_STR
7890 "Display routes matching the communities\n"
7891 "community number\n"
7892 "Do not send outside local AS (well-known community)\n"
7893 "Do not advertise to any peer (well-known community)\n"
7894 "Do not export to next AS (well-known community)\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 "Exact match of the communities")
7909 DEFUN (show_ip_bgp_ipv4_community_exact,
7910 show_ip_bgp_ipv4_community_exact_cmd,
7911 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7912 SHOW_STR
7913 IP_STR
7914 BGP_STR
7915 "Address family\n"
7916 "Address Family modifier\n"
7917 "Address Family modifier\n"
7918 "Display routes matching the communities\n"
7919 "community number\n"
7920 "Do not send outside local AS (well-known community)\n"
7921 "Do not advertise to any peer (well-known community)\n"
7922 "Do not export to next AS (well-known community)\n"
7923 "Exact match of the communities")
7925 if (strncmp (argv[0], "m", 1) == 0)
7926 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
7928 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7931 ALIAS (show_ip_bgp_ipv4_community_exact,
7932 show_ip_bgp_ipv4_community2_exact_cmd,
7933 "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",
7934 SHOW_STR
7935 IP_STR
7936 BGP_STR
7937 "Address family\n"
7938 "Address Family modifier\n"
7939 "Address Family modifier\n"
7940 "Display routes matching the communities\n"
7941 "community number\n"
7942 "Do not send outside local AS (well-known community)\n"
7943 "Do not advertise to any peer (well-known community)\n"
7944 "Do not export to next AS (well-known community)\n"
7945 "community number\n"
7946 "Do not send outside local AS (well-known community)\n"
7947 "Do not advertise to any peer (well-known community)\n"
7948 "Do not export to next AS (well-known community)\n"
7949 "Exact match of the communities")
7951 ALIAS (show_ip_bgp_ipv4_community_exact,
7952 show_ip_bgp_ipv4_community3_exact_cmd,
7953 "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",
7954 SHOW_STR
7955 IP_STR
7956 BGP_STR
7957 "Address family\n"
7958 "Address Family modifier\n"
7959 "Address Family modifier\n"
7960 "Display routes matching the communities\n"
7961 "community number\n"
7962 "Do not send outside local AS (well-known community)\n"
7963 "Do not advertise to any peer (well-known community)\n"
7964 "Do not export to next AS (well-known community)\n"
7965 "community number\n"
7966 "Do not send outside local AS (well-known community)\n"
7967 "Do not advertise to any peer (well-known community)\n"
7968 "Do not export to next AS (well-known community)\n"
7969 "community number\n"
7970 "Do not send outside local AS (well-known community)\n"
7971 "Do not advertise to any peer (well-known community)\n"
7972 "Do not export to next AS (well-known community)\n"
7973 "Exact match of the communities")
7975 ALIAS (show_ip_bgp_ipv4_community_exact,
7976 show_ip_bgp_ipv4_community4_exact_cmd,
7977 "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",
7978 SHOW_STR
7979 IP_STR
7980 BGP_STR
7981 "Address family\n"
7982 "Address Family modifier\n"
7983 "Address Family modifier\n"
7984 "Display routes matching the communities\n"
7985 "community number\n"
7986 "Do not send outside local AS (well-known community)\n"
7987 "Do not advertise to any peer (well-known community)\n"
7988 "Do not export to next AS (well-known community)\n"
7989 "community number\n"
7990 "Do not send outside local AS (well-known community)\n"
7991 "Do not advertise to any peer (well-known community)\n"
7992 "Do not export to next AS (well-known community)\n"
7993 "community number\n"
7994 "Do not send outside local AS (well-known community)\n"
7995 "Do not advertise to any peer (well-known community)\n"
7996 "Do not export to next AS (well-known community)\n"
7997 "community number\n"
7998 "Do not send outside local AS (well-known community)\n"
7999 "Do not advertise to any peer (well-known community)\n"
8000 "Do not export to next AS (well-known community)\n"
8001 "Exact match of the communities")
8003 #ifdef HAVE_IPV6
8004 DEFUN (show_bgp_community,
8005 show_bgp_community_cmd,
8006 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
8007 SHOW_STR
8008 BGP_STR
8009 "Display routes matching the communities\n"
8010 "community number\n"
8011 "Do not send outside local AS (well-known community)\n"
8012 "Do not advertise to any peer (well-known community)\n"
8013 "Do not export to next AS (well-known community)\n")
8015 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
8018 ALIAS (show_bgp_community,
8019 show_bgp_ipv6_community_cmd,
8020 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
8021 SHOW_STR
8022 BGP_STR
8023 "Address family\n"
8024 "Display routes matching the communities\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")
8030 ALIAS (show_bgp_community,
8031 show_bgp_community2_cmd,
8032 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8033 SHOW_STR
8034 BGP_STR
8035 "Display routes matching the communities\n"
8036 "community number\n"
8037 "Do not send outside local AS (well-known community)\n"
8038 "Do not advertise to any peer (well-known community)\n"
8039 "Do not export to next AS (well-known community)\n"
8040 "community number\n"
8041 "Do not send outside local AS (well-known community)\n"
8042 "Do not advertise to any peer (well-known community)\n"
8043 "Do not export to next AS (well-known community)\n")
8045 ALIAS (show_bgp_community,
8046 show_bgp_ipv6_community2_cmd,
8047 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8048 SHOW_STR
8049 BGP_STR
8050 "Address family\n"
8051 "Display routes matching the communities\n"
8052 "community number\n"
8053 "Do not send outside local AS (well-known community)\n"
8054 "Do not advertise to any peer (well-known community)\n"
8055 "Do not export to next AS (well-known community)\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")
8061 ALIAS (show_bgp_community,
8062 show_bgp_community3_cmd,
8063 "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)",
8064 SHOW_STR
8065 BGP_STR
8066 "Display routes matching the communities\n"
8067 "community number\n"
8068 "Do not send outside local AS (well-known community)\n"
8069 "Do not advertise to any peer (well-known community)\n"
8070 "Do not export to next AS (well-known community)\n"
8071 "community number\n"
8072 "Do not send outside local AS (well-known community)\n"
8073 "Do not advertise to any peer (well-known community)\n"
8074 "Do not export to next AS (well-known community)\n"
8075 "community number\n"
8076 "Do not send outside local AS (well-known community)\n"
8077 "Do not advertise to any peer (well-known community)\n"
8078 "Do not export to next AS (well-known community)\n")
8080 ALIAS (show_bgp_community,
8081 show_bgp_ipv6_community3_cmd,
8082 "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)",
8083 SHOW_STR
8084 BGP_STR
8085 "Address family\n"
8086 "Display routes matching the communities\n"
8087 "community number\n"
8088 "Do not send outside local AS (well-known community)\n"
8089 "Do not advertise to any peer (well-known community)\n"
8090 "Do not export to next AS (well-known community)\n"
8091 "community number\n"
8092 "Do not send outside local AS (well-known community)\n"
8093 "Do not advertise to any peer (well-known community)\n"
8094 "Do not export to next AS (well-known community)\n"
8095 "community number\n"
8096 "Do not send outside local AS (well-known community)\n"
8097 "Do not advertise to any peer (well-known community)\n"
8098 "Do not export to next AS (well-known community)\n")
8100 ALIAS (show_bgp_community,
8101 show_bgp_community4_cmd,
8102 "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)",
8103 SHOW_STR
8104 BGP_STR
8105 "Display routes matching the communities\n"
8106 "community number\n"
8107 "Do not send outside local AS (well-known community)\n"
8108 "Do not advertise to any peer (well-known community)\n"
8109 "Do not export to next AS (well-known community)\n"
8110 "community number\n"
8111 "Do not send outside local AS (well-known community)\n"
8112 "Do not advertise to any peer (well-known community)\n"
8113 "Do not export to next AS (well-known community)\n"
8114 "community number\n"
8115 "Do not send outside local AS (well-known community)\n"
8116 "Do not advertise to any peer (well-known community)\n"
8117 "Do not export to next AS (well-known community)\n"
8118 "community number\n"
8119 "Do not send outside local AS (well-known community)\n"
8120 "Do not advertise to any peer (well-known community)\n"
8121 "Do not export to next AS (well-known community)\n")
8123 ALIAS (show_bgp_community,
8124 show_bgp_ipv6_community4_cmd,
8125 "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)",
8126 SHOW_STR
8127 BGP_STR
8128 "Address family\n"
8129 "Display routes matching the communities\n"
8130 "community number\n"
8131 "Do not send outside local AS (well-known community)\n"
8132 "Do not advertise to any peer (well-known community)\n"
8133 "Do not export to next AS (well-known community)\n"
8134 "community number\n"
8135 "Do not send outside local AS (well-known community)\n"
8136 "Do not advertise to any peer (well-known community)\n"
8137 "Do not export to next AS (well-known community)\n"
8138 "community number\n"
8139 "Do not send outside local AS (well-known community)\n"
8140 "Do not advertise to any peer (well-known community)\n"
8141 "Do not export to next AS (well-known community)\n"
8142 "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")
8147 /* old command */
8148 DEFUN (show_ipv6_bgp_community,
8149 show_ipv6_bgp_community_cmd,
8150 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8151 SHOW_STR
8152 IPV6_STR
8153 BGP_STR
8154 "Display routes matching the communities\n"
8155 "community number\n"
8156 "Do not send outside local AS (well-known community)\n"
8157 "Do not advertise to any peer (well-known community)\n"
8158 "Do not export to next AS (well-known community)\n")
8160 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
8163 /* old command */
8164 ALIAS (show_ipv6_bgp_community,
8165 show_ipv6_bgp_community2_cmd,
8166 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8167 SHOW_STR
8168 IPV6_STR
8169 BGP_STR
8170 "Display routes matching the communities\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")
8180 /* old command */
8181 ALIAS (show_ipv6_bgp_community,
8182 show_ipv6_bgp_community3_cmd,
8183 "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)",
8184 SHOW_STR
8185 IPV6_STR
8186 BGP_STR
8187 "Display routes matching the communities\n"
8188 "community number\n"
8189 "Do not send outside local AS (well-known community)\n"
8190 "Do not advertise to any peer (well-known community)\n"
8191 "Do not export to next AS (well-known community)\n"
8192 "community number\n"
8193 "Do not send outside local AS (well-known community)\n"
8194 "Do not advertise to any peer (well-known community)\n"
8195 "Do not export to next AS (well-known community)\n"
8196 "community number\n"
8197 "Do not send outside local AS (well-known community)\n"
8198 "Do not advertise to any peer (well-known community)\n"
8199 "Do not export to next AS (well-known community)\n")
8201 /* old command */
8202 ALIAS (show_ipv6_bgp_community,
8203 show_ipv6_bgp_community4_cmd,
8204 "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)",
8205 SHOW_STR
8206 IPV6_STR
8207 BGP_STR
8208 "Display routes matching the communities\n"
8209 "community number\n"
8210 "Do not send outside local AS (well-known community)\n"
8211 "Do not advertise to any peer (well-known community)\n"
8212 "Do not export to next AS (well-known community)\n"
8213 "community number\n"
8214 "Do not send outside local AS (well-known community)\n"
8215 "Do not advertise to any peer (well-known community)\n"
8216 "Do not export to next AS (well-known community)\n"
8217 "community number\n"
8218 "Do not send outside local AS (well-known community)\n"
8219 "Do not advertise to any peer (well-known community)\n"
8220 "Do not export to next AS (well-known community)\n"
8221 "community number\n"
8222 "Do not send outside local AS (well-known community)\n"
8223 "Do not advertise to any peer (well-known community)\n"
8224 "Do not export to next AS (well-known community)\n")
8226 DEFUN (show_bgp_community_exact,
8227 show_bgp_community_exact_cmd,
8228 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8229 SHOW_STR
8230 BGP_STR
8231 "Display routes matching the communities\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 "Exact match of the communities")
8238 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8241 ALIAS (show_bgp_community_exact,
8242 show_bgp_ipv6_community_exact_cmd,
8243 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8244 SHOW_STR
8245 BGP_STR
8246 "Address family\n"
8247 "Display routes matching the communities\n"
8248 "community number\n"
8249 "Do not send outside local AS (well-known community)\n"
8250 "Do not advertise to any peer (well-known community)\n"
8251 "Do not export to next AS (well-known community)\n"
8252 "Exact match of the communities")
8254 ALIAS (show_bgp_community_exact,
8255 show_bgp_community2_exact_cmd,
8256 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8257 SHOW_STR
8258 BGP_STR
8259 "Display routes matching the communities\n"
8260 "community number\n"
8261 "Do not send outside local AS (well-known community)\n"
8262 "Do not advertise to any peer (well-known community)\n"
8263 "Do not export to next AS (well-known community)\n"
8264 "community number\n"
8265 "Do not send outside local AS (well-known community)\n"
8266 "Do not advertise to any peer (well-known community)\n"
8267 "Do not export to next AS (well-known community)\n"
8268 "Exact match of the communities")
8270 ALIAS (show_bgp_community_exact,
8271 show_bgp_ipv6_community2_exact_cmd,
8272 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8273 SHOW_STR
8274 BGP_STR
8275 "Address family\n"
8276 "Display routes matching the communities\n"
8277 "community number\n"
8278 "Do not send outside local AS (well-known community)\n"
8279 "Do not advertise to any peer (well-known community)\n"
8280 "Do not export to next AS (well-known community)\n"
8281 "community number\n"
8282 "Do not send outside local AS (well-known community)\n"
8283 "Do not advertise to any peer (well-known community)\n"
8284 "Do not export to next AS (well-known community)\n"
8285 "Exact match of the communities")
8287 ALIAS (show_bgp_community_exact,
8288 show_bgp_community3_exact_cmd,
8289 "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",
8290 SHOW_STR
8291 BGP_STR
8292 "Display routes matching the communities\n"
8293 "community number\n"
8294 "Do not send outside local AS (well-known community)\n"
8295 "Do not advertise to any peer (well-known community)\n"
8296 "Do not export to next AS (well-known community)\n"
8297 "community number\n"
8298 "Do not send outside local AS (well-known community)\n"
8299 "Do not advertise to any peer (well-known community)\n"
8300 "Do not export to next AS (well-known community)\n"
8301 "community number\n"
8302 "Do not send outside local AS (well-known community)\n"
8303 "Do not advertise to any peer (well-known community)\n"
8304 "Do not export to next AS (well-known community)\n"
8305 "Exact match of the communities")
8307 ALIAS (show_bgp_community_exact,
8308 show_bgp_ipv6_community3_exact_cmd,
8309 "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",
8310 SHOW_STR
8311 BGP_STR
8312 "Address family\n"
8313 "Display routes matching the communities\n"
8314 "community number\n"
8315 "Do not send outside local AS (well-known community)\n"
8316 "Do not advertise to any peer (well-known community)\n"
8317 "Do not export to next AS (well-known community)\n"
8318 "community number\n"
8319 "Do not send outside local AS (well-known community)\n"
8320 "Do not advertise to any peer (well-known community)\n"
8321 "Do not export to next AS (well-known community)\n"
8322 "community number\n"
8323 "Do not send outside local AS (well-known community)\n"
8324 "Do not advertise to any peer (well-known community)\n"
8325 "Do not export to next AS (well-known community)\n"
8326 "Exact match of the communities")
8328 ALIAS (show_bgp_community_exact,
8329 show_bgp_community4_exact_cmd,
8330 "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",
8331 SHOW_STR
8332 BGP_STR
8333 "Display routes matching the communities\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 "community number\n"
8347 "Do not send outside local AS (well-known community)\n"
8348 "Do not advertise to any peer (well-known community)\n"
8349 "Do not export to next AS (well-known community)\n"
8350 "Exact match of the communities")
8352 ALIAS (show_bgp_community_exact,
8353 show_bgp_ipv6_community4_exact_cmd,
8354 "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",
8355 SHOW_STR
8356 BGP_STR
8357 "Address family\n"
8358 "Display routes matching the communities\n"
8359 "community number\n"
8360 "Do not send outside local AS (well-known community)\n"
8361 "Do not advertise to any peer (well-known community)\n"
8362 "Do not export to next AS (well-known community)\n"
8363 "community number\n"
8364 "Do not send outside local AS (well-known community)\n"
8365 "Do not advertise to any peer (well-known community)\n"
8366 "Do not export to next AS (well-known community)\n"
8367 "community number\n"
8368 "Do not send outside local AS (well-known community)\n"
8369 "Do not advertise to any peer (well-known community)\n"
8370 "Do not export to next AS (well-known community)\n"
8371 "community number\n"
8372 "Do not send outside local AS (well-known community)\n"
8373 "Do not advertise to any peer (well-known community)\n"
8374 "Do not export to next AS (well-known community)\n"
8375 "Exact match of the communities")
8377 /* old command */
8378 DEFUN (show_ipv6_bgp_community_exact,
8379 show_ipv6_bgp_community_exact_cmd,
8380 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8381 SHOW_STR
8382 IPV6_STR
8383 BGP_STR
8384 "Display routes matching the communities\n"
8385 "community number\n"
8386 "Do not send outside local AS (well-known community)\n"
8387 "Do not advertise to any peer (well-known community)\n"
8388 "Do not export to next AS (well-known community)\n"
8389 "Exact match of the communities")
8391 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8394 /* old command */
8395 ALIAS (show_ipv6_bgp_community_exact,
8396 show_ipv6_bgp_community2_exact_cmd,
8397 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8398 SHOW_STR
8399 IPV6_STR
8400 BGP_STR
8401 "Display routes matching the communities\n"
8402 "community number\n"
8403 "Do not send outside local AS (well-known community)\n"
8404 "Do not advertise to any peer (well-known community)\n"
8405 "Do not export to next AS (well-known community)\n"
8406 "community number\n"
8407 "Do not send outside local AS (well-known community)\n"
8408 "Do not advertise to any peer (well-known community)\n"
8409 "Do not export to next AS (well-known community)\n"
8410 "Exact match of the communities")
8412 /* old command */
8413 ALIAS (show_ipv6_bgp_community_exact,
8414 show_ipv6_bgp_community3_exact_cmd,
8415 "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",
8416 SHOW_STR
8417 IPV6_STR
8418 BGP_STR
8419 "Display routes matching the communities\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 "community number\n"
8429 "Do not send outside local AS (well-known community)\n"
8430 "Do not advertise to any peer (well-known community)\n"
8431 "Do not export to next AS (well-known community)\n"
8432 "Exact match of the communities")
8434 /* old command */
8435 ALIAS (show_ipv6_bgp_community_exact,
8436 show_ipv6_bgp_community4_exact_cmd,
8437 "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",
8438 SHOW_STR
8439 IPV6_STR
8440 BGP_STR
8441 "Display routes matching the communities\n"
8442 "community number\n"
8443 "Do not send outside local AS (well-known community)\n"
8444 "Do not advertise to any peer (well-known community)\n"
8445 "Do not export to next AS (well-known community)\n"
8446 "community number\n"
8447 "Do not send outside local AS (well-known community)\n"
8448 "Do not advertise to any peer (well-known community)\n"
8449 "Do not export to next AS (well-known community)\n"
8450 "community number\n"
8451 "Do not send outside local AS (well-known community)\n"
8452 "Do not advertise to any peer (well-known community)\n"
8453 "Do not export to next AS (well-known community)\n"
8454 "community number\n"
8455 "Do not send outside local AS (well-known community)\n"
8456 "Do not advertise to any peer (well-known community)\n"
8457 "Do not export to next AS (well-known community)\n"
8458 "Exact match of the communities")
8460 /* old command */
8461 DEFUN (show_ipv6_mbgp_community,
8462 show_ipv6_mbgp_community_cmd,
8463 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8464 SHOW_STR
8465 IPV6_STR
8466 MBGP_STR
8467 "Display routes matching the communities\n"
8468 "community number\n"
8469 "Do not send outside local AS (well-known community)\n"
8470 "Do not advertise to any peer (well-known community)\n"
8471 "Do not export to next AS (well-known community)\n")
8473 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
8476 /* old command */
8477 ALIAS (show_ipv6_mbgp_community,
8478 show_ipv6_mbgp_community2_cmd,
8479 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8480 SHOW_STR
8481 IPV6_STR
8482 MBGP_STR
8483 "Display routes matching the communities\n"
8484 "community number\n"
8485 "Do not send outside local AS (well-known community)\n"
8486 "Do not advertise to any peer (well-known community)\n"
8487 "Do not export to next AS (well-known community)\n"
8488 "community number\n"
8489 "Do not send outside local AS (well-known community)\n"
8490 "Do not advertise to any peer (well-known community)\n"
8491 "Do not export to next AS (well-known community)\n")
8493 /* old command */
8494 ALIAS (show_ipv6_mbgp_community,
8495 show_ipv6_mbgp_community3_cmd,
8496 "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)",
8497 SHOW_STR
8498 IPV6_STR
8499 MBGP_STR
8500 "Display routes matching the communities\n"
8501 "community number\n"
8502 "Do not send outside local AS (well-known community)\n"
8503 "Do not advertise to any peer (well-known community)\n"
8504 "Do not export to next AS (well-known community)\n"
8505 "community number\n"
8506 "Do not send outside local AS (well-known community)\n"
8507 "Do not advertise to any peer (well-known community)\n"
8508 "Do not export to next AS (well-known community)\n"
8509 "community number\n"
8510 "Do not send outside local AS (well-known community)\n"
8511 "Do not advertise to any peer (well-known community)\n"
8512 "Do not export to next AS (well-known community)\n")
8514 /* old command */
8515 ALIAS (show_ipv6_mbgp_community,
8516 show_ipv6_mbgp_community4_cmd,
8517 "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)",
8518 SHOW_STR
8519 IPV6_STR
8520 MBGP_STR
8521 "Display routes matching the communities\n"
8522 "community number\n"
8523 "Do not send outside local AS (well-known community)\n"
8524 "Do not advertise to any peer (well-known community)\n"
8525 "Do not export to next AS (well-known community)\n"
8526 "community number\n"
8527 "Do not send outside local AS (well-known community)\n"
8528 "Do not advertise to any peer (well-known community)\n"
8529 "Do not export to next AS (well-known community)\n"
8530 "community number\n"
8531 "Do not send outside local AS (well-known community)\n"
8532 "Do not advertise to any peer (well-known community)\n"
8533 "Do not export to next AS (well-known community)\n"
8534 "community number\n"
8535 "Do not send outside local AS (well-known community)\n"
8536 "Do not advertise to any peer (well-known community)\n"
8537 "Do not export to next AS (well-known community)\n")
8539 /* old command */
8540 DEFUN (show_ipv6_mbgp_community_exact,
8541 show_ipv6_mbgp_community_exact_cmd,
8542 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8543 SHOW_STR
8544 IPV6_STR
8545 MBGP_STR
8546 "Display routes matching the communities\n"
8547 "community number\n"
8548 "Do not send outside local AS (well-known community)\n"
8549 "Do not advertise to any peer (well-known community)\n"
8550 "Do not export to next AS (well-known community)\n"
8551 "Exact match of the communities")
8553 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
8556 /* old command */
8557 ALIAS (show_ipv6_mbgp_community_exact,
8558 show_ipv6_mbgp_community2_exact_cmd,
8559 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8560 SHOW_STR
8561 IPV6_STR
8562 MBGP_STR
8563 "Display routes matching the communities\n"
8564 "community number\n"
8565 "Do not send outside local AS (well-known community)\n"
8566 "Do not advertise to any peer (well-known community)\n"
8567 "Do not export to next AS (well-known community)\n"
8568 "community number\n"
8569 "Do not send outside local AS (well-known community)\n"
8570 "Do not advertise to any peer (well-known community)\n"
8571 "Do not export to next AS (well-known community)\n"
8572 "Exact match of the communities")
8574 /* old command */
8575 ALIAS (show_ipv6_mbgp_community_exact,
8576 show_ipv6_mbgp_community3_exact_cmd,
8577 "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",
8578 SHOW_STR
8579 IPV6_STR
8580 MBGP_STR
8581 "Display routes matching the communities\n"
8582 "community number\n"
8583 "Do not send outside local AS (well-known community)\n"
8584 "Do not advertise to any peer (well-known community)\n"
8585 "Do not export to next AS (well-known community)\n"
8586 "community number\n"
8587 "Do not send outside local AS (well-known community)\n"
8588 "Do not advertise to any peer (well-known community)\n"
8589 "Do not export to next AS (well-known community)\n"
8590 "community number\n"
8591 "Do not send outside local AS (well-known community)\n"
8592 "Do not advertise to any peer (well-known community)\n"
8593 "Do not export to next AS (well-known community)\n"
8594 "Exact match of the communities")
8596 /* old command */
8597 ALIAS (show_ipv6_mbgp_community_exact,
8598 show_ipv6_mbgp_community4_exact_cmd,
8599 "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",
8600 SHOW_STR
8601 IPV6_STR
8602 MBGP_STR
8603 "Display routes matching the communities\n"
8604 "community number\n"
8605 "Do not send outside local AS (well-known community)\n"
8606 "Do not advertise to any peer (well-known community)\n"
8607 "Do not export to next AS (well-known community)\n"
8608 "community number\n"
8609 "Do not send outside local AS (well-known community)\n"
8610 "Do not advertise to any peer (well-known community)\n"
8611 "Do not export to next AS (well-known community)\n"
8612 "community number\n"
8613 "Do not send outside local AS (well-known community)\n"
8614 "Do not advertise to any peer (well-known community)\n"
8615 "Do not export to next AS (well-known community)\n"
8616 "community number\n"
8617 "Do not send outside local AS (well-known community)\n"
8618 "Do not advertise to any peer (well-known community)\n"
8619 "Do not export to next AS (well-known community)\n"
8620 "Exact match of the communities")
8621 #endif /* HAVE_IPV6 */
8623 static int
8624 bgp_show_community_list (struct vty *vty, const char *com, int exact,
8625 u_int16_t afi, u_char safi)
8627 struct community_list *list;
8629 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
8630 if (list == NULL)
8632 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8633 VTY_NEWLINE);
8634 return CMD_WARNING;
8637 return bgp_show (vty, NULL, afi, safi,
8638 (exact ? bgp_show_type_community_list_exact :
8639 bgp_show_type_community_list), list);
8642 DEFUN (show_ip_bgp_community_list,
8643 show_ip_bgp_community_list_cmd,
8644 "show ip bgp community-list (<1-500>|WORD)",
8645 SHOW_STR
8646 IP_STR
8647 BGP_STR
8648 "Display routes matching the community-list\n"
8649 "community-list number\n"
8650 "community-list name\n")
8652 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8655 DEFUN (show_ip_bgp_ipv4_community_list,
8656 show_ip_bgp_ipv4_community_list_cmd,
8657 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
8658 SHOW_STR
8659 IP_STR
8660 BGP_STR
8661 "Address family\n"
8662 "Address Family modifier\n"
8663 "Address Family modifier\n"
8664 "Display routes matching the community-list\n"
8665 "community-list number\n"
8666 "community-list name\n")
8668 if (strncmp (argv[0], "m", 1) == 0)
8669 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8671 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8674 DEFUN (show_ip_bgp_community_list_exact,
8675 show_ip_bgp_community_list_exact_cmd,
8676 "show ip bgp community-list (<1-500>|WORD) exact-match",
8677 SHOW_STR
8678 IP_STR
8679 BGP_STR
8680 "Display routes matching the community-list\n"
8681 "community-list number\n"
8682 "community-list name\n"
8683 "Exact match of the communities\n")
8685 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8688 DEFUN (show_ip_bgp_ipv4_community_list_exact,
8689 show_ip_bgp_ipv4_community_list_exact_cmd,
8690 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
8691 SHOW_STR
8692 IP_STR
8693 BGP_STR
8694 "Address family\n"
8695 "Address Family modifier\n"
8696 "Address Family modifier\n"
8697 "Display routes matching the community-list\n"
8698 "community-list number\n"
8699 "community-list name\n"
8700 "Exact match of the communities\n")
8702 if (strncmp (argv[0], "m", 1) == 0)
8703 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8705 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8708 #ifdef HAVE_IPV6
8709 DEFUN (show_bgp_community_list,
8710 show_bgp_community_list_cmd,
8711 "show bgp community-list (<1-500>|WORD)",
8712 SHOW_STR
8713 BGP_STR
8714 "Display routes matching the community-list\n"
8715 "community-list number\n"
8716 "community-list name\n")
8718 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8721 ALIAS (show_bgp_community_list,
8722 show_bgp_ipv6_community_list_cmd,
8723 "show bgp ipv6 community-list (<1-500>|WORD)",
8724 SHOW_STR
8725 BGP_STR
8726 "Address family\n"
8727 "Display routes matching the community-list\n"
8728 "community-list number\n"
8729 "community-list name\n")
8731 /* old command */
8732 DEFUN (show_ipv6_bgp_community_list,
8733 show_ipv6_bgp_community_list_cmd,
8734 "show ipv6 bgp community-list WORD",
8735 SHOW_STR
8736 IPV6_STR
8737 BGP_STR
8738 "Display routes matching the community-list\n"
8739 "community-list name\n")
8741 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8744 /* old command */
8745 DEFUN (show_ipv6_mbgp_community_list,
8746 show_ipv6_mbgp_community_list_cmd,
8747 "show ipv6 mbgp community-list WORD",
8748 SHOW_STR
8749 IPV6_STR
8750 MBGP_STR
8751 "Display routes matching the community-list\n"
8752 "community-list name\n")
8754 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8757 DEFUN (show_bgp_community_list_exact,
8758 show_bgp_community_list_exact_cmd,
8759 "show bgp community-list (<1-500>|WORD) exact-match",
8760 SHOW_STR
8761 BGP_STR
8762 "Display routes matching the community-list\n"
8763 "community-list number\n"
8764 "community-list name\n"
8765 "Exact match of the communities\n")
8767 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8770 ALIAS (show_bgp_community_list_exact,
8771 show_bgp_ipv6_community_list_exact_cmd,
8772 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
8773 SHOW_STR
8774 BGP_STR
8775 "Address family\n"
8776 "Display routes matching the community-list\n"
8777 "community-list number\n"
8778 "community-list name\n"
8779 "Exact match of the communities\n")
8781 /* old command */
8782 DEFUN (show_ipv6_bgp_community_list_exact,
8783 show_ipv6_bgp_community_list_exact_cmd,
8784 "show ipv6 bgp community-list WORD exact-match",
8785 SHOW_STR
8786 IPV6_STR
8787 BGP_STR
8788 "Display routes matching the community-list\n"
8789 "community-list name\n"
8790 "Exact match of the communities\n")
8792 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8795 /* old command */
8796 DEFUN (show_ipv6_mbgp_community_list_exact,
8797 show_ipv6_mbgp_community_list_exact_cmd,
8798 "show ipv6 mbgp community-list WORD exact-match",
8799 SHOW_STR
8800 IPV6_STR
8801 MBGP_STR
8802 "Display routes matching the community-list\n"
8803 "community-list name\n"
8804 "Exact match of the communities\n")
8806 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8808 #endif /* HAVE_IPV6 */
8810 static int
8811 bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
8812 safi_t safi, enum bgp_show_type type)
8814 int ret;
8815 struct prefix *p;
8817 p = prefix_new();
8819 ret = str2prefix (prefix, p);
8820 if (! ret)
8822 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
8823 return CMD_WARNING;
8826 ret = bgp_show (vty, NULL, afi, safi, type, p);
8827 prefix_free(p);
8828 return ret;
8831 DEFUN (show_ip_bgp_prefix_longer,
8832 show_ip_bgp_prefix_longer_cmd,
8833 "show ip bgp A.B.C.D/M longer-prefixes",
8834 SHOW_STR
8835 IP_STR
8836 BGP_STR
8837 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8838 "Display route and more specific routes\n")
8840 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8841 bgp_show_type_prefix_longer);
8844 DEFUN (show_ip_bgp_flap_prefix_longer,
8845 show_ip_bgp_flap_prefix_longer_cmd,
8846 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
8847 SHOW_STR
8848 IP_STR
8849 BGP_STR
8850 "Display flap statistics of routes\n"
8851 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8852 "Display route and more specific routes\n")
8854 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8855 bgp_show_type_flap_prefix_longer);
8858 DEFUN (show_ip_bgp_ipv4_prefix_longer,
8859 show_ip_bgp_ipv4_prefix_longer_cmd,
8860 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
8861 SHOW_STR
8862 IP_STR
8863 BGP_STR
8864 "Address family\n"
8865 "Address Family modifier\n"
8866 "Address Family modifier\n"
8867 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8868 "Display route and more specific routes\n")
8870 if (strncmp (argv[0], "m", 1) == 0)
8871 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8872 bgp_show_type_prefix_longer);
8874 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
8875 bgp_show_type_prefix_longer);
8878 DEFUN (show_ip_bgp_flap_address,
8879 show_ip_bgp_flap_address_cmd,
8880 "show ip bgp flap-statistics A.B.C.D",
8881 SHOW_STR
8882 IP_STR
8883 BGP_STR
8884 "Display flap statistics of routes\n"
8885 "Network in the BGP routing table to display\n")
8887 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8888 bgp_show_type_flap_address);
8891 DEFUN (show_ip_bgp_flap_prefix,
8892 show_ip_bgp_flap_prefix_cmd,
8893 "show ip bgp flap-statistics A.B.C.D/M",
8894 SHOW_STR
8895 IP_STR
8896 BGP_STR
8897 "Display flap statistics of routes\n"
8898 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
8900 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8901 bgp_show_type_flap_prefix);
8903 #ifdef HAVE_IPV6
8904 DEFUN (show_bgp_prefix_longer,
8905 show_bgp_prefix_longer_cmd,
8906 "show bgp X:X::X:X/M longer-prefixes",
8907 SHOW_STR
8908 BGP_STR
8909 "IPv6 prefix <network>/<length>\n"
8910 "Display route and more specific routes\n")
8912 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8913 bgp_show_type_prefix_longer);
8916 ALIAS (show_bgp_prefix_longer,
8917 show_bgp_ipv6_prefix_longer_cmd,
8918 "show bgp ipv6 X:X::X:X/M longer-prefixes",
8919 SHOW_STR
8920 BGP_STR
8921 "Address family\n"
8922 "IPv6 prefix <network>/<length>\n"
8923 "Display route and more specific routes\n")
8925 /* old command */
8926 DEFUN (show_ipv6_bgp_prefix_longer,
8927 show_ipv6_bgp_prefix_longer_cmd,
8928 "show ipv6 bgp X:X::X:X/M longer-prefixes",
8929 SHOW_STR
8930 IPV6_STR
8931 BGP_STR
8932 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8933 "Display route and more specific routes\n")
8935 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8936 bgp_show_type_prefix_longer);
8939 /* old command */
8940 DEFUN (show_ipv6_mbgp_prefix_longer,
8941 show_ipv6_mbgp_prefix_longer_cmd,
8942 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
8943 SHOW_STR
8944 IPV6_STR
8945 MBGP_STR
8946 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8947 "Display route and more specific routes\n")
8949 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
8950 bgp_show_type_prefix_longer);
8952 #endif /* HAVE_IPV6 */
8954 static struct peer *
8955 peer_lookup_in_view (struct vty *vty, const char *view_name,
8956 const char *ip_str)
8958 int ret;
8959 struct bgp *bgp;
8960 struct peer *peer;
8961 union sockunion su;
8963 /* BGP structure lookup. */
8964 if (view_name)
8966 bgp = bgp_lookup_by_name (view_name);
8967 if (! bgp)
8969 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
8970 return NULL;
8973 else
8975 bgp = bgp_get_default ();
8976 if (! bgp)
8978 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
8979 return NULL;
8983 /* Get peer sockunion. */
8984 ret = str2sockunion (ip_str, &su);
8985 if (ret < 0)
8987 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
8988 return NULL;
8991 /* Peer structure lookup. */
8992 peer = peer_lookup (bgp, &su);
8993 if (! peer)
8995 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
8996 return NULL;
8999 return peer;
9002 enum bgp_stats
9004 BGP_STATS_MAXBITLEN = 0,
9005 BGP_STATS_RIB,
9006 BGP_STATS_PREFIXES,
9007 BGP_STATS_TOTPLEN,
9008 BGP_STATS_UNAGGREGATEABLE,
9009 BGP_STATS_MAX_AGGREGATEABLE,
9010 BGP_STATS_AGGREGATES,
9011 BGP_STATS_SPACE,
9012 BGP_STATS_ASPATH_COUNT,
9013 BGP_STATS_ASPATH_MAXHOPS,
9014 BGP_STATS_ASPATH_TOTHOPS,
9015 BGP_STATS_ASPATH_MAXSIZE,
9016 BGP_STATS_ASPATH_TOTSIZE,
9017 BGP_STATS_ASN_HIGHEST,
9018 BGP_STATS_MAX,
9021 static const char *table_stats_strs[] =
9023 [BGP_STATS_PREFIXES] = "Total Prefixes",
9024 [BGP_STATS_TOTPLEN] = "Average prefix length",
9025 [BGP_STATS_RIB] = "Total Advertisements",
9026 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
9027 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
9028 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
9029 [BGP_STATS_SPACE] = "Address space advertised",
9030 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
9031 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
9032 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
9033 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
9034 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
9035 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
9036 [BGP_STATS_MAX] = NULL,
9039 struct bgp_table_stats
9041 struct bgp_table *table;
9042 unsigned long long counts[BGP_STATS_MAX];
9045 #if 0
9046 #define TALLY_SIGFIG 100000
9047 static unsigned long
9048 ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9050 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9051 unsigned long res = (newtot * TALLY_SIGFIG) / count;
9052 unsigned long ret = newtot / count;
9054 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9055 return ret + 1;
9056 else
9057 return ret;
9059 #endif
9061 static int
9062 bgp_table_stats_walker (struct thread *t)
9064 struct bgp_node *rn;
9065 struct bgp_node *top;
9066 struct bgp_table_stats *ts = THREAD_ARG (t);
9067 unsigned int space = 0;
9069 if (!(top = bgp_table_top (ts->table)))
9070 return 0;
9072 switch (top->p.family)
9074 case AF_INET:
9075 space = IPV4_MAX_BITLEN;
9076 break;
9077 case AF_INET6:
9078 space = IPV6_MAX_BITLEN;
9079 break;
9082 ts->counts[BGP_STATS_MAXBITLEN] = space;
9084 for (rn = top; rn; rn = bgp_route_next (rn))
9086 struct bgp_info *ri;
9087 struct bgp_node *prn = rn->parent;
9088 unsigned int rinum = 0;
9090 if (rn == top)
9091 continue;
9093 if (!rn->info)
9094 continue;
9096 ts->counts[BGP_STATS_PREFIXES]++;
9097 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9099 #if 0
9100 ts->counts[BGP_STATS_AVGPLEN]
9101 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9102 ts->counts[BGP_STATS_AVGPLEN],
9103 rn->p.prefixlen);
9104 #endif
9106 /* check if the prefix is included by any other announcements */
9107 while (prn && !prn->info)
9108 prn = prn->parent;
9110 if (prn == NULL || prn == top)
9112 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9113 /* announced address space */
9114 if (space)
9115 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9117 else if (prn->info)
9118 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9120 for (ri = rn->info; ri; ri = ri->next)
9122 rinum++;
9123 ts->counts[BGP_STATS_RIB]++;
9125 if (ri->attr &&
9126 (CHECK_FLAG (ri->attr->flag,
9127 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9128 ts->counts[BGP_STATS_AGGREGATES]++;
9130 /* as-path stats */
9131 if (ri->attr && ri->attr->aspath)
9133 unsigned int hops = aspath_count_hops (ri->attr->aspath);
9134 unsigned int size = aspath_size (ri->attr->aspath);
9135 as_t highest = aspath_highest (ri->attr->aspath);
9137 ts->counts[BGP_STATS_ASPATH_COUNT]++;
9139 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9140 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9142 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9143 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9145 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9146 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9147 #if 0
9148 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9149 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9150 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9151 hops);
9152 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9153 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9154 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9155 size);
9156 #endif
9157 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9158 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9162 return 0;
9165 static int
9166 bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9168 struct bgp_table_stats ts;
9169 unsigned int i;
9171 if (!bgp->rib[afi][safi])
9173 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9174 return CMD_WARNING;
9177 memset (&ts, 0, sizeof (ts));
9178 ts.table = bgp->rib[afi][safi];
9179 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9181 vty_out (vty, "BGP %s RIB statistics%s%s",
9182 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9184 for (i = 0; i < BGP_STATS_MAX; i++)
9186 if (!table_stats_strs[i])
9187 continue;
9189 switch (i)
9191 #if 0
9192 case BGP_STATS_ASPATH_AVGHOPS:
9193 case BGP_STATS_ASPATH_AVGSIZE:
9194 case BGP_STATS_AVGPLEN:
9195 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9196 vty_out (vty, "%12.2f",
9197 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9198 break;
9199 #endif
9200 case BGP_STATS_ASPATH_TOTHOPS:
9201 case BGP_STATS_ASPATH_TOTSIZE:
9202 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9203 vty_out (vty, "%12.2f",
9204 ts.counts[i] ?
9205 (float)ts.counts[i] /
9206 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9207 : 0);
9208 break;
9209 case BGP_STATS_TOTPLEN:
9210 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9211 vty_out (vty, "%12.2f",
9212 ts.counts[i] ?
9213 (float)ts.counts[i] /
9214 (float)ts.counts[BGP_STATS_PREFIXES]
9215 : 0);
9216 break;
9217 case BGP_STATS_SPACE:
9218 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9219 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9220 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9221 break;
9222 vty_out (vty, "%30s: ", "%% announced ");
9223 vty_out (vty, "%12.2f%s",
9224 100 * (float)ts.counts[BGP_STATS_SPACE] /
9225 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
9226 VTY_NEWLINE);
9227 vty_out (vty, "%30s: ", "/8 equivalent ");
9228 vty_out (vty, "%12.2f%s",
9229 (float)ts.counts[BGP_STATS_SPACE] /
9230 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9231 VTY_NEWLINE);
9232 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9233 break;
9234 vty_out (vty, "%30s: ", "/24 equivalent ");
9235 vty_out (vty, "%12.2f",
9236 (float)ts.counts[BGP_STATS_SPACE] /
9237 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9238 break;
9239 default:
9240 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9241 vty_out (vty, "%12llu", ts.counts[i]);
9244 vty_out (vty, "%s", VTY_NEWLINE);
9246 return CMD_SUCCESS;
9249 static int
9250 bgp_table_stats_vty (struct vty *vty, const char *name,
9251 const char *afi_str, const char *safi_str)
9253 struct bgp *bgp;
9254 afi_t afi;
9255 safi_t safi;
9257 if (name)
9258 bgp = bgp_lookup_by_name (name);
9259 else
9260 bgp = bgp_get_default ();
9262 if (!bgp)
9264 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9265 return CMD_WARNING;
9267 if (strncmp (afi_str, "ipv", 3) == 0)
9269 if (strncmp (afi_str, "ipv4", 4) == 0)
9270 afi = AFI_IP;
9271 else if (strncmp (afi_str, "ipv6", 4) == 0)
9272 afi = AFI_IP6;
9273 else
9275 vty_out (vty, "%% Invalid address family %s%s",
9276 afi_str, VTY_NEWLINE);
9277 return CMD_WARNING;
9279 if (strncmp (safi_str, "m", 1) == 0)
9280 safi = SAFI_MULTICAST;
9281 else if (strncmp (safi_str, "u", 1) == 0)
9282 safi = SAFI_UNICAST;
9283 else if (strncmp (safi_str, "vpnv4", 5) == 0)
9284 safi = BGP_SAFI_VPNV4;
9285 else if (strncmp (safi_str, "vpnv6", 6) == 0)
9286 safi = BGP_SAFI_VPNV6;
9287 else
9289 vty_out (vty, "%% Invalid subsequent address family %s%s",
9290 safi_str, VTY_NEWLINE);
9291 return CMD_WARNING;
9294 else
9296 vty_out (vty, "%% Invalid address family %s%s",
9297 afi_str, VTY_NEWLINE);
9298 return CMD_WARNING;
9301 if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
9302 || (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
9304 vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
9305 afi_str, safi_str, VTY_NEWLINE);
9306 return CMD_WARNING;
9308 return bgp_table_stats (vty, bgp, afi, safi);
9311 DEFUN (show_bgp_statistics,
9312 show_bgp_statistics_cmd,
9313 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9314 SHOW_STR
9315 BGP_STR
9316 "Address family\n"
9317 "Address family\n"
9318 "Address Family modifier\n"
9319 "Address Family modifier\n"
9320 "BGP RIB advertisement statistics\n")
9322 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9325 ALIAS (show_bgp_statistics,
9326 show_bgp_statistics_vpnv4_cmd,
9327 "show bgp (ipv4) (vpnv4) statistics",
9328 SHOW_STR
9329 BGP_STR
9330 "Address family\n"
9331 "Address Family modifier\n"
9332 "BGP RIB advertisement statistics\n")
9334 DEFUN (show_bgp_statistics_view,
9335 show_bgp_statistics_view_cmd,
9336 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9337 SHOW_STR
9338 BGP_STR
9339 "BGP view\n"
9340 "Address family\n"
9341 "Address family\n"
9342 "Address Family modifier\n"
9343 "Address Family modifier\n"
9344 "BGP RIB advertisement statistics\n")
9346 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9349 ALIAS (show_bgp_statistics_view,
9350 show_bgp_statistics_view_vpnv4_cmd,
9351 "show bgp view WORD (ipv4) (vpnv4) statistics",
9352 SHOW_STR
9353 BGP_STR
9354 "BGP view\n"
9355 "Address family\n"
9356 "Address Family modifier\n"
9357 "BGP RIB advertisement statistics\n")
9359 enum bgp_pcounts
9361 PCOUNT_ADJ_IN = 0,
9362 PCOUNT_DAMPED,
9363 PCOUNT_REMOVED,
9364 PCOUNT_HISTORY,
9365 PCOUNT_STALE,
9366 PCOUNT_VALID,
9367 PCOUNT_ALL,
9368 PCOUNT_COUNTED,
9369 PCOUNT_PFCNT, /* the figure we display to users */
9370 PCOUNT_MAX,
9373 static const char *pcount_strs[] =
9375 [PCOUNT_ADJ_IN] = "Adj-in",
9376 [PCOUNT_DAMPED] = "Damped",
9377 [PCOUNT_REMOVED] = "Removed",
9378 [PCOUNT_HISTORY] = "History",
9379 [PCOUNT_STALE] = "Stale",
9380 [PCOUNT_VALID] = "Valid",
9381 [PCOUNT_ALL] = "All RIB",
9382 [PCOUNT_COUNTED] = "PfxCt counted",
9383 [PCOUNT_PFCNT] = "Useable",
9384 [PCOUNT_MAX] = NULL,
9387 struct peer_pcounts
9389 unsigned int count[PCOUNT_MAX];
9390 const struct peer *peer;
9391 const struct bgp_table *table;
9394 static int
9395 bgp_peer_count_walker (struct thread *t)
9397 struct bgp_node *rn;
9398 struct peer_pcounts *pc = THREAD_ARG (t);
9399 const struct peer *peer = pc->peer;
9401 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
9403 struct bgp_adj_in *ain;
9404 struct bgp_info *ri;
9406 for (ain = rn->adj_in; ain; ain = ain->next)
9407 if (ain->peer == peer)
9408 pc->count[PCOUNT_ADJ_IN]++;
9410 for (ri = rn->info; ri; ri = ri->next)
9412 char buf[SU_ADDRSTRLEN];
9414 if (ri->peer != peer)
9415 continue;
9417 pc->count[PCOUNT_ALL]++;
9419 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
9420 pc->count[PCOUNT_DAMPED]++;
9421 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
9422 pc->count[PCOUNT_HISTORY]++;
9423 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
9424 pc->count[PCOUNT_REMOVED]++;
9425 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
9426 pc->count[PCOUNT_STALE]++;
9427 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
9428 pc->count[PCOUNT_VALID]++;
9429 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9430 pc->count[PCOUNT_PFCNT]++;
9432 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9434 pc->count[PCOUNT_COUNTED]++;
9435 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9436 plog_warn (peer->log,
9437 "%s [pcount] %s/%d is counted but flags 0x%x",
9438 peer->host,
9439 inet_ntop(rn->p.family, &rn->p.u.prefix,
9440 buf, SU_ADDRSTRLEN),
9441 rn->p.prefixlen,
9442 ri->flags);
9444 else
9446 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9447 plog_warn (peer->log,
9448 "%s [pcount] %s/%d not counted but flags 0x%x",
9449 peer->host,
9450 inet_ntop(rn->p.family, &rn->p.u.prefix,
9451 buf, SU_ADDRSTRLEN),
9452 rn->p.prefixlen,
9453 ri->flags);
9457 return 0;
9460 static int
9461 bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9463 struct peer_pcounts pcounts = { .peer = peer };
9464 unsigned int i;
9466 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9467 || !peer->bgp->rib[afi][safi])
9469 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9470 return CMD_WARNING;
9473 memset (&pcounts, 0, sizeof(pcounts));
9474 pcounts.peer = peer;
9475 pcounts.table = peer->bgp->rib[afi][safi];
9477 /* in-place call via thread subsystem so as to record execution time
9478 * stats for the thread-walk (i.e. ensure this can't be blamed on
9479 * on just vty_read()).
9481 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9483 vty_out (vty, "Prefix counts for %s, %s%s",
9484 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9485 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9486 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9487 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9489 for (i = 0; i < PCOUNT_MAX; i++)
9490 vty_out (vty, "%20s: %-10d%s",
9491 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
9493 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
9495 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9496 peer->host, VTY_NEWLINE);
9497 vty_out (vty, "Please report this bug, with the above command output%s",
9498 VTY_NEWLINE);
9501 return CMD_SUCCESS;
9504 DEFUN (show_ip_bgp_neighbor_prefix_counts,
9505 show_ip_bgp_neighbor_prefix_counts_cmd,
9506 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9507 SHOW_STR
9508 IP_STR
9509 BGP_STR
9510 "Detailed information on TCP and BGP neighbor connections\n"
9511 "Neighbor to display information about\n"
9512 "Neighbor to display information about\n"
9513 "Display detailed prefix count information\n")
9515 struct peer *peer;
9517 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9518 if (! peer)
9519 return CMD_WARNING;
9521 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9524 DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9525 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9526 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9527 SHOW_STR
9528 BGP_STR
9529 "Address family\n"
9530 "Detailed information on TCP and BGP neighbor connections\n"
9531 "Neighbor to display information about\n"
9532 "Neighbor to display information about\n"
9533 "Display detailed prefix count information\n")
9535 struct peer *peer;
9537 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9538 if (! peer)
9539 return CMD_WARNING;
9541 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9544 DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9545 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9546 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9547 SHOW_STR
9548 IP_STR
9549 BGP_STR
9550 "Address family\n"
9551 "Address Family modifier\n"
9552 "Address Family modifier\n"
9553 "Detailed information on TCP and BGP neighbor connections\n"
9554 "Neighbor to display information about\n"
9555 "Neighbor to display information about\n"
9556 "Display detailed prefix count information\n")
9558 struct peer *peer;
9560 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9561 if (! peer)
9562 return CMD_WARNING;
9564 if (strncmp (argv[0], "m", 1) == 0)
9565 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9567 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9570 DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9571 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9572 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9573 SHOW_STR
9574 IP_STR
9575 BGP_STR
9576 "Address family\n"
9577 "Address Family modifier\n"
9578 "Address Family modifier\n"
9579 "Detailed information on TCP and BGP neighbor connections\n"
9580 "Neighbor to display information about\n"
9581 "Neighbor to display information about\n"
9582 "Display detailed prefix count information\n")
9584 struct peer *peer;
9586 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9587 if (! peer)
9588 return CMD_WARNING;
9590 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9594 static void
9595 show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9596 int in)
9598 struct bgp_table *table;
9599 struct bgp_adj_in *ain;
9600 struct bgp_adj_out *adj;
9601 unsigned long output_count;
9602 struct bgp_node *rn;
9603 int header1 = 1;
9604 struct bgp *bgp;
9605 int header2 = 1;
9607 bgp = peer->bgp;
9609 if (! bgp)
9610 return;
9612 table = bgp->rib[afi][safi];
9614 output_count = 0;
9616 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9617 PEER_STATUS_DEFAULT_ORIGINATE))
9619 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9620 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9621 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9623 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9624 VTY_NEWLINE, VTY_NEWLINE);
9625 header1 = 0;
9628 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9629 if (in)
9631 for (ain = rn->adj_in; ain; ain = ain->next)
9632 if (ain->peer == peer)
9634 if (header1)
9636 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9637 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9638 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9639 header1 = 0;
9641 if (header2)
9643 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9644 header2 = 0;
9646 if (ain->attr)
9648 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9649 output_count++;
9653 else
9655 for (adj = rn->adj_out; adj; adj = adj->next)
9656 if (adj->peer == peer)
9658 if (header1)
9660 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9661 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9662 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9663 header1 = 0;
9665 if (header2)
9667 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9668 header2 = 0;
9670 if (adj->attr)
9672 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9673 output_count++;
9678 if (output_count != 0)
9679 vty_out (vty, "%sTotal number of prefixes %ld%s",
9680 VTY_NEWLINE, output_count, VTY_NEWLINE);
9683 static int
9684 peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9686 if (! peer || ! peer->afc[afi][safi])
9688 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9689 return CMD_WARNING;
9692 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9694 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9695 VTY_NEWLINE);
9696 return CMD_WARNING;
9699 show_adj_route (vty, peer, afi, safi, in);
9701 return CMD_SUCCESS;
9704 DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9705 show_ip_bgp_view_neighbor_advertised_route_cmd,
9706 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9707 SHOW_STR
9708 IP_STR
9709 BGP_STR
9710 "BGP view\n"
9711 "View name\n"
9712 "Detailed information on TCP and BGP neighbor connections\n"
9713 "Neighbor to display information about\n"
9714 "Neighbor to display information about\n"
9715 "Display the routes advertised to a BGP neighbor\n")
9717 struct peer *peer;
9719 if (argc == 2)
9720 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9721 else
9722 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9724 if (! peer)
9725 return CMD_WARNING;
9727 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9730 ALIAS (show_ip_bgp_view_neighbor_advertised_route,
9731 show_ip_bgp_neighbor_advertised_route_cmd,
9732 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9733 SHOW_STR
9734 IP_STR
9735 BGP_STR
9736 "Detailed information on TCP and BGP neighbor connections\n"
9737 "Neighbor to display information about\n"
9738 "Neighbor to display information about\n"
9739 "Display the routes advertised to a BGP neighbor\n")
9741 DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9742 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9743 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9744 SHOW_STR
9745 IP_STR
9746 BGP_STR
9747 "Address family\n"
9748 "Address Family modifier\n"
9749 "Address Family modifier\n"
9750 "Detailed information on TCP and BGP neighbor connections\n"
9751 "Neighbor to display information about\n"
9752 "Neighbor to display information about\n"
9753 "Display the routes advertised to a BGP neighbor\n")
9755 struct peer *peer;
9757 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9758 if (! peer)
9759 return CMD_WARNING;
9761 if (strncmp (argv[0], "m", 1) == 0)
9762 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9764 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9767 #ifdef HAVE_IPV6
9768 DEFUN (show_bgp_view_neighbor_advertised_route,
9769 show_bgp_view_neighbor_advertised_route_cmd,
9770 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9771 SHOW_STR
9772 BGP_STR
9773 "BGP view\n"
9774 "View name\n"
9775 "Detailed information on TCP and BGP neighbor connections\n"
9776 "Neighbor to display information about\n"
9777 "Neighbor to display information about\n"
9778 "Display the routes advertised to a BGP neighbor\n")
9780 struct peer *peer;
9782 if (argc == 2)
9783 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9784 else
9785 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9787 if (! peer)
9788 return CMD_WARNING;
9790 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9793 ALIAS (show_bgp_view_neighbor_advertised_route,
9794 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9795 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9796 SHOW_STR
9797 BGP_STR
9798 "BGP view\n"
9799 "View name\n"
9800 "Address family\n"
9801 "Detailed information on TCP and BGP neighbor connections\n"
9802 "Neighbor to display information about\n"
9803 "Neighbor to display information about\n"
9804 "Display the routes advertised to a BGP neighbor\n")
9806 DEFUN (show_bgp_view_neighbor_received_routes,
9807 show_bgp_view_neighbor_received_routes_cmd,
9808 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9809 SHOW_STR
9810 BGP_STR
9811 "BGP view\n"
9812 "View name\n"
9813 "Detailed information on TCP and BGP neighbor connections\n"
9814 "Neighbor to display information about\n"
9815 "Neighbor to display information about\n"
9816 "Display the received routes from neighbor\n")
9818 struct peer *peer;
9820 if (argc == 2)
9821 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9822 else
9823 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9825 if (! peer)
9826 return CMD_WARNING;
9828 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
9831 ALIAS (show_bgp_view_neighbor_received_routes,
9832 show_bgp_view_ipv6_neighbor_received_routes_cmd,
9833 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9834 SHOW_STR
9835 BGP_STR
9836 "BGP view\n"
9837 "View name\n"
9838 "Address family\n"
9839 "Detailed information on TCP and BGP neighbor connections\n"
9840 "Neighbor to display information about\n"
9841 "Neighbor to display information about\n"
9842 "Display the received routes from neighbor\n")
9844 ALIAS (show_bgp_view_neighbor_advertised_route,
9845 show_bgp_neighbor_advertised_route_cmd,
9846 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9847 SHOW_STR
9848 BGP_STR
9849 "Detailed information on TCP and BGP neighbor connections\n"
9850 "Neighbor to display information about\n"
9851 "Neighbor to display information about\n"
9852 "Display the routes advertised to a BGP neighbor\n")
9854 ALIAS (show_bgp_view_neighbor_advertised_route,
9855 show_bgp_ipv6_neighbor_advertised_route_cmd,
9856 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9857 SHOW_STR
9858 BGP_STR
9859 "Address family\n"
9860 "Detailed information on TCP and BGP neighbor connections\n"
9861 "Neighbor to display information about\n"
9862 "Neighbor to display information about\n"
9863 "Display the routes advertised to a BGP neighbor\n")
9865 /* old command */
9866 ALIAS (show_bgp_view_neighbor_advertised_route,
9867 ipv6_bgp_neighbor_advertised_route_cmd,
9868 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9869 SHOW_STR
9870 IPV6_STR
9871 BGP_STR
9872 "Detailed information on TCP and BGP neighbor connections\n"
9873 "Neighbor to display information about\n"
9874 "Neighbor to display information about\n"
9875 "Display the routes advertised to a BGP neighbor\n")
9877 /* old command */
9878 DEFUN (ipv6_mbgp_neighbor_advertised_route,
9879 ipv6_mbgp_neighbor_advertised_route_cmd,
9880 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9881 SHOW_STR
9882 IPV6_STR
9883 MBGP_STR
9884 "Detailed information on TCP and BGP neighbor connections\n"
9885 "Neighbor to display information about\n"
9886 "Neighbor to display information about\n"
9887 "Display the routes advertised to a BGP neighbor\n")
9889 struct peer *peer;
9891 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9892 if (! peer)
9893 return CMD_WARNING;
9895 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
9897 #endif /* HAVE_IPV6 */
9899 DEFUN (show_ip_bgp_view_neighbor_received_routes,
9900 show_ip_bgp_view_neighbor_received_routes_cmd,
9901 "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9902 SHOW_STR
9903 IP_STR
9904 BGP_STR
9905 "BGP view\n"
9906 "View name\n"
9907 "Detailed information on TCP and BGP neighbor connections\n"
9908 "Neighbor to display information about\n"
9909 "Neighbor to display information about\n"
9910 "Display the received routes from neighbor\n")
9912 struct peer *peer;
9914 if (argc == 2)
9915 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9916 else
9917 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9919 if (! peer)
9920 return CMD_WARNING;
9922 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
9925 ALIAS (show_ip_bgp_view_neighbor_received_routes,
9926 show_ip_bgp_neighbor_received_routes_cmd,
9927 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9928 SHOW_STR
9929 IP_STR
9930 BGP_STR
9931 "Detailed information on TCP and BGP neighbor connections\n"
9932 "Neighbor to display information about\n"
9933 "Neighbor to display information about\n"
9934 "Display the received routes from neighbor\n")
9936 DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
9937 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
9938 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
9939 SHOW_STR
9940 IP_STR
9941 BGP_STR
9942 "Address family\n"
9943 "Address Family modifier\n"
9944 "Address Family modifier\n"
9945 "Detailed information on TCP and BGP neighbor connections\n"
9946 "Neighbor to display information about\n"
9947 "Neighbor to display information about\n"
9948 "Display the received routes from neighbor\n")
9950 struct peer *peer;
9952 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9953 if (! peer)
9954 return CMD_WARNING;
9956 if (strncmp (argv[0], "m", 1) == 0)
9957 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
9959 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
9962 DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
9963 show_ip_bgp_neighbor_received_prefix_filter_cmd,
9964 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9965 SHOW_STR
9966 IP_STR
9967 BGP_STR
9968 "Detailed information on TCP and BGP neighbor connections\n"
9969 "Neighbor to display information about\n"
9970 "Neighbor to display information about\n"
9971 "Display information received from a BGP neighbor\n"
9972 "Display the prefixlist filter\n")
9974 char name[BUFSIZ];
9975 union sockunion *su;
9976 struct peer *peer;
9977 int count;
9979 su = sockunion_str2su (argv[0]);
9980 if (su == NULL)
9981 return CMD_WARNING;
9983 peer = peer_lookup (NULL, su);
9984 if (! peer)
9985 return CMD_WARNING;
9987 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
9988 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9989 if (count)
9991 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
9992 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9995 return CMD_SUCCESS;
9998 DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
9999 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
10000 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10001 SHOW_STR
10002 IP_STR
10003 BGP_STR
10004 "Address family\n"
10005 "Address Family modifier\n"
10006 "Address Family modifier\n"
10007 "Detailed information on TCP and BGP neighbor connections\n"
10008 "Neighbor to display information about\n"
10009 "Neighbor to display information about\n"
10010 "Display information received from a BGP neighbor\n"
10011 "Display the prefixlist filter\n")
10013 char name[BUFSIZ];
10014 union sockunion *su;
10015 struct peer *peer;
10016 int count;
10018 su = sockunion_str2su (argv[1]);
10019 if (su == NULL)
10020 return CMD_WARNING;
10022 peer = peer_lookup (NULL, su);
10023 if (! peer)
10024 return CMD_WARNING;
10026 if (strncmp (argv[0], "m", 1) == 0)
10028 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
10029 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10030 if (count)
10032 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
10033 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10036 else
10038 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10039 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10040 if (count)
10042 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10043 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10047 return CMD_SUCCESS;
10051 #ifdef HAVE_IPV6
10052 ALIAS (show_bgp_view_neighbor_received_routes,
10053 show_bgp_neighbor_received_routes_cmd,
10054 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10055 SHOW_STR
10056 BGP_STR
10057 "Detailed information on TCP and BGP neighbor connections\n"
10058 "Neighbor to display information about\n"
10059 "Neighbor to display information about\n"
10060 "Display the received routes from neighbor\n")
10062 ALIAS (show_bgp_view_neighbor_received_routes,
10063 show_bgp_ipv6_neighbor_received_routes_cmd,
10064 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10065 SHOW_STR
10066 BGP_STR
10067 "Address family\n"
10068 "Detailed information on TCP and BGP neighbor connections\n"
10069 "Neighbor to display information about\n"
10070 "Neighbor to display information about\n"
10071 "Display the received routes from neighbor\n")
10073 DEFUN (show_bgp_neighbor_received_prefix_filter,
10074 show_bgp_neighbor_received_prefix_filter_cmd,
10075 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10076 SHOW_STR
10077 BGP_STR
10078 "Detailed information on TCP and BGP neighbor connections\n"
10079 "Neighbor to display information about\n"
10080 "Neighbor to display information about\n"
10081 "Display information received from a BGP neighbor\n"
10082 "Display the prefixlist filter\n")
10084 char name[BUFSIZ];
10085 union sockunion *su;
10086 struct peer *peer;
10087 int count;
10089 su = sockunion_str2su (argv[0]);
10090 if (su == NULL)
10091 return CMD_WARNING;
10093 peer = peer_lookup (NULL, su);
10094 if (! peer)
10095 return CMD_WARNING;
10097 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10098 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10099 if (count)
10101 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10102 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10105 return CMD_SUCCESS;
10108 ALIAS (show_bgp_neighbor_received_prefix_filter,
10109 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10110 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10111 SHOW_STR
10112 BGP_STR
10113 "Address family\n"
10114 "Detailed information on TCP and BGP neighbor connections\n"
10115 "Neighbor to display information about\n"
10116 "Neighbor to display information about\n"
10117 "Display information received from a BGP neighbor\n"
10118 "Display the prefixlist filter\n")
10120 /* old command */
10121 ALIAS (show_bgp_view_neighbor_received_routes,
10122 ipv6_bgp_neighbor_received_routes_cmd,
10123 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10124 SHOW_STR
10125 IPV6_STR
10126 BGP_STR
10127 "Detailed information on TCP and BGP neighbor connections\n"
10128 "Neighbor to display information about\n"
10129 "Neighbor to display information about\n"
10130 "Display the received routes from neighbor\n")
10132 /* old command */
10133 DEFUN (ipv6_mbgp_neighbor_received_routes,
10134 ipv6_mbgp_neighbor_received_routes_cmd,
10135 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10136 SHOW_STR
10137 IPV6_STR
10138 MBGP_STR
10139 "Detailed information on TCP and BGP neighbor connections\n"
10140 "Neighbor to display information about\n"
10141 "Neighbor to display information about\n"
10142 "Display the received routes from neighbor\n")
10144 struct peer *peer;
10146 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10147 if (! peer)
10148 return CMD_WARNING;
10150 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
10153 DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10154 show_bgp_view_neighbor_received_prefix_filter_cmd,
10155 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10156 SHOW_STR
10157 BGP_STR
10158 "BGP view\n"
10159 "View name\n"
10160 "Detailed information on TCP and BGP neighbor connections\n"
10161 "Neighbor to display information about\n"
10162 "Neighbor to display information about\n"
10163 "Display information received from a BGP neighbor\n"
10164 "Display the prefixlist filter\n")
10166 char name[BUFSIZ];
10167 union sockunion *su;
10168 struct peer *peer;
10169 struct bgp *bgp;
10170 int count;
10172 /* BGP structure lookup. */
10173 bgp = bgp_lookup_by_name (argv[0]);
10174 if (bgp == NULL)
10176 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10177 return CMD_WARNING;
10180 su = sockunion_str2su (argv[1]);
10181 if (su == NULL)
10182 return CMD_WARNING;
10184 peer = peer_lookup (bgp, su);
10185 if (! peer)
10186 return CMD_WARNING;
10188 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10189 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10190 if (count)
10192 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10193 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10196 return CMD_SUCCESS;
10199 ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10200 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10201 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10202 SHOW_STR
10203 BGP_STR
10204 "BGP view\n"
10205 "View name\n"
10206 "Address family\n"
10207 "Detailed information on TCP and BGP neighbor connections\n"
10208 "Neighbor to display information about\n"
10209 "Neighbor to display information about\n"
10210 "Display information received from a BGP neighbor\n"
10211 "Display the prefixlist filter\n")
10212 #endif /* HAVE_IPV6 */
10214 static int
10215 bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
10216 safi_t safi, enum bgp_show_type type)
10218 if (! peer || ! peer->afc[afi][safi])
10220 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
10221 return CMD_WARNING;
10224 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
10227 DEFUN (show_ip_bgp_neighbor_routes,
10228 show_ip_bgp_neighbor_routes_cmd,
10229 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10230 SHOW_STR
10231 IP_STR
10232 BGP_STR
10233 "Detailed information on TCP and BGP neighbor connections\n"
10234 "Neighbor to display information about\n"
10235 "Neighbor to display information about\n"
10236 "Display routes learned from neighbor\n")
10238 struct peer *peer;
10240 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10241 if (! peer)
10242 return CMD_WARNING;
10244 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10245 bgp_show_type_neighbor);
10248 DEFUN (show_ip_bgp_neighbor_flap,
10249 show_ip_bgp_neighbor_flap_cmd,
10250 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10251 SHOW_STR
10252 IP_STR
10253 BGP_STR
10254 "Detailed information on TCP and BGP neighbor connections\n"
10255 "Neighbor to display information about\n"
10256 "Neighbor to display information about\n"
10257 "Display flap statistics of the routes learned from neighbor\n")
10259 struct peer *peer;
10261 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10262 if (! peer)
10263 return CMD_WARNING;
10265 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10266 bgp_show_type_flap_neighbor);
10269 DEFUN (show_ip_bgp_neighbor_damp,
10270 show_ip_bgp_neighbor_damp_cmd,
10271 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10272 SHOW_STR
10273 IP_STR
10274 BGP_STR
10275 "Detailed information on TCP and BGP neighbor connections\n"
10276 "Neighbor to display information about\n"
10277 "Neighbor to display information about\n"
10278 "Display the dampened routes received from neighbor\n")
10280 struct peer *peer;
10282 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10283 if (! peer)
10284 return CMD_WARNING;
10286 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10287 bgp_show_type_damp_neighbor);
10290 DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10291 show_ip_bgp_ipv4_neighbor_routes_cmd,
10292 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10293 SHOW_STR
10294 IP_STR
10295 BGP_STR
10296 "Address family\n"
10297 "Address Family modifier\n"
10298 "Address Family modifier\n"
10299 "Detailed information on TCP and BGP neighbor connections\n"
10300 "Neighbor to display information about\n"
10301 "Neighbor to display information about\n"
10302 "Display routes learned from neighbor\n")
10304 struct peer *peer;
10306 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10307 if (! peer)
10308 return CMD_WARNING;
10310 if (strncmp (argv[0], "m", 1) == 0)
10311 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
10312 bgp_show_type_neighbor);
10314 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10315 bgp_show_type_neighbor);
10318 DEFUN (show_ip_bgp_view_rsclient,
10319 show_ip_bgp_view_rsclient_cmd,
10320 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10321 SHOW_STR
10322 IP_STR
10323 BGP_STR
10324 "BGP view\n"
10325 "BGP view name\n"
10326 "Information about Route Server Client\n"
10327 NEIGHBOR_ADDR_STR)
10329 struct bgp_table *table;
10330 struct peer *peer;
10332 if (argc == 2)
10333 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10334 else
10335 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10337 if (! peer)
10338 return CMD_WARNING;
10340 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10342 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10343 VTY_NEWLINE);
10344 return CMD_WARNING;
10347 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10348 PEER_FLAG_RSERVER_CLIENT))
10350 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10351 VTY_NEWLINE);
10352 return CMD_WARNING;
10355 table = peer->rib[AFI_IP][SAFI_UNICAST];
10357 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10360 ALIAS (show_ip_bgp_view_rsclient,
10361 show_ip_bgp_rsclient_cmd,
10362 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10363 SHOW_STR
10364 IP_STR
10365 BGP_STR
10366 "Information about Route Server Client\n"
10367 NEIGHBOR_ADDR_STR)
10369 DEFUN (show_ip_bgp_view_rsclient_route,
10370 show_ip_bgp_view_rsclient_route_cmd,
10371 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10372 SHOW_STR
10373 IP_STR
10374 BGP_STR
10375 "BGP view\n"
10376 "BGP view name\n"
10377 "Information about Route Server Client\n"
10378 NEIGHBOR_ADDR_STR
10379 "Network in the BGP routing table to display\n")
10381 struct bgp *bgp;
10382 struct peer *peer;
10384 /* BGP structure lookup. */
10385 if (argc == 3)
10387 bgp = bgp_lookup_by_name (argv[0]);
10388 if (bgp == NULL)
10390 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10391 return CMD_WARNING;
10394 else
10396 bgp = bgp_get_default ();
10397 if (bgp == NULL)
10399 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10400 return CMD_WARNING;
10404 if (argc == 3)
10405 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10406 else
10407 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10409 if (! peer)
10410 return CMD_WARNING;
10412 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10414 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10415 VTY_NEWLINE);
10416 return CMD_WARNING;
10419 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10420 PEER_FLAG_RSERVER_CLIENT))
10422 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10423 VTY_NEWLINE);
10424 return CMD_WARNING;
10427 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10428 (argc == 3) ? argv[2] : argv[1],
10429 AFI_IP, SAFI_UNICAST, NULL, 0);
10432 ALIAS (show_ip_bgp_view_rsclient_route,
10433 show_ip_bgp_rsclient_route_cmd,
10434 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10435 SHOW_STR
10436 IP_STR
10437 BGP_STR
10438 "Information about Route Server Client\n"
10439 NEIGHBOR_ADDR_STR
10440 "Network in the BGP routing table to display\n")
10442 DEFUN (show_ip_bgp_view_rsclient_prefix,
10443 show_ip_bgp_view_rsclient_prefix_cmd,
10444 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10445 SHOW_STR
10446 IP_STR
10447 BGP_STR
10448 "BGP view\n"
10449 "BGP view name\n"
10450 "Information about Route Server Client\n"
10451 NEIGHBOR_ADDR_STR
10452 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10454 struct bgp *bgp;
10455 struct peer *peer;
10457 /* BGP structure lookup. */
10458 if (argc == 3)
10460 bgp = bgp_lookup_by_name (argv[0]);
10461 if (bgp == NULL)
10463 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10464 return CMD_WARNING;
10467 else
10469 bgp = bgp_get_default ();
10470 if (bgp == NULL)
10472 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10473 return CMD_WARNING;
10477 if (argc == 3)
10478 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10479 else
10480 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10482 if (! peer)
10483 return CMD_WARNING;
10485 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10487 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10488 VTY_NEWLINE);
10489 return CMD_WARNING;
10492 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10493 PEER_FLAG_RSERVER_CLIENT))
10495 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10496 VTY_NEWLINE);
10497 return CMD_WARNING;
10500 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10501 (argc == 3) ? argv[2] : argv[1],
10502 AFI_IP, SAFI_UNICAST, NULL, 1);
10505 ALIAS (show_ip_bgp_view_rsclient_prefix,
10506 show_ip_bgp_rsclient_prefix_cmd,
10507 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10508 SHOW_STR
10509 IP_STR
10510 BGP_STR
10511 "Information about Route Server Client\n"
10512 NEIGHBOR_ADDR_STR
10513 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10516 #ifdef HAVE_IPV6
10517 DEFUN (show_bgp_view_neighbor_routes,
10518 show_bgp_view_neighbor_routes_cmd,
10519 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10520 SHOW_STR
10521 BGP_STR
10522 "BGP view\n"
10523 "BGP view name\n"
10524 "Detailed information on TCP and BGP neighbor connections\n"
10525 "Neighbor to display information about\n"
10526 "Neighbor to display information about\n"
10527 "Display routes learned from neighbor\n")
10529 struct peer *peer;
10531 if (argc == 2)
10532 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10533 else
10534 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10536 if (! peer)
10537 return CMD_WARNING;
10539 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10540 bgp_show_type_neighbor);
10543 ALIAS (show_bgp_view_neighbor_routes,
10544 show_bgp_view_ipv6_neighbor_routes_cmd,
10545 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10546 SHOW_STR
10547 BGP_STR
10548 "BGP view\n"
10549 "BGP view name\n"
10550 "Address family\n"
10551 "Detailed information on TCP and BGP neighbor connections\n"
10552 "Neighbor to display information about\n"
10553 "Neighbor to display information about\n"
10554 "Display routes learned from neighbor\n")
10556 DEFUN (show_bgp_view_neighbor_damp,
10557 show_bgp_view_neighbor_damp_cmd,
10558 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10559 SHOW_STR
10560 BGP_STR
10561 "BGP view\n"
10562 "BGP view name\n"
10563 "Detailed information on TCP and BGP neighbor connections\n"
10564 "Neighbor to display information about\n"
10565 "Neighbor to display information about\n"
10566 "Display the dampened routes received from neighbor\n")
10568 struct peer *peer;
10570 if (argc == 2)
10571 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10572 else
10573 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10575 if (! peer)
10576 return CMD_WARNING;
10578 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10579 bgp_show_type_damp_neighbor);
10582 ALIAS (show_bgp_view_neighbor_damp,
10583 show_bgp_view_ipv6_neighbor_damp_cmd,
10584 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10585 SHOW_STR
10586 BGP_STR
10587 "BGP view\n"
10588 "BGP view name\n"
10589 "Address family\n"
10590 "Detailed information on TCP and BGP neighbor connections\n"
10591 "Neighbor to display information about\n"
10592 "Neighbor to display information about\n"
10593 "Display the dampened routes received from neighbor\n")
10595 DEFUN (show_bgp_view_neighbor_flap,
10596 show_bgp_view_neighbor_flap_cmd,
10597 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10598 SHOW_STR
10599 BGP_STR
10600 "BGP view\n"
10601 "BGP view name\n"
10602 "Detailed information on TCP and BGP neighbor connections\n"
10603 "Neighbor to display information about\n"
10604 "Neighbor to display information about\n"
10605 "Display flap statistics of the routes learned from neighbor\n")
10607 struct peer *peer;
10609 if (argc == 2)
10610 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10611 else
10612 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10614 if (! peer)
10615 return CMD_WARNING;
10617 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10618 bgp_show_type_flap_neighbor);
10621 ALIAS (show_bgp_view_neighbor_flap,
10622 show_bgp_view_ipv6_neighbor_flap_cmd,
10623 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10624 SHOW_STR
10625 BGP_STR
10626 "BGP view\n"
10627 "BGP view name\n"
10628 "Address family\n"
10629 "Detailed information on TCP and BGP neighbor connections\n"
10630 "Neighbor to display information about\n"
10631 "Neighbor to display information about\n"
10632 "Display flap statistics of the routes learned from neighbor\n")
10634 ALIAS (show_bgp_view_neighbor_routes,
10635 show_bgp_neighbor_routes_cmd,
10636 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
10637 SHOW_STR
10638 BGP_STR
10639 "Detailed information on TCP and BGP neighbor connections\n"
10640 "Neighbor to display information about\n"
10641 "Neighbor to display information about\n"
10642 "Display routes learned from neighbor\n")
10645 ALIAS (show_bgp_view_neighbor_routes,
10646 show_bgp_ipv6_neighbor_routes_cmd,
10647 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10648 SHOW_STR
10649 BGP_STR
10650 "Address family\n"
10651 "Detailed information on TCP and BGP neighbor connections\n"
10652 "Neighbor to display information about\n"
10653 "Neighbor to display information about\n"
10654 "Display routes learned from neighbor\n")
10656 /* old command */
10657 ALIAS (show_bgp_view_neighbor_routes,
10658 ipv6_bgp_neighbor_routes_cmd,
10659 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
10660 SHOW_STR
10661 IPV6_STR
10662 BGP_STR
10663 "Detailed information on TCP and BGP neighbor connections\n"
10664 "Neighbor to display information about\n"
10665 "Neighbor to display information about\n"
10666 "Display routes learned from neighbor\n")
10668 /* old command */
10669 DEFUN (ipv6_mbgp_neighbor_routes,
10670 ipv6_mbgp_neighbor_routes_cmd,
10671 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
10672 SHOW_STR
10673 IPV6_STR
10674 MBGP_STR
10675 "Detailed information on TCP and BGP neighbor connections\n"
10676 "Neighbor to display information about\n"
10677 "Neighbor to display information about\n"
10678 "Display routes learned from neighbor\n")
10680 struct peer *peer;
10682 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10683 if (! peer)
10684 return CMD_WARNING;
10686 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
10687 bgp_show_type_neighbor);
10690 ALIAS (show_bgp_view_neighbor_flap,
10691 show_bgp_neighbor_flap_cmd,
10692 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10693 SHOW_STR
10694 BGP_STR
10695 "Detailed information on TCP and BGP neighbor connections\n"
10696 "Neighbor to display information about\n"
10697 "Neighbor to display information about\n"
10698 "Display flap statistics of the routes learned from neighbor\n")
10700 ALIAS (show_bgp_view_neighbor_flap,
10701 show_bgp_ipv6_neighbor_flap_cmd,
10702 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10703 SHOW_STR
10704 BGP_STR
10705 "Address family\n"
10706 "Detailed information on TCP and BGP neighbor connections\n"
10707 "Neighbor to display information about\n"
10708 "Neighbor to display information about\n"
10709 "Display flap statistics of the routes learned from neighbor\n")
10711 ALIAS (show_bgp_view_neighbor_damp,
10712 show_bgp_neighbor_damp_cmd,
10713 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10714 SHOW_STR
10715 BGP_STR
10716 "Detailed information on TCP and BGP neighbor connections\n"
10717 "Neighbor to display information about\n"
10718 "Neighbor to display information about\n"
10719 "Display the dampened routes received from neighbor\n")
10721 ALIAS (show_bgp_view_neighbor_damp,
10722 show_bgp_ipv6_neighbor_damp_cmd,
10723 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10724 SHOW_STR
10725 BGP_STR
10726 "Address family\n"
10727 "Detailed information on TCP and BGP neighbor connections\n"
10728 "Neighbor to display information about\n"
10729 "Neighbor to display information about\n"
10730 "Display the dampened routes received from neighbor\n")
10732 DEFUN (show_bgp_view_rsclient,
10733 show_bgp_view_rsclient_cmd,
10734 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10735 SHOW_STR
10736 BGP_STR
10737 "BGP view\n"
10738 "BGP view name\n"
10739 "Information about Route Server Client\n"
10740 NEIGHBOR_ADDR_STR)
10742 struct bgp_table *table;
10743 struct peer *peer;
10745 if (argc == 2)
10746 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10747 else
10748 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10750 if (! peer)
10751 return CMD_WARNING;
10753 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10755 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10756 VTY_NEWLINE);
10757 return CMD_WARNING;
10760 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10761 PEER_FLAG_RSERVER_CLIENT))
10763 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10764 VTY_NEWLINE);
10765 return CMD_WARNING;
10768 table = peer->rib[AFI_IP6][SAFI_UNICAST];
10770 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10773 ALIAS (show_bgp_view_rsclient,
10774 show_bgp_rsclient_cmd,
10775 "show bgp rsclient (A.B.C.D|X:X::X:X)",
10776 SHOW_STR
10777 BGP_STR
10778 "Information about Route Server Client\n"
10779 NEIGHBOR_ADDR_STR)
10781 DEFUN (show_bgp_view_rsclient_route,
10782 show_bgp_view_rsclient_route_cmd,
10783 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10784 SHOW_STR
10785 BGP_STR
10786 "BGP view\n"
10787 "BGP view name\n"
10788 "Information about Route Server Client\n"
10789 NEIGHBOR_ADDR_STR
10790 "Network in the BGP routing table to display\n")
10792 struct bgp *bgp;
10793 struct peer *peer;
10795 /* BGP structure lookup. */
10796 if (argc == 3)
10798 bgp = bgp_lookup_by_name (argv[0]);
10799 if (bgp == NULL)
10801 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10802 return CMD_WARNING;
10805 else
10807 bgp = bgp_get_default ();
10808 if (bgp == NULL)
10810 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10811 return CMD_WARNING;
10815 if (argc == 3)
10816 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10817 else
10818 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10820 if (! peer)
10821 return CMD_WARNING;
10823 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10825 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10826 VTY_NEWLINE);
10827 return CMD_WARNING;
10830 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10831 PEER_FLAG_RSERVER_CLIENT))
10833 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10834 VTY_NEWLINE);
10835 return CMD_WARNING;
10838 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10839 (argc == 3) ? argv[2] : argv[1],
10840 AFI_IP6, SAFI_UNICAST, NULL, 0);
10843 ALIAS (show_bgp_view_rsclient_route,
10844 show_bgp_rsclient_route_cmd,
10845 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10846 SHOW_STR
10847 BGP_STR
10848 "Information about Route Server Client\n"
10849 NEIGHBOR_ADDR_STR
10850 "Network in the BGP routing table to display\n")
10852 DEFUN (show_bgp_view_rsclient_prefix,
10853 show_bgp_view_rsclient_prefix_cmd,
10854 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10855 SHOW_STR
10856 BGP_STR
10857 "BGP view\n"
10858 "BGP view name\n"
10859 "Information about Route Server Client\n"
10860 NEIGHBOR_ADDR_STR
10861 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10863 struct bgp *bgp;
10864 struct peer *peer;
10866 /* BGP structure lookup. */
10867 if (argc == 3)
10869 bgp = bgp_lookup_by_name (argv[0]);
10870 if (bgp == NULL)
10872 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10873 return CMD_WARNING;
10876 else
10878 bgp = bgp_get_default ();
10879 if (bgp == NULL)
10881 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10882 return CMD_WARNING;
10886 if (argc == 3)
10887 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10888 else
10889 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10891 if (! peer)
10892 return CMD_WARNING;
10894 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10896 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10897 VTY_NEWLINE);
10898 return CMD_WARNING;
10901 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10902 PEER_FLAG_RSERVER_CLIENT))
10904 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10905 VTY_NEWLINE);
10906 return CMD_WARNING;
10909 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10910 (argc == 3) ? argv[2] : argv[1],
10911 AFI_IP6, SAFI_UNICAST, NULL, 1);
10914 ALIAS (show_bgp_view_rsclient_prefix,
10915 show_bgp_rsclient_prefix_cmd,
10916 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10917 SHOW_STR
10918 BGP_STR
10919 "Information about Route Server Client\n"
10920 NEIGHBOR_ADDR_STR
10921 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10923 #endif /* HAVE_IPV6 */
10925 struct bgp_table *bgp_distance_table;
10927 struct bgp_distance
10929 /* Distance value for the IP source prefix. */
10930 u_char distance;
10932 /* Name of the access-list to be matched. */
10933 char *access_list;
10936 static struct bgp_distance *
10937 bgp_distance_new (void)
10939 return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
10942 static void
10943 bgp_distance_free (struct bgp_distance *bdistance)
10945 XFREE (MTYPE_BGP_DISTANCE, bdistance);
10948 static int
10949 bgp_distance_set (struct vty *vty, const char *distance_str,
10950 const char *ip_str, const char *access_list_str)
10952 int ret;
10953 struct prefix_ipv4 p;
10954 u_char distance;
10955 struct bgp_node *rn;
10956 struct bgp_distance *bdistance;
10958 ret = str2prefix_ipv4 (ip_str, &p);
10959 if (ret == 0)
10961 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
10962 return CMD_WARNING;
10965 distance = atoi (distance_str);
10967 /* Get BGP distance node. */
10968 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
10969 if (rn->info)
10971 bdistance = rn->info;
10972 bgp_unlock_node (rn);
10974 else
10976 bdistance = bgp_distance_new ();
10977 rn->info = bdistance;
10980 /* Set distance value. */
10981 bdistance->distance = distance;
10983 /* Reset access-list configuration. */
10984 if (bdistance->access_list)
10986 free (bdistance->access_list);
10987 bdistance->access_list = NULL;
10989 if (access_list_str)
10990 bdistance->access_list = strdup (access_list_str);
10992 return CMD_SUCCESS;
10995 static int
10996 bgp_distance_unset (struct vty *vty, const char *distance_str,
10997 const char *ip_str, const char *access_list_str)
10999 int ret;
11000 struct prefix_ipv4 p;
11001 u_char distance;
11002 struct bgp_node *rn;
11003 struct bgp_distance *bdistance;
11005 ret = str2prefix_ipv4 (ip_str, &p);
11006 if (ret == 0)
11008 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11009 return CMD_WARNING;
11012 distance = atoi (distance_str);
11014 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
11015 if (! rn)
11017 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
11018 return CMD_WARNING;
11021 bdistance = rn->info;
11023 if (bdistance->access_list)
11024 free (bdistance->access_list);
11025 bgp_distance_free (bdistance);
11027 rn->info = NULL;
11028 bgp_unlock_node (rn);
11029 bgp_unlock_node (rn);
11031 return CMD_SUCCESS;
11034 /* Apply BGP information to distance method. */
11035 u_char
11036 bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
11038 struct bgp_node *rn;
11039 struct prefix_ipv4 q;
11040 struct peer *peer;
11041 struct bgp_distance *bdistance;
11042 struct access_list *alist;
11043 struct bgp_static *bgp_static;
11045 if (! bgp)
11046 return 0;
11048 if (p->family != AF_INET)
11049 return 0;
11051 peer = rinfo->peer;
11053 if (peer->su.sa.sa_family != AF_INET)
11054 return 0;
11056 memset (&q, 0, sizeof (struct prefix_ipv4));
11057 q.family = AF_INET;
11058 q.prefix = peer->su.sin.sin_addr;
11059 q.prefixlen = IPV4_MAX_BITLEN;
11061 /* Check source address. */
11062 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11063 if (rn)
11065 bdistance = rn->info;
11066 bgp_unlock_node (rn);
11068 if (bdistance->access_list)
11070 alist = access_list_lookup (AFI_IP, bdistance->access_list);
11071 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11072 return bdistance->distance;
11074 else
11075 return bdistance->distance;
11078 /* Backdoor check. */
11079 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11080 if (rn)
11082 bgp_static = rn->info;
11083 bgp_unlock_node (rn);
11085 if (bgp_static->backdoor)
11087 if (bgp->distance_local)
11088 return bgp->distance_local;
11089 else
11090 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11094 if (peer_sort (peer) == BGP_PEER_EBGP)
11096 if (bgp->distance_ebgp)
11097 return bgp->distance_ebgp;
11098 return ZEBRA_EBGP_DISTANCE_DEFAULT;
11100 else
11102 if (bgp->distance_ibgp)
11103 return bgp->distance_ibgp;
11104 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11108 DEFUN (bgp_distance,
11109 bgp_distance_cmd,
11110 "distance bgp <1-255> <1-255> <1-255>",
11111 "Define an administrative distance\n"
11112 "BGP distance\n"
11113 "Distance for routes external to the AS\n"
11114 "Distance for routes internal to the AS\n"
11115 "Distance for local routes\n")
11117 struct bgp *bgp;
11119 bgp = vty->index;
11121 bgp->distance_ebgp = atoi (argv[0]);
11122 bgp->distance_ibgp = atoi (argv[1]);
11123 bgp->distance_local = atoi (argv[2]);
11124 return CMD_SUCCESS;
11127 DEFUN (no_bgp_distance,
11128 no_bgp_distance_cmd,
11129 "no distance bgp <1-255> <1-255> <1-255>",
11130 NO_STR
11131 "Define an administrative distance\n"
11132 "BGP distance\n"
11133 "Distance for routes external to the AS\n"
11134 "Distance for routes internal to the AS\n"
11135 "Distance for local routes\n")
11137 struct bgp *bgp;
11139 bgp = vty->index;
11141 bgp->distance_ebgp= 0;
11142 bgp->distance_ibgp = 0;
11143 bgp->distance_local = 0;
11144 return CMD_SUCCESS;
11147 ALIAS (no_bgp_distance,
11148 no_bgp_distance2_cmd,
11149 "no distance bgp",
11150 NO_STR
11151 "Define an administrative distance\n"
11152 "BGP distance\n")
11154 DEFUN (bgp_distance_source,
11155 bgp_distance_source_cmd,
11156 "distance <1-255> A.B.C.D/M",
11157 "Define an administrative distance\n"
11158 "Administrative distance\n"
11159 "IP source prefix\n")
11161 bgp_distance_set (vty, argv[0], argv[1], NULL);
11162 return CMD_SUCCESS;
11165 DEFUN (no_bgp_distance_source,
11166 no_bgp_distance_source_cmd,
11167 "no distance <1-255> A.B.C.D/M",
11168 NO_STR
11169 "Define an administrative distance\n"
11170 "Administrative distance\n"
11171 "IP source prefix\n")
11173 bgp_distance_unset (vty, argv[0], argv[1], NULL);
11174 return CMD_SUCCESS;
11177 DEFUN (bgp_distance_source_access_list,
11178 bgp_distance_source_access_list_cmd,
11179 "distance <1-255> A.B.C.D/M WORD",
11180 "Define an administrative distance\n"
11181 "Administrative distance\n"
11182 "IP source prefix\n"
11183 "Access list name\n")
11185 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11186 return CMD_SUCCESS;
11189 DEFUN (no_bgp_distance_source_access_list,
11190 no_bgp_distance_source_access_list_cmd,
11191 "no distance <1-255> A.B.C.D/M WORD",
11192 NO_STR
11193 "Define an administrative distance\n"
11194 "Administrative distance\n"
11195 "IP source prefix\n"
11196 "Access list name\n")
11198 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11199 return CMD_SUCCESS;
11202 DEFUN (bgp_damp_set,
11203 bgp_damp_set_cmd,
11204 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11205 "BGP Specific commands\n"
11206 "Enable route-flap dampening\n"
11207 "Half-life time for the penalty\n"
11208 "Value to start reusing a route\n"
11209 "Value to start suppressing a route\n"
11210 "Maximum duration to suppress a stable route\n")
11212 struct bgp *bgp;
11213 int half = DEFAULT_HALF_LIFE * 60;
11214 int reuse = DEFAULT_REUSE;
11215 int suppress = DEFAULT_SUPPRESS;
11216 int max = 4 * half;
11218 if (argc == 4)
11220 half = atoi (argv[0]) * 60;
11221 reuse = atoi (argv[1]);
11222 suppress = atoi (argv[2]);
11223 max = atoi (argv[3]) * 60;
11225 else if (argc == 1)
11227 half = atoi (argv[0]) * 60;
11228 max = 4 * half;
11231 bgp = vty->index;
11232 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11233 half, reuse, suppress, max);
11236 ALIAS (bgp_damp_set,
11237 bgp_damp_set2_cmd,
11238 "bgp dampening <1-45>",
11239 "BGP Specific commands\n"
11240 "Enable route-flap dampening\n"
11241 "Half-life time for the penalty\n")
11243 ALIAS (bgp_damp_set,
11244 bgp_damp_set3_cmd,
11245 "bgp dampening",
11246 "BGP Specific commands\n"
11247 "Enable route-flap dampening\n")
11249 DEFUN (bgp_damp_unset,
11250 bgp_damp_unset_cmd,
11251 "no bgp dampening",
11252 NO_STR
11253 "BGP Specific commands\n"
11254 "Enable route-flap dampening\n")
11256 struct bgp *bgp;
11258 bgp = vty->index;
11259 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11262 ALIAS (bgp_damp_unset,
11263 bgp_damp_unset2_cmd,
11264 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11265 NO_STR
11266 "BGP Specific commands\n"
11267 "Enable route-flap dampening\n"
11268 "Half-life time for the penalty\n"
11269 "Value to start reusing a route\n"
11270 "Value to start suppressing a route\n"
11271 "Maximum duration to suppress a stable route\n")
11273 DEFUN (show_ip_bgp_dampened_paths,
11274 show_ip_bgp_dampened_paths_cmd,
11275 "show ip bgp dampened-paths",
11276 SHOW_STR
11277 IP_STR
11278 BGP_STR
11279 "Display paths suppressed due to dampening\n")
11281 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11282 NULL);
11285 DEFUN (show_ip_bgp_flap_statistics,
11286 show_ip_bgp_flap_statistics_cmd,
11287 "show ip bgp flap-statistics",
11288 SHOW_STR
11289 IP_STR
11290 BGP_STR
11291 "Display flap statistics of routes\n")
11293 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11294 bgp_show_type_flap_statistics, NULL);
11297 /* Display specified route of BGP table. */
11298 static int
11299 bgp_clear_damp_route (struct vty *vty, const char *view_name,
11300 const char *ip_str, afi_t afi, safi_t safi,
11301 struct prefix_rd *prd, int prefix_check)
11303 int ret;
11304 struct prefix match;
11305 struct bgp_node *rn;
11306 struct bgp_node *rm;
11307 struct bgp_info *ri;
11308 struct bgp_info *ri_temp;
11309 struct bgp *bgp;
11310 struct bgp_table *table;
11312 /* BGP structure lookup. */
11313 if (view_name)
11315 bgp = bgp_lookup_by_name (view_name);
11316 if (bgp == NULL)
11318 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11319 return CMD_WARNING;
11322 else
11324 bgp = bgp_get_default ();
11325 if (bgp == NULL)
11327 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11328 return CMD_WARNING;
11332 /* Check IP address argument. */
11333 ret = str2prefix (ip_str, &match);
11334 if (! ret)
11336 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
11337 return CMD_WARNING;
11340 match.family = afi2family (afi);
11342 if (safi == SAFI_MPLS_VPN)
11344 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
11346 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
11347 continue;
11349 if ((table = rn->info) != NULL)
11350 if ((rm = bgp_node_match (table, &match)) != NULL)
11351 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
11353 ri = rm->info;
11354 while (ri)
11356 if (ri->extra && ri->extra->damp_info)
11358 ri_temp = ri->next;
11359 bgp_damp_info_free (ri->extra->damp_info, 1);
11360 ri = ri_temp;
11362 else
11363 ri = ri->next;
11368 else
11370 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
11371 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
11373 ri = rn->info;
11374 while (ri)
11376 if (ri->extra && ri->extra->damp_info)
11378 ri_temp = ri->next;
11379 bgp_damp_info_free (ri->extra->damp_info, 1);
11380 ri = ri_temp;
11382 else
11383 ri = ri->next;
11388 return CMD_SUCCESS;
11391 DEFUN (clear_ip_bgp_dampening,
11392 clear_ip_bgp_dampening_cmd,
11393 "clear ip bgp dampening",
11394 CLEAR_STR
11395 IP_STR
11396 BGP_STR
11397 "Clear route flap dampening information\n")
11399 bgp_damp_info_clean ();
11400 return CMD_SUCCESS;
11403 DEFUN (clear_ip_bgp_dampening_prefix,
11404 clear_ip_bgp_dampening_prefix_cmd,
11405 "clear ip bgp dampening A.B.C.D/M",
11406 CLEAR_STR
11407 IP_STR
11408 BGP_STR
11409 "Clear route flap dampening information\n"
11410 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11412 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11413 SAFI_UNICAST, NULL, 1);
11416 DEFUN (clear_ip_bgp_dampening_address,
11417 clear_ip_bgp_dampening_address_cmd,
11418 "clear ip bgp dampening A.B.C.D",
11419 CLEAR_STR
11420 IP_STR
11421 BGP_STR
11422 "Clear route flap dampening information\n"
11423 "Network to clear damping information\n")
11425 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11426 SAFI_UNICAST, NULL, 0);
11429 DEFUN (clear_ip_bgp_dampening_address_mask,
11430 clear_ip_bgp_dampening_address_mask_cmd,
11431 "clear ip bgp dampening A.B.C.D A.B.C.D",
11432 CLEAR_STR
11433 IP_STR
11434 BGP_STR
11435 "Clear route flap dampening information\n"
11436 "Network to clear damping information\n"
11437 "Network mask\n")
11439 int ret;
11440 char prefix_str[BUFSIZ];
11442 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
11443 if (! ret)
11445 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
11446 return CMD_WARNING;
11449 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
11450 SAFI_UNICAST, NULL, 0);
11453 static int
11454 bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
11455 afi_t afi, safi_t safi, int *write)
11457 struct bgp_node *prn;
11458 struct bgp_node *rn;
11459 struct bgp_table *table;
11460 struct prefix *p;
11461 struct prefix_rd *prd;
11462 struct bgp_static *bgp_static;
11463 u_int32_t label;
11464 char buf[SU_ADDRSTRLEN];
11465 char rdbuf[RD_ADDRSTRLEN];
11467 /* Network configuration. */
11468 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
11469 if ((table = prn->info) != NULL)
11470 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
11471 if ((bgp_static = rn->info) != NULL)
11473 p = &rn->p;
11474 prd = (struct prefix_rd *) &prn->p;
11476 /* "address-family" display. */
11477 bgp_config_write_family_header (vty, afi, safi, write);
11479 /* "network" configuration display. */
11480 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
11481 label = decode_label (bgp_static->tag);
11483 vty_out (vty, " network %s/%d rd %s tag %d",
11484 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11485 p->prefixlen,
11486 rdbuf, label);
11487 vty_out (vty, "%s", VTY_NEWLINE);
11489 return 0;
11492 /* Configuration of static route announcement and aggregate
11493 information. */
11495 bgp_config_write_network (struct vty *vty, struct bgp *bgp,
11496 afi_t afi, safi_t safi, int *write)
11498 struct bgp_node *rn;
11499 struct prefix *p;
11500 struct bgp_static *bgp_static;
11501 struct bgp_aggregate *bgp_aggregate;
11502 char buf[SU_ADDRSTRLEN];
11504 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
11505 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
11507 /* Network configuration. */
11508 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
11509 if ((bgp_static = rn->info) != NULL)
11511 p = &rn->p;
11513 /* "address-family" display. */
11514 bgp_config_write_family_header (vty, afi, safi, write);
11516 /* "network" configuration display. */
11517 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11519 u_int32_t destination;
11520 struct in_addr netmask;
11522 destination = ntohl (p->u.prefix4.s_addr);
11523 masklen2ip (p->prefixlen, &netmask);
11524 vty_out (vty, " network %s",
11525 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
11527 if ((IN_CLASSC (destination) && p->prefixlen == 24)
11528 || (IN_CLASSB (destination) && p->prefixlen == 16)
11529 || (IN_CLASSA (destination) && p->prefixlen == 8)
11530 || p->u.prefix4.s_addr == 0)
11532 /* Natural mask is not display. */
11534 else
11535 vty_out (vty, " mask %s", inet_ntoa (netmask));
11537 else
11539 vty_out (vty, " network %s/%d",
11540 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11541 p->prefixlen);
11544 if (bgp_static->rmap.name)
11545 vty_out (vty, " route-map %s", bgp_static->rmap.name);
11546 else
11548 if (bgp_static->backdoor)
11549 vty_out (vty, " backdoor");
11550 if (bgp_static->ttl)
11551 vty_out (vty, " pathlimit %u", bgp_static->ttl);
11554 vty_out (vty, "%s", VTY_NEWLINE);
11557 /* Aggregate-address configuration. */
11558 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
11559 if ((bgp_aggregate = rn->info) != NULL)
11561 p = &rn->p;
11563 /* "address-family" display. */
11564 bgp_config_write_family_header (vty, afi, safi, write);
11566 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11568 struct in_addr netmask;
11570 masklen2ip (p->prefixlen, &netmask);
11571 vty_out (vty, " aggregate-address %s %s",
11572 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11573 inet_ntoa (netmask));
11575 else
11577 vty_out (vty, " aggregate-address %s/%d",
11578 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11579 p->prefixlen);
11582 if (bgp_aggregate->as_set)
11583 vty_out (vty, " as-set");
11585 if (bgp_aggregate->summary_only)
11586 vty_out (vty, " summary-only");
11588 vty_out (vty, "%s", VTY_NEWLINE);
11591 return 0;
11595 bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
11597 struct bgp_node *rn;
11598 struct bgp_distance *bdistance;
11600 /* Distance configuration. */
11601 if (bgp->distance_ebgp
11602 && bgp->distance_ibgp
11603 && bgp->distance_local
11604 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
11605 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
11606 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
11607 vty_out (vty, " distance bgp %d %d %d%s",
11608 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
11609 VTY_NEWLINE);
11611 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
11612 if ((bdistance = rn->info) != NULL)
11614 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
11615 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
11616 bdistance->access_list ? bdistance->access_list : "",
11617 VTY_NEWLINE);
11620 return 0;
11623 /* Allocate routing table structure and install commands. */
11624 void
11625 bgp_route_init (void)
11627 /* Init BGP distance table. */
11628 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
11630 /* IPv4 BGP commands. */
11631 install_element (BGP_NODE, &bgp_network_cmd);
11632 install_element (BGP_NODE, &bgp_network_mask_cmd);
11633 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
11634 install_element (BGP_NODE, &bgp_network_route_map_cmd);
11635 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
11636 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
11637 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
11638 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
11639 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
11640 install_element (BGP_NODE, &bgp_network_ttl_cmd);
11641 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
11642 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
11643 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
11644 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11645 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
11646 install_element (BGP_NODE, &no_bgp_network_cmd);
11647 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
11648 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
11649 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
11650 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
11651 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11652 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
11653 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
11654 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
11655 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
11656 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
11657 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11658 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
11659 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11660 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
11662 install_element (BGP_NODE, &aggregate_address_cmd);
11663 install_element (BGP_NODE, &aggregate_address_mask_cmd);
11664 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
11665 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
11666 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
11667 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
11668 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
11669 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
11670 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
11671 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
11672 install_element (BGP_NODE, &no_aggregate_address_cmd);
11673 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
11674 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
11675 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
11676 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
11677 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
11678 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
11679 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
11680 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11681 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11683 /* IPv4 unicast configuration. */
11684 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
11685 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
11686 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
11687 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
11688 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
11689 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
11690 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
11691 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
11692 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
11693 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
11694 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11695 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11696 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
11697 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
11698 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
11699 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
11700 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11701 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
11702 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
11703 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11704 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
11705 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11706 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11707 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
11708 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
11709 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
11710 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
11711 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
11712 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
11713 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
11714 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
11715 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
11716 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
11717 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
11718 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
11719 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
11720 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
11721 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
11722 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
11723 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
11724 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
11725 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11726 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11728 /* IPv4 multicast configuration. */
11729 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
11730 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
11731 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
11732 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
11733 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
11734 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
11735 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
11736 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
11737 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
11738 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
11739 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11740 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11741 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
11742 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
11743 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
11744 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
11745 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
11746 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11747 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
11748 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
11749 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11750 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
11751 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11752 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11753 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
11754 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
11755 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
11756 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
11757 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
11758 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
11759 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
11760 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
11761 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
11762 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
11763 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
11764 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
11765 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
11766 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
11767 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
11768 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
11769 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
11770 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
11771 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11772 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11774 install_element (VIEW_NODE, &show_ip_bgp_cmd);
11775 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
11776 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
11777 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
11778 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11779 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11780 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
11781 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11782 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11783 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11784 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
11785 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
11786 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
11787 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
11788 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11789 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
11790 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11791 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
11792 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11793 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
11794 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11795 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
11796 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11797 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
11798 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11799 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
11800 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
11801 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
11802 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
11803 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
11804 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
11805 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
11806 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
11807 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
11808 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
11809 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
11810 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
11811 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11812 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11813 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11814 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11815 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
11816 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11817 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
11818 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11819 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
11820 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11821 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11822 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11823 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11824 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11825 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
11826 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11827 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11828 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11829 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
11830 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
11831 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
11832 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
11833 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11834 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
11835 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
11836 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11837 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11838 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
11839 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
11840 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
11841 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
11842 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
11843 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11844 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
11845 install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
11846 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
11847 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11848 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
11850 /* Restricted node: VIEW_NODE - (set of dangerous commands) */
11851 install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
11852 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
11853 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11854 install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
11855 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11856 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11857 install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11858 install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
11859 install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
11860 install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
11861 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
11862 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
11863 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
11864 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
11865 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
11866 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
11867 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
11868 install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
11869 install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
11870 install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
11871 install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
11872 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11873 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11874 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11875 install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11876 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
11877 install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11878 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11879 install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
11881 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
11882 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
11883 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
11884 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
11885 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11886 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11887 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
11888 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11889 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11890 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11891 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
11892 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
11893 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
11894 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
11895 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11896 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
11897 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11898 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
11899 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11900 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
11901 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11902 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
11903 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11904 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
11905 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11906 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
11907 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
11908 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
11909 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
11910 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
11911 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
11912 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
11913 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
11914 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
11915 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
11916 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
11917 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
11918 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11919 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11920 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11921 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11922 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
11923 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11924 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
11925 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11926 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
11927 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11928 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11929 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11930 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11931 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11932 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
11933 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11934 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11935 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11936 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
11937 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
11938 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
11939 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
11940 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11941 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
11942 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
11943 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11944 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11945 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
11946 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
11947 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
11948 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
11949 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
11950 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11951 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
11952 install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
11953 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
11954 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11955 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
11957 /* BGP dampening clear commands */
11958 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
11959 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
11960 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
11961 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
11963 /* prefix count */
11964 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
11965 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
11966 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
11967 #ifdef HAVE_IPV6
11968 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
11970 /* New config IPv6 BGP commands. */
11971 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
11972 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
11973 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
11974 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
11975 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
11976 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
11978 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
11979 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
11980 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
11981 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
11983 /* Old config IPv6 BGP commands. */
11984 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
11985 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
11987 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
11988 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
11989 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
11990 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
11992 install_element (VIEW_NODE, &show_bgp_cmd);
11993 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
11994 install_element (VIEW_NODE, &show_bgp_route_cmd);
11995 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
11996 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
11997 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
11998 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
11999 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
12000 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
12001 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
12002 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
12003 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
12004 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
12005 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
12006 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
12007 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
12008 install_element (VIEW_NODE, &show_bgp_community_cmd);
12009 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
12010 install_element (VIEW_NODE, &show_bgp_community2_cmd);
12011 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
12012 install_element (VIEW_NODE, &show_bgp_community3_cmd);
12013 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
12014 install_element (VIEW_NODE, &show_bgp_community4_cmd);
12015 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
12016 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
12017 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
12018 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
12019 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
12020 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
12021 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
12022 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
12023 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
12024 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
12025 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
12026 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
12027 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12028 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
12029 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12030 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
12031 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12032 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
12033 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12034 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
12035 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12036 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12037 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
12038 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
12039 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12040 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
12041 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
12042 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
12043 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
12044 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
12045 install_element (VIEW_NODE, &show_bgp_view_cmd);
12046 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
12047 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
12048 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
12049 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
12050 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
12051 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12052 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12053 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12054 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12055 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
12056 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12057 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12058 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12059 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
12060 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12061 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
12062 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
12063 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
12064 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
12065 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
12067 /* Restricted:
12068 * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
12070 install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
12071 install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
12072 install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
12073 install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
12074 install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
12075 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
12076 install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
12077 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
12078 install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
12079 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
12080 install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
12081 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
12082 install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
12083 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
12084 install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
12085 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
12086 install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
12087 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
12088 install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
12089 install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
12090 install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
12091 install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
12092 install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
12093 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
12094 install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
12095 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
12096 install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12097 install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12098 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
12099 install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
12101 install_element (ENABLE_NODE, &show_bgp_cmd);
12102 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
12103 install_element (ENABLE_NODE, &show_bgp_route_cmd);
12104 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
12105 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
12106 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
12107 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
12108 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
12109 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
12110 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
12111 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
12112 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
12113 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
12114 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
12115 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
12116 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
12117 install_element (ENABLE_NODE, &show_bgp_community_cmd);
12118 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
12119 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
12120 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
12121 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
12122 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
12123 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
12124 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
12125 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12126 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12127 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12128 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12129 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12130 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12131 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12132 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12133 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12134 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12135 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12136 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12137 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12138 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12139 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12140 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12141 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12142 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12143 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12144 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12145 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12146 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
12147 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12148 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12149 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12150 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
12151 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
12152 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
12153 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
12154 install_element (ENABLE_NODE, &show_bgp_view_cmd);
12155 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12156 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12157 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12158 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12159 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12160 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12161 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12162 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12163 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12164 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12165 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12166 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12167 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12168 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12169 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12170 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12171 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
12172 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
12173 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
12174 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
12176 /* Statistics */
12177 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12178 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12179 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12180 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12182 /* old command */
12183 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12184 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12185 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12186 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12187 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12188 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12189 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12190 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12191 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12192 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12193 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12194 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12195 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12196 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12197 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12198 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12199 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12200 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12201 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12202 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12203 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12204 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12205 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12206 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12207 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12208 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12209 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12210 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12211 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12212 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12213 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12214 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12215 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12216 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12217 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12218 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12220 /* old command */
12221 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12222 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12223 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12224 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12225 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12226 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12227 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12228 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12229 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12230 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12231 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12232 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12233 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12234 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12235 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12236 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12237 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12238 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12239 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12240 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12241 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12242 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12243 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12244 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12245 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12246 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12247 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12248 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12249 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12250 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12251 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12252 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12253 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12254 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12255 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12256 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12258 /* old command */
12259 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12260 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12261 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12262 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12264 /* old command */
12265 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12266 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12267 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12268 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12270 /* old command */
12271 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12272 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12273 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12274 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12275 #endif /* HAVE_IPV6 */
12277 install_element (BGP_NODE, &bgp_distance_cmd);
12278 install_element (BGP_NODE, &no_bgp_distance_cmd);
12279 install_element (BGP_NODE, &no_bgp_distance2_cmd);
12280 install_element (BGP_NODE, &bgp_distance_source_cmd);
12281 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12282 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12283 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12285 install_element (BGP_NODE, &bgp_damp_set_cmd);
12286 install_element (BGP_NODE, &bgp_damp_set2_cmd);
12287 install_element (BGP_NODE, &bgp_damp_set3_cmd);
12288 install_element (BGP_NODE, &bgp_damp_unset_cmd);
12289 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12290 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
12291 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
12292 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
12293 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
12294 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
12297 void
12298 bgp_route_finish (void)
12300 bgp_table_unlock (bgp_distance_table);
12301 bgp_distance_table = NULL;