]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_route.c
[bgpd] Fix triggerable crash when compiled with --disable-bgp-announce
[mirror_frr.git] / bgpd / bgp_route.c
1 /* BGP routing information
2 Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
3
4 This file is part of GNU Zebra.
5
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.
10
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.
15
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. */
20
21 #include <zebra.h>
22
23 #include "prefix.h"
24 #include "linklist.h"
25 #include "memory.h"
26 #include "command.h"
27 #include "stream.h"
28 #include "filter.h"
29 #include "str.h"
30 #include "log.h"
31 #include "routemap.h"
32 #include "buffer.h"
33 #include "sockunion.h"
34 #include "plist.h"
35 #include "thread.h"
36 #include "workqueue.h"
37
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"
57
58 /* Extern from bgp_dump.c */
59 extern char *bgp_origin_str[];
60 extern char *bgp_origin_long_str[];
61 \f
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)
65 {
66 struct bgp_node *rn;
67 struct bgp_node *prn = NULL;
68
69 assert (table);
70 if (!table)
71 return NULL;
72
73 if (safi == SAFI_MPLS_VPN)
74 {
75 prn = bgp_node_get (table, (struct prefix *) prd);
76
77 if (prn->info == NULL)
78 prn->info = bgp_table_init (afi, safi);
79 else
80 bgp_unlock_node (prn);
81 table = prn->info;
82 }
83
84 rn = bgp_node_get (table, p);
85
86 if (safi == SAFI_MPLS_VPN)
87 rn->prn = prn;
88
89 return rn;
90 }
91 \f
92 /* Allocate bgp_info_extra */
93 static struct bgp_info_extra *
94 bgp_info_extra_new (void)
95 {
96 struct bgp_info_extra *new;
97 new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
98 return new;
99 }
100
101 static void
102 bgp_info_extra_free (struct bgp_info_extra **extra)
103 {
104 if (extra && *extra)
105 {
106 if ((*extra)->damp_info)
107 bgp_damp_info_free ((*extra)->damp_info, 0);
108
109 (*extra)->damp_info = NULL;
110
111 XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
112
113 *extra = NULL;
114 }
115 }
116
117 /* Get bgp_info extra information for the given bgp_info, lazy allocated
118 * if required.
119 */
120 struct bgp_info_extra *
121 bgp_info_extra_get (struct bgp_info *ri)
122 {
123 if (!ri->extra)
124 ri->extra = bgp_info_extra_new();
125 return ri->extra;
126 }
127
128 /* Allocate new bgp info structure. */
129 static struct bgp_info *
130 bgp_info_new ()
131 {
132 struct bgp_info *new;
133
134 new = XMALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
135 memset (new, 0, sizeof (struct bgp_info));
136
137 return new;
138 }
139
140 /* Free bgp route information. */
141 static void
142 bgp_info_free (struct bgp_info *binfo)
143 {
144 if (binfo->attr)
145 bgp_attr_unintern (binfo->attr);
146
147 bgp_info_extra_free (&binfo->extra);
148
149 peer_unlock (binfo->peer); /* bgp_info peer reference */
150
151 XFREE (MTYPE_BGP_ROUTE, binfo);
152 }
153
154 struct bgp_info *
155 bgp_info_lock (struct bgp_info *binfo)
156 {
157 binfo->lock++;
158 return binfo;
159 }
160
161 struct bgp_info *
162 bgp_info_unlock (struct bgp_info *binfo)
163 {
164 assert (binfo && binfo->lock > 0);
165 binfo->lock--;
166
167 if (binfo->lock == 0)
168 {
169 #if 0
170 zlog_debug ("%s: unlocked and freeing", __func__);
171 zlog_backtrace (LOG_DEBUG);
172 #endif
173 bgp_info_free (binfo);
174 return NULL;
175 }
176
177 #if 0
178 if (binfo->lock == 1)
179 {
180 zlog_debug ("%s: unlocked to 1", __func__);
181 zlog_backtrace (LOG_DEBUG);
182 }
183 #endif
184
185 return binfo;
186 }
187
188 void
189 bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
190 {
191 struct bgp_info *top;
192
193 top = rn->info;
194
195 ri->next = rn->info;
196 ri->prev = NULL;
197 if (top)
198 top->prev = ri;
199 rn->info = ri;
200
201 bgp_info_lock (ri);
202 bgp_lock_node (rn);
203 peer_lock (ri->peer); /* bgp_info peer reference */
204 }
205
206 /* Do the actual removal of info from RIB, for use by bgp_process
207 completion callback *only* */
208 static void
209 bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
210 {
211 if (ri->next)
212 ri->next->prev = ri->prev;
213 if (ri->prev)
214 ri->prev->next = ri->next;
215 else
216 rn->info = ri->next;
217
218 bgp_info_unlock (ri);
219 bgp_unlock_node (rn);
220 }
221
222 void
223 bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
224 {
225 bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
226 /* set of previous already took care of pcount */
227 UNSET_FLAG (ri->flags, BGP_INFO_VALID);
228 }
229
230 /* undo the effects of a previous call to bgp_info_delete; typically
231 called when a route is deleted and then quickly re-added before the
232 deletion has been processed */
233 static void
234 bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
235 {
236 bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
237 /* unset of previous already took care of pcount */
238 SET_FLAG (ri->flags, BGP_INFO_VALID);
239 }
240
241 /* Adjust pcount as required */
242 static void
243 bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
244 {
245 assert (rn && rn->table);
246 assert (ri && ri->peer && ri->peer->bgp);
247
248 /* Ignore 'pcount' for RS-client tables */
249 if (rn->table->type != BGP_TABLE_MAIN
250 || ri->peer == ri->peer->bgp->peer_self)
251 return;
252
253 if (BGP_INFO_HOLDDOWN (ri)
254 && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
255 {
256
257 UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
258
259 /* slight hack, but more robust against errors. */
260 if (ri->peer->pcount[rn->table->afi][rn->table->safi])
261 ri->peer->pcount[rn->table->afi][rn->table->safi]--;
262 else
263 {
264 zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
265 __func__, ri->peer->host);
266 zlog_backtrace (LOG_WARNING);
267 zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
268 }
269 }
270 else if (!BGP_INFO_HOLDDOWN (ri)
271 && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
272 {
273 SET_FLAG (ri->flags, BGP_INFO_COUNTED);
274 ri->peer->pcount[rn->table->afi][rn->table->safi]++;
275 }
276 }
277
278
279 /* Set/unset bgp_info flags, adjusting any other state as needed.
280 * This is here primarily to keep prefix-count in check.
281 */
282 void
283 bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
284 {
285 SET_FLAG (ri->flags, flag);
286
287 /* early bath if we know it's not a flag that changes useability state */
288 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
289 return;
290
291 bgp_pcount_adjust (rn, ri);
292 }
293
294 void
295 bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
296 {
297 UNSET_FLAG (ri->flags, flag);
298
299 /* early bath if we know it's not a flag that changes useability state */
300 if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
301 return;
302
303 bgp_pcount_adjust (rn, ri);
304 }
305
306 /* Get MED value. If MED value is missing and "bgp bestpath
307 missing-as-worst" is specified, treat it as the worst value. */
308 static u_int32_t
309 bgp_med_value (struct attr *attr, struct bgp *bgp)
310 {
311 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
312 return attr->med;
313 else
314 {
315 if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
316 return BGP_MED_MAX;
317 else
318 return 0;
319 }
320 }
321
322 /* Compare two bgp route entity. br is preferable then return 1. */
323 static int
324 bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
325 {
326 u_int32_t new_pref;
327 u_int32_t exist_pref;
328 u_int32_t new_med;
329 u_int32_t exist_med;
330 u_int32_t new_weight = 0;
331 u_int32_t exist_weight = 0;
332 struct in_addr new_id;
333 struct in_addr exist_id;
334 int new_cluster;
335 int exist_cluster;
336 int internal_as_route = 0;
337 int confed_as_route = 0;
338 int ret;
339
340 /* 0. Null check. */
341 if (new == NULL)
342 return 0;
343 if (exist == NULL)
344 return 1;
345
346 /* 1. Weight check. */
347 if (new->attr->extra)
348 new_weight = new->attr->extra->weight;
349 if (exist->attr->extra)
350 exist_weight = exist->attr->extra->weight;
351 if (new_weight > exist_weight)
352 return 1;
353 if (new_weight < exist_weight)
354 return 0;
355
356 /* 2. Local preference check. */
357 if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
358 new_pref = new->attr->local_pref;
359 else
360 new_pref = bgp->default_local_pref;
361
362 if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
363 exist_pref = exist->attr->local_pref;
364 else
365 exist_pref = bgp->default_local_pref;
366
367 if (new_pref > exist_pref)
368 return 1;
369 if (new_pref < exist_pref)
370 return 0;
371
372 /* 3. Local route check. */
373 if (new->sub_type == BGP_ROUTE_STATIC)
374 return 1;
375 if (exist->sub_type == BGP_ROUTE_STATIC)
376 return 0;
377
378 if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
379 return 1;
380 if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
381 return 0;
382
383 if (new->sub_type == BGP_ROUTE_AGGREGATE)
384 return 1;
385 if (exist->sub_type == BGP_ROUTE_AGGREGATE)
386 return 0;
387
388 /* 4. AS path length check. */
389 if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
390 {
391 int exist_hops = aspath_count_hops (exist->attr->aspath);
392 int exist_confeds = aspath_count_confeds (exist->attr->aspath);
393
394 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
395 {
396 int aspath_hops;
397
398 aspath_hops = aspath_count_hops (new->attr->aspath);
399 aspath_hops += aspath_count_confeds (new->attr->aspath);
400
401 if ( aspath_hops < (exist_hops + exist_confeds))
402 return 1;
403 if ( aspath_hops > (exist_hops + exist_confeds))
404 return 0;
405 }
406 else
407 {
408 int newhops = aspath_count_hops (new->attr->aspath);
409
410 if (newhops < exist_hops)
411 return 1;
412 if (newhops > exist_hops)
413 return 0;
414 }
415 }
416
417 /* 5. Origin check. */
418 if (new->attr->origin < exist->attr->origin)
419 return 1;
420 if (new->attr->origin > exist->attr->origin)
421 return 0;
422
423 /* 6. MED check. */
424 internal_as_route = (aspath_count_hops (new->attr->aspath) == 0
425 && aspath_count_hops (exist->attr->aspath) == 0);
426 confed_as_route = (aspath_count_confeds (new->attr->aspath) > 0
427 && aspath_count_confeds (exist->attr->aspath) > 0
428 && aspath_count_hops (new->attr->aspath) == 0
429 && aspath_count_hops (exist->attr->aspath) == 0);
430
431 if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
432 || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
433 && confed_as_route)
434 || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
435 || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
436 || internal_as_route)
437 {
438 new_med = bgp_med_value (new->attr, bgp);
439 exist_med = bgp_med_value (exist->attr, bgp);
440
441 if (new_med < exist_med)
442 return 1;
443 if (new_med > exist_med)
444 return 0;
445 }
446
447 /* 7. Peer type check. */
448 if (peer_sort (new->peer) == BGP_PEER_EBGP
449 && peer_sort (exist->peer) == BGP_PEER_IBGP)
450 return 1;
451 if (peer_sort (new->peer) == BGP_PEER_EBGP
452 && peer_sort (exist->peer) == BGP_PEER_CONFED)
453 return 1;
454 if (peer_sort (new->peer) == BGP_PEER_IBGP
455 && peer_sort (exist->peer) == BGP_PEER_EBGP)
456 return 0;
457 if (peer_sort (new->peer) == BGP_PEER_CONFED
458 && peer_sort (exist->peer) == BGP_PEER_EBGP)
459 return 0;
460
461 /* 8. IGP metric check. */
462 if (new->extra || exist->extra)
463 {
464 uint32_t newm = (new->extra ? new->extra->igpmetric : 0);
465 uint32_t existm = (exist->extra ? exist->extra->igpmetric : 0);
466
467 if (newm < existm)
468 return 1;
469 if (newm > existm)
470 return 0;
471 }
472
473 /* 9. Maximum path check. */
474
475 /* 10. If both paths are external, prefer the path that was received
476 first (the oldest one). This step minimizes route-flap, since a
477 newer path won't displace an older one, even if it was the
478 preferred route based on the additional decision criteria below. */
479 if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
480 && peer_sort (new->peer) == BGP_PEER_EBGP
481 && peer_sort (exist->peer) == BGP_PEER_EBGP)
482 {
483 if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
484 return 1;
485 if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
486 return 0;
487 }
488
489 /* 11. Rourter-ID comparision. */
490 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
491 new_id.s_addr = new->attr->extra->originator_id.s_addr;
492 else
493 new_id.s_addr = new->peer->remote_id.s_addr;
494 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
495 exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
496 else
497 exist_id.s_addr = exist->peer->remote_id.s_addr;
498
499 if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
500 return 1;
501 if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
502 return 0;
503
504 /* 12. Cluster length comparision. */
505 if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
506 new_cluster = new->attr->extra->cluster->length;
507 else
508 new_cluster = 0;
509 if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
510 exist_cluster = exist->attr->extra->cluster->length;
511 else
512 exist_cluster = 0;
513
514 if (new_cluster < exist_cluster)
515 return 1;
516 if (new_cluster > exist_cluster)
517 return 0;
518
519 /* 13. Neighbor address comparision. */
520 ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
521
522 if (ret == 1)
523 return 0;
524 if (ret == -1)
525 return 1;
526
527 return 1;
528 }
529
530 static enum filter_type
531 bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
532 afi_t afi, safi_t safi)
533 {
534 struct bgp_filter *filter;
535
536 filter = &peer->filter[afi][safi];
537
538 if (DISTRIBUTE_IN_NAME (filter))
539 if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
540 return FILTER_DENY;
541
542 if (PREFIX_LIST_IN_NAME (filter))
543 if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
544 return FILTER_DENY;
545
546 if (FILTER_LIST_IN_NAME (filter))
547 if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
548 return FILTER_DENY;
549
550 return FILTER_PERMIT;
551 }
552
553 static enum filter_type
554 bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
555 afi_t afi, safi_t safi)
556 {
557 struct bgp_filter *filter;
558
559 filter = &peer->filter[afi][safi];
560
561 if (DISTRIBUTE_OUT_NAME (filter))
562 if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
563 return FILTER_DENY;
564
565 if (PREFIX_LIST_OUT_NAME (filter))
566 if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
567 return FILTER_DENY;
568
569 if (FILTER_LIST_OUT_NAME (filter))
570 if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
571 return FILTER_DENY;
572
573 return FILTER_PERMIT;
574 }
575
576 /* If community attribute includes no_export then return 1. */
577 static int
578 bgp_community_filter (struct peer *peer, struct attr *attr)
579 {
580 if (attr->community)
581 {
582 /* NO_ADVERTISE check. */
583 if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
584 return 1;
585
586 /* NO_EXPORT check. */
587 if (peer_sort (peer) == BGP_PEER_EBGP &&
588 community_include (attr->community, COMMUNITY_NO_EXPORT))
589 return 1;
590
591 /* NO_EXPORT_SUBCONFED check. */
592 if (peer_sort (peer) == BGP_PEER_EBGP
593 || peer_sort (peer) == BGP_PEER_CONFED)
594 if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
595 return 1;
596 }
597 return 0;
598 }
599
600 /* Route reflection loop check. */
601 static int
602 bgp_cluster_filter (struct peer *peer, struct attr *attr)
603 {
604 struct in_addr cluster_id;
605
606 if (attr->extra && attr->extra->cluster)
607 {
608 if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
609 cluster_id = peer->bgp->cluster_id;
610 else
611 cluster_id = peer->bgp->router_id;
612
613 if (cluster_loop_check (attr->extra->cluster, cluster_id))
614 return 1;
615 }
616 return 0;
617 }
618 \f
619 static int
620 bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
621 afi_t afi, safi_t safi)
622 {
623 struct bgp_filter *filter;
624 struct bgp_info info;
625 route_map_result_t ret;
626
627 filter = &peer->filter[afi][safi];
628
629 /* Apply default weight value. */
630 if (peer->weight)
631 (bgp_attr_extra_get (attr))->weight = peer->weight;
632
633 /* Route map apply. */
634 if (ROUTE_MAP_IN_NAME (filter))
635 {
636 /* Duplicate current value to new strucutre for modification. */
637 info.peer = peer;
638 info.attr = attr;
639
640 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
641
642 /* Apply BGP route map to the attribute. */
643 ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
644
645 peer->rmap_type = 0;
646
647 if (ret == RMAP_DENYMATCH)
648 {
649 /* Free newly generated AS path and community by route-map. */
650 bgp_attr_flush (attr);
651 return RMAP_DENY;
652 }
653 }
654 return RMAP_PERMIT;
655 }
656 \f
657 static int
658 bgp_export_modifier (struct peer *rsclient, struct peer *peer,
659 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
660 {
661 struct bgp_filter *filter;
662 struct bgp_info info;
663 route_map_result_t ret;
664
665 filter = &peer->filter[afi][safi];
666
667 /* Route map apply. */
668 if (ROUTE_MAP_EXPORT_NAME (filter))
669 {
670 /* Duplicate current value to new strucutre for modification. */
671 info.peer = rsclient;
672 info.attr = attr;
673
674 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
675
676 /* Apply BGP route map to the attribute. */
677 ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
678
679 rsclient->rmap_type = 0;
680
681 if (ret == RMAP_DENYMATCH)
682 {
683 /* Free newly generated AS path and community by route-map. */
684 bgp_attr_flush (attr);
685 return RMAP_DENY;
686 }
687 }
688 return RMAP_PERMIT;
689 }
690
691 static int
692 bgp_import_modifier (struct peer *rsclient, struct peer *peer,
693 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
694 {
695 struct bgp_filter *filter;
696 struct bgp_info info;
697 route_map_result_t ret;
698
699 filter = &rsclient->filter[afi][safi];
700
701 /* Apply default weight value. */
702 if (peer->weight)
703 (bgp_attr_extra_get (attr))->weight = peer->weight;
704
705 /* Route map apply. */
706 if (ROUTE_MAP_IMPORT_NAME (filter))
707 {
708 /* Duplicate current value to new strucutre for modification. */
709 info.peer = peer;
710 info.attr = attr;
711
712 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
713
714 /* Apply BGP route map to the attribute. */
715 ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
716
717 peer->rmap_type = 0;
718
719 if (ret == RMAP_DENYMATCH)
720 {
721 /* Free newly generated AS path and community by route-map. */
722 bgp_attr_flush (attr);
723 return RMAP_DENY;
724 }
725 }
726 return RMAP_PERMIT;
727 }
728 \f
729 static int
730 bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
731 struct attr *attr, afi_t afi, safi_t safi)
732 {
733 int ret;
734 char buf[SU_ADDRSTRLEN];
735 struct bgp_filter *filter;
736 struct peer *from;
737 struct bgp *bgp;
738 int transparent;
739 int reflect;
740
741 from = ri->peer;
742 filter = &peer->filter[afi][safi];
743 bgp = peer->bgp;
744
745 if (DISABLE_BGP_ANNOUNCE)
746 return 0;
747
748 /* Do not send announces to RS-clients from the 'normal' bgp_table. */
749 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
750 return 0;
751
752 /* Do not send back route to sender. */
753 if (from == peer)
754 return 0;
755
756 /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
757 if (p->family == AF_INET
758 && IPV4_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
759 return 0;
760 #ifdef HAVE_IPV6
761 if (p->family == AF_INET6
762 && IPV6_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
763 return 0;
764 #endif
765
766 /* Aggregate-address suppress check. */
767 if (ri->extra && ri->extra->suppress)
768 if (! UNSUPPRESS_MAP_NAME (filter))
769 return 0;
770
771 /* Default route check. */
772 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
773 {
774 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
775 return 0;
776 #ifdef HAVE_IPV6
777 else if (p->family == AF_INET6 && p->prefixlen == 0)
778 return 0;
779 #endif /* HAVE_IPV6 */
780 }
781
782 /* Transparency check. */
783 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
784 && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
785 transparent = 1;
786 else
787 transparent = 0;
788
789 /* If community is not disabled check the no-export and local. */
790 if (! transparent && bgp_community_filter (peer, ri->attr))
791 return 0;
792
793 /* If the attribute has originator-id and it is same as remote
794 peer's id. */
795 if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
796 {
797 if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->extra->originator_id))
798 {
799 if (BGP_DEBUG (filter, FILTER))
800 zlog (peer->log, LOG_DEBUG,
801 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
802 peer->host,
803 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
804 p->prefixlen);
805 return 0;
806 }
807 }
808
809 /* ORF prefix-list filter check */
810 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
811 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
812 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
813 if (peer->orf_plist[afi][safi])
814 {
815 if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
816 return 0;
817 }
818
819 /* Output filter check. */
820 if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
821 {
822 if (BGP_DEBUG (filter, FILTER))
823 zlog (peer->log, LOG_DEBUG,
824 "%s [Update:SEND] %s/%d is filtered",
825 peer->host,
826 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
827 p->prefixlen);
828 return 0;
829 }
830
831 #ifdef BGP_SEND_ASPATH_CHECK
832 /* AS path loop check. */
833 if (aspath_loop_check (ri->attr->aspath, peer->as))
834 {
835 if (BGP_DEBUG (filter, FILTER))
836 zlog (peer->log, LOG_DEBUG,
837 "%s [Update:SEND] suppress announcement to peer AS %d is AS path.",
838 peer->host, peer->as);
839 return 0;
840 }
841 #endif /* BGP_SEND_ASPATH_CHECK */
842
843 /* If we're a CONFED we need to loop check the CONFED ID too */
844 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
845 {
846 if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
847 {
848 if (BGP_DEBUG (filter, FILTER))
849 zlog (peer->log, LOG_DEBUG,
850 "%s [Update:SEND] suppress announcement to peer AS %d is AS path.",
851 peer->host,
852 bgp->confed_id);
853 return 0;
854 }
855 }
856
857 /* Route-Reflect check. */
858 if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
859 reflect = 1;
860 else
861 reflect = 0;
862
863 /* IBGP reflection check. */
864 if (reflect)
865 {
866 /* A route from a Client peer. */
867 if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
868 {
869 /* Reflect to all the Non-Client peers and also to the
870 Client peers other than the originator. Originator check
871 is already done. So there is noting to do. */
872 /* no bgp client-to-client reflection check. */
873 if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
874 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
875 return 0;
876 }
877 else
878 {
879 /* A route from a Non-client peer. Reflect to all other
880 clients. */
881 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
882 return 0;
883 }
884 }
885
886 /* AS-Pathlimit check */
887 if (ri->attr->pathlimit.ttl && peer_sort (peer) == BGP_PEER_EBGP)
888 /* Our ASN has not yet been pre-pended, that's done in packet_attribute
889 * on output. Hence the test here is for >=.
890 */
891 if (aspath_count_hops (ri->attr->aspath) >= ri->attr->pathlimit.ttl)
892 {
893 if (BGP_DEBUG (filter, FILTER))
894 zlog_info ("%s [Update:SEND] suppressed, AS-Pathlimit TTL %u exceeded",
895 peer->host, ri->attr->pathlimit.ttl);
896 return 0;
897 }
898
899 /* For modify attribute, copy it to temporary structure. */
900 bgp_attr_dup (attr, ri->attr);
901
902 /* If local-preference is not set. */
903 if ((peer_sort (peer) == BGP_PEER_IBGP
904 || peer_sort (peer) == BGP_PEER_CONFED)
905 && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
906 {
907 attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
908 attr->local_pref = bgp->default_local_pref;
909 }
910
911 /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
912 if (peer_sort (peer) == BGP_PEER_EBGP
913 && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
914 {
915 if (ri->peer != bgp->peer_self && ! transparent
916 && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
917 attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
918 }
919
920 /* next-hop-set */
921 if (transparent || reflect
922 || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
923 && ((p->family == AF_INET && attr->nexthop.s_addr)
924 #ifdef HAVE_IPV6
925 || (p->family == AF_INET6 &&
926 ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
927 #endif /* HAVE_IPV6 */
928 )))
929 {
930 /* NEXT-HOP Unchanged. */
931 }
932 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
933 || (p->family == AF_INET && attr->nexthop.s_addr == 0)
934 #ifdef HAVE_IPV6
935 || (p->family == AF_INET6 &&
936 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
937 #endif /* HAVE_IPV6 */
938 || (peer_sort (peer) == BGP_PEER_EBGP
939 && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
940 {
941 /* Set IPv4 nexthop. */
942 if (p->family == AF_INET)
943 {
944 if (safi == SAFI_MPLS_VPN)
945 memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
946 IPV4_MAX_BYTELEN);
947 else
948 memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
949 }
950 #ifdef HAVE_IPV6
951 /* Set IPv6 nexthop. */
952 if (p->family == AF_INET6)
953 {
954 /* IPv6 global nexthop must be included. */
955 memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
956 IPV6_MAX_BYTELEN);
957 attr->extra->mp_nexthop_len = 16;
958 }
959 #endif /* HAVE_IPV6 */
960 }
961
962 #ifdef HAVE_IPV6
963 if (p->family == AF_INET6)
964 {
965 /* Left nexthop_local unchanged if so configured. */
966 if ( CHECK_FLAG (peer->af_flags[afi][safi],
967 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
968 {
969 if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
970 attr->extra->mp_nexthop_len=32;
971 else
972 attr->extra->mp_nexthop_len=16;
973 }
974
975 /* Default nexthop_local treatment for non-RS-Clients */
976 else
977 {
978 /* Link-local address should not be transit to different peer. */
979 attr->extra->mp_nexthop_len = 16;
980
981 /* Set link-local address for shared network peer. */
982 if (peer->shared_network
983 && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
984 {
985 memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
986 IPV6_MAX_BYTELEN);
987 attr->extra->mp_nexthop_len = 32;
988 }
989
990 /* If bgpd act as BGP-4+ route-reflector, do not send link-local
991 address.*/
992 if (reflect)
993 attr->extra->mp_nexthop_len = 16;
994
995 /* If BGP-4+ link-local nexthop is not link-local nexthop. */
996 if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
997 attr->extra->mp_nexthop_len = 16;
998 }
999
1000 }
1001 #endif /* HAVE_IPV6 */
1002
1003 /* AS-Pathlimit: Check ASN for private/confed */
1004 if (attr->pathlimit.ttl)
1005 {
1006 /* locally originated update */
1007 if (!attr->pathlimit.as)
1008 attr->pathlimit.as = peer->local_as;
1009
1010 /* if the AS_PATHLIMIT attribute is attached to a prefix by a
1011 member of a confederation, then when the prefix is advertised outside
1012 of the confederation boundary, then the AS number of the
1013 confederation member inside of the AS_PATHLIMIT attribute should be
1014 replaced by the confederation's AS number. */
1015 if (peer_sort (from) == BGP_PEER_CONFED
1016 && peer_sort (peer) != BGP_PEER_CONFED)
1017 attr->pathlimit.as = peer->local_as;
1018
1019 /* Private ASN should be updated whenever announcement leaves
1020 * private space. This is deliberately done after simple confed
1021 * based update..
1022 */
1023 if (attr->pathlimit.as >= BGP_PRIVATE_AS_MIN
1024 && attr->pathlimit.as <= BGP_PRIVATE_AS_MAX)
1025 {
1026 if (peer->local_as < BGP_PRIVATE_AS_MIN
1027 || peer->local_as > BGP_PRIVATE_AS_MAX)
1028 attr->pathlimit.as = peer->local_as;
1029 /* Ours is private, try using theirs.. */
1030 else if (peer->as < BGP_PRIVATE_AS_MIN
1031 || peer->local_as > BGP_PRIVATE_AS_MAX)
1032 attr->pathlimit.as = peer->as;
1033 }
1034 }
1035
1036 /* If this is EBGP peer and remove-private-AS is set. */
1037 if (peer_sort (peer) == BGP_PEER_EBGP
1038 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1039 && aspath_private_as_check (attr->aspath))
1040 attr->aspath = aspath_empty_get ();
1041
1042 /* Route map & unsuppress-map apply. */
1043 if (ROUTE_MAP_OUT_NAME (filter)
1044 || (ri->extra && ri->extra->suppress) )
1045 {
1046 struct bgp_info info;
1047 struct attr dummy_attr = { 0 };
1048
1049 info.peer = peer;
1050 info.attr = attr;
1051
1052 /* The route reflector is not allowed to modify the attributes
1053 of the reflected IBGP routes. */
1054 if (peer_sort (from) == BGP_PEER_IBGP
1055 && peer_sort (peer) == BGP_PEER_IBGP)
1056 {
1057 bgp_attr_dup (&dummy_attr, attr);
1058 info.attr = &dummy_attr;
1059 }
1060
1061 SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1062
1063 if (ri->extra && ri->extra->suppress)
1064 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1065 else
1066 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1067
1068 peer->rmap_type = 0;
1069
1070 if (dummy_attr.extra)
1071 bgp_attr_extra_free (&dummy_attr);
1072
1073 if (ret == RMAP_DENYMATCH)
1074 {
1075 bgp_attr_flush (attr);
1076 return 0;
1077 }
1078 }
1079 return 1;
1080 }
1081
1082 static int
1083 bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1084 struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
1085 {
1086 int ret;
1087 char buf[SU_ADDRSTRLEN];
1088 struct bgp_filter *filter;
1089 struct bgp_info info;
1090 struct peer *from;
1091 struct bgp *bgp;
1092
1093 from = ri->peer;
1094 filter = &rsclient->filter[afi][safi];
1095 bgp = rsclient->bgp;
1096
1097 if (DISABLE_BGP_ANNOUNCE)
1098 return 0;
1099
1100 /* Do not send back route to sender. */
1101 if (from == rsclient)
1102 return 0;
1103
1104 /* Aggregate-address suppress check. */
1105 if (ri->extra && ri->extra->suppress)
1106 if (! UNSUPPRESS_MAP_NAME (filter))
1107 return 0;
1108
1109 /* Default route check. */
1110 if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1111 PEER_STATUS_DEFAULT_ORIGINATE))
1112 {
1113 if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1114 return 0;
1115 #ifdef HAVE_IPV6
1116 else if (p->family == AF_INET6 && p->prefixlen == 0)
1117 return 0;
1118 #endif /* HAVE_IPV6 */
1119 }
1120
1121 /* If the attribute has originator-id and it is same as remote
1122 peer's id. */
1123 if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
1124 {
1125 if (IPV4_ADDR_SAME (&rsclient->remote_id,
1126 &ri->attr->extra->originator_id))
1127 {
1128 if (BGP_DEBUG (filter, FILTER))
1129 zlog (rsclient->log, LOG_DEBUG,
1130 "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1131 rsclient->host,
1132 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1133 p->prefixlen);
1134 return 0;
1135 }
1136 }
1137
1138 /* ORF prefix-list filter check */
1139 if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1140 && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1141 || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1142 if (rsclient->orf_plist[afi][safi])
1143 {
1144 if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1145 return 0;
1146 }
1147
1148 /* Output filter check. */
1149 if (bgp_output_filter (rsclient, p, ri->attr, afi, safi) == FILTER_DENY)
1150 {
1151 if (BGP_DEBUG (filter, FILTER))
1152 zlog (rsclient->log, LOG_DEBUG,
1153 "%s [Update:SEND] %s/%d is filtered",
1154 rsclient->host,
1155 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1156 p->prefixlen);
1157 return 0;
1158 }
1159
1160 #ifdef BGP_SEND_ASPATH_CHECK
1161 /* AS path loop check. */
1162 if (aspath_loop_check (ri->attr->aspath, rsclient->as))
1163 {
1164 if (BGP_DEBUG (filter, FILTER))
1165 zlog (rsclient->log, LOG_DEBUG,
1166 "%s [Update:SEND] suppress announcement to peer AS %d is AS path.",
1167 rsclient->host, rsclient->as);
1168 return 0;
1169 }
1170 #endif /* BGP_SEND_ASPATH_CHECK */
1171
1172 /* For modify attribute, copy it to temporary structure. */
1173 bgp_attr_dup (attr, ri->attr);
1174
1175 /* next-hop-set */
1176 if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1177 #ifdef HAVE_IPV6
1178 || (p->family == AF_INET6 &&
1179 IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
1180 #endif /* HAVE_IPV6 */
1181 )
1182 {
1183 /* Set IPv4 nexthop. */
1184 if (p->family == AF_INET)
1185 {
1186 if (safi == SAFI_MPLS_VPN)
1187 memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
1188 IPV4_MAX_BYTELEN);
1189 else
1190 memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1191 }
1192 #ifdef HAVE_IPV6
1193 /* Set IPv6 nexthop. */
1194 if (p->family == AF_INET6)
1195 {
1196 /* IPv6 global nexthop must be included. */
1197 memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
1198 IPV6_MAX_BYTELEN);
1199 attr->extra->mp_nexthop_len = 16;
1200 }
1201 #endif /* HAVE_IPV6 */
1202 }
1203
1204 #ifdef HAVE_IPV6
1205 if (p->family == AF_INET6)
1206 {
1207 struct attr_extra *attre = attr->extra;
1208
1209 assert (attr->extra);
1210
1211 /* Left nexthop_local unchanged if so configured. */
1212 if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1213 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1214 {
1215 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1216 attre->mp_nexthop_len=32;
1217 else
1218 attre->mp_nexthop_len=16;
1219 }
1220
1221 /* Default nexthop_local treatment for RS-Clients */
1222 else
1223 {
1224 /* Announcer and RS-Client are both in the same network */
1225 if (rsclient->shared_network && from->shared_network &&
1226 (rsclient->ifindex == from->ifindex))
1227 {
1228 if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1229 attre->mp_nexthop_len=32;
1230 else
1231 attre->mp_nexthop_len=16;
1232 }
1233
1234 /* Set link-local address for shared network peer. */
1235 else if (rsclient->shared_network
1236 && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1237 {
1238 memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
1239 IPV6_MAX_BYTELEN);
1240 attre->mp_nexthop_len = 32;
1241 }
1242
1243 else
1244 attre->mp_nexthop_len = 16;
1245 }
1246
1247 }
1248 #endif /* HAVE_IPV6 */
1249
1250
1251 /* If this is EBGP peer and remove-private-AS is set. */
1252 if (peer_sort (rsclient) == BGP_PEER_EBGP
1253 && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1254 && aspath_private_as_check (attr->aspath))
1255 attr->aspath = aspath_empty_get ();
1256
1257 /* Route map & unsuppress-map apply. */
1258 if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
1259 {
1260 info.peer = rsclient;
1261 info.attr = attr;
1262
1263 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1264
1265 if (ri->extra && ri->extra->suppress)
1266 ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1267 else
1268 ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1269
1270 rsclient->rmap_type = 0;
1271
1272 if (ret == RMAP_DENYMATCH)
1273 {
1274 bgp_attr_flush (attr);
1275 return 0;
1276 }
1277 }
1278
1279 return 1;
1280 }
1281
1282 struct bgp_info_pair
1283 {
1284 struct bgp_info *old;
1285 struct bgp_info *new;
1286 };
1287
1288 static void
1289 bgp_best_selection (struct bgp *bgp, struct bgp_node *rn, struct bgp_info_pair *result)
1290 {
1291 struct bgp_info *new_select;
1292 struct bgp_info *old_select;
1293 struct bgp_info *ri;
1294 struct bgp_info *ri1;
1295 struct bgp_info *ri2;
1296 struct bgp_info *nextri = NULL;
1297
1298 /* bgp deterministic-med */
1299 new_select = NULL;
1300 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1301 for (ri1 = rn->info; ri1; ri1 = ri1->next)
1302 {
1303 if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1304 continue;
1305 if (BGP_INFO_HOLDDOWN (ri1))
1306 continue;
1307
1308 new_select = ri1;
1309 if (ri1->next)
1310 for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1311 {
1312 if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1313 continue;
1314 if (BGP_INFO_HOLDDOWN (ri2))
1315 continue;
1316
1317 if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1318 || aspath_cmp_left_confed (ri1->attr->aspath,
1319 ri2->attr->aspath))
1320 {
1321 if (bgp_info_cmp (bgp, ri2, new_select))
1322 {
1323 bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1324 new_select = ri2;
1325 }
1326
1327 bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
1328 }
1329 }
1330 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1331 bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1332 }
1333
1334 /* Check old selected route and new selected route. */
1335 old_select = NULL;
1336 new_select = NULL;
1337 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
1338 {
1339 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1340 old_select = ri;
1341
1342 if (BGP_INFO_HOLDDOWN (ri))
1343 {
1344 /* reap REMOVED routes, if needs be
1345 * selected route must stay for a while longer though
1346 */
1347 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1348 && (ri != old_select))
1349 bgp_info_reap (rn, ri);
1350
1351 continue;
1352 }
1353
1354 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1355 && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1356 {
1357 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1358 continue;
1359 }
1360 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1361 bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
1362
1363 if (bgp_info_cmp (bgp, ri, new_select))
1364 new_select = ri;
1365 }
1366
1367 result->old = old_select;
1368 result->new = new_select;
1369
1370 return;
1371 }
1372
1373 static int
1374 bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
1375 struct bgp_node *rn, afi_t afi, safi_t safi)
1376 {
1377 struct prefix *p;
1378 struct attr attr = { 0 };
1379
1380 p = &rn->p;
1381
1382 /* Announce route to Established peer. */
1383 if (peer->status != Established)
1384 return 0;
1385
1386 /* Address family configuration check. */
1387 if (! peer->afc_nego[afi][safi])
1388 return 0;
1389
1390 /* First update is deferred until ORF or ROUTE-REFRESH is received */
1391 if (CHECK_FLAG (peer->af_sflags[afi][safi],
1392 PEER_STATUS_ORF_WAIT_REFRESH))
1393 return 0;
1394
1395 switch (rn->table->type)
1396 {
1397 case BGP_TABLE_MAIN:
1398 /* Announcement to peer->conf. If the route is filtered,
1399 withdraw it. */
1400 if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1401 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1402 else
1403 bgp_adj_out_unset (rn, peer, p, afi, safi);
1404 break;
1405 case BGP_TABLE_RSCLIENT:
1406 /* Announcement to peer->conf. If the route is filtered,
1407 withdraw it. */
1408 if (selected &&
1409 bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1410 bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1411 else
1412 bgp_adj_out_unset (rn, peer, p, afi, safi);
1413 break;
1414 }
1415
1416 bgp_attr_extra_free (&attr);
1417
1418 return 0;
1419 }
1420
1421 struct bgp_process_queue
1422 {
1423 struct bgp *bgp;
1424 struct bgp_node *rn;
1425 afi_t afi;
1426 safi_t safi;
1427 };
1428
1429 static wq_item_status
1430 bgp_process_rsclient (struct work_queue *wq, void *data)
1431 {
1432 struct bgp_process_queue *pq = data;
1433 struct bgp *bgp = pq->bgp;
1434 struct bgp_node *rn = pq->rn;
1435 afi_t afi = pq->afi;
1436 safi_t safi = pq->safi;
1437 struct bgp_info *new_select;
1438 struct bgp_info *old_select;
1439 struct bgp_info_pair old_and_new;
1440 struct attr attr;
1441 struct listnode *node, *nnode;
1442 struct peer *rsclient = rn->table->owner;
1443
1444 memset (&attr, 0, sizeof (struct attr));
1445 /* Best path selection. */
1446 bgp_best_selection (bgp, rn, &old_and_new);
1447 new_select = old_and_new.new;
1448 old_select = old_and_new.old;
1449
1450 if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1451 {
1452 for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1453 {
1454 /* Nothing to do. */
1455 if (old_select && old_select == new_select)
1456 if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1457 continue;
1458
1459 if (old_select)
1460 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1461 if (new_select)
1462 {
1463 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1464 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1465 }
1466
1467 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
1468 }
1469 }
1470 else
1471 {
1472 if (old_select)
1473 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1474 if (new_select)
1475 {
1476 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1477 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1478 }
1479 bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
1480 }
1481
1482 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1483 bgp_info_reap (rn, old_select);
1484
1485 bgp_attr_extra_free (&attr);
1486
1487 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1488 return WQ_SUCCESS;
1489 }
1490
1491 static wq_item_status
1492 bgp_process_main (struct work_queue *wq, void *data)
1493 {
1494 struct bgp_process_queue *pq = data;
1495 struct bgp *bgp = pq->bgp;
1496 struct bgp_node *rn = pq->rn;
1497 afi_t afi = pq->afi;
1498 safi_t safi = pq->safi;
1499 struct prefix *p = &rn->p;
1500 struct bgp_info *new_select;
1501 struct bgp_info *old_select;
1502 struct bgp_info_pair old_and_new;
1503 struct listnode *node, *nnode;
1504 struct peer *peer;
1505
1506 /* Best path selection. */
1507 bgp_best_selection (bgp, rn, &old_and_new);
1508 old_select = old_and_new.old;
1509 new_select = old_and_new.new;
1510
1511 /* Nothing to do. */
1512 if (old_select && old_select == new_select)
1513 {
1514 if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1515 {
1516 if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
1517 bgp_zebra_announce (p, old_select, bgp);
1518
1519 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1520 return WQ_SUCCESS;
1521 }
1522 }
1523
1524 if (old_select)
1525 bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1526 if (new_select)
1527 {
1528 bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1529 bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1530 }
1531
1532
1533 /* Check each BGP peer. */
1534 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
1535 {
1536 bgp_process_announce_selected (peer, new_select, rn, afi, safi);
1537 }
1538
1539 /* FIB update. */
1540 if (safi == SAFI_UNICAST && ! bgp->name &&
1541 ! bgp_option_check (BGP_OPT_NO_FIB))
1542 {
1543 if (new_select
1544 && new_select->type == ZEBRA_ROUTE_BGP
1545 && new_select->sub_type == BGP_ROUTE_NORMAL)
1546 bgp_zebra_announce (p, new_select, bgp);
1547 else
1548 {
1549 /* Withdraw the route from the kernel. */
1550 if (old_select
1551 && old_select->type == ZEBRA_ROUTE_BGP
1552 && old_select->sub_type == BGP_ROUTE_NORMAL)
1553 bgp_zebra_withdraw (p, old_select);
1554 }
1555 }
1556
1557 /* Reap old select bgp_info, it it has been removed */
1558 if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1559 bgp_info_reap (rn, old_select);
1560
1561 UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1562 return WQ_SUCCESS;
1563 }
1564
1565 static void
1566 bgp_processq_del (struct work_queue *wq, void *data)
1567 {
1568 struct bgp_process_queue *pq = data;
1569
1570 bgp_unlock_node (pq->rn);
1571 XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1572 }
1573
1574 static void
1575 bgp_process_queue_init (void)
1576 {
1577 bm->process_main_queue
1578 = work_queue_new (bm->master, "process_main_queue");
1579 bm->process_rsclient_queue
1580 = work_queue_new (bm->master, "process_rsclient_queue");
1581
1582 if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1583 {
1584 zlog_err ("%s: Failed to allocate work queue", __func__);
1585 exit (1);
1586 }
1587
1588 bm->process_main_queue->spec.workfunc = &bgp_process_main;
1589 bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
1590 bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
1591 bm->process_rsclient_queue->spec.del_item_data
1592 = bm->process_main_queue->spec.del_item_data;
1593 bm->process_main_queue->spec.max_retries
1594 = bm->process_main_queue->spec.max_retries = 0;
1595 bm->process_rsclient_queue->spec.hold
1596 = bm->process_main_queue->spec.hold = 50;
1597 }
1598
1599 void
1600 bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1601 {
1602 struct bgp_process_queue *pqnode;
1603
1604 /* already scheduled for processing? */
1605 if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1606 return;
1607
1608 if ( (bm->process_main_queue == NULL) ||
1609 (bm->process_rsclient_queue == NULL) )
1610 bgp_process_queue_init ();
1611
1612 pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1613 sizeof (struct bgp_process_queue));
1614 if (!pqnode)
1615 return;
1616
1617 pqnode->rn = bgp_lock_node (rn); /* unlocked by bgp_processq_del */
1618 pqnode->bgp = bgp;
1619 pqnode->afi = afi;
1620 pqnode->safi = safi;
1621
1622 switch (rn->table->type)
1623 {
1624 case BGP_TABLE_MAIN:
1625 work_queue_add (bm->process_main_queue, pqnode);
1626 break;
1627 case BGP_TABLE_RSCLIENT:
1628 work_queue_add (bm->process_rsclient_queue, pqnode);
1629 break;
1630 }
1631
1632 return;
1633 }
1634
1635 static int
1636 bgp_maximum_prefix_restart_timer (struct thread *thread)
1637 {
1638 struct peer *peer;
1639
1640 peer = THREAD_ARG (thread);
1641 peer->t_pmax_restart = NULL;
1642
1643 if (BGP_DEBUG (events, EVENTS))
1644 zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1645 peer->host);
1646
1647 peer_clear (peer);
1648
1649 return 0;
1650 }
1651
1652 int
1653 bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1654 safi_t safi, int always)
1655 {
1656 if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1657 return 0;
1658
1659 if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
1660 {
1661 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1662 && ! always)
1663 return 0;
1664
1665 zlog (peer->log, LOG_INFO,
1666 "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1667 "limit %ld", afi_safi_print (afi, safi), peer->host,
1668 peer->pcount[afi][safi], peer->pmax[afi][safi]);
1669 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1670
1671 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1672 return 0;
1673
1674 {
1675 u_int8_t ndata[7];
1676
1677 if (safi == SAFI_MPLS_VPN)
1678 safi = BGP_SAFI_VPNV4;
1679
1680 ndata[0] = (afi >> 8);
1681 ndata[1] = afi;
1682 ndata[2] = safi;
1683 ndata[3] = (peer->pmax[afi][safi] >> 24);
1684 ndata[4] = (peer->pmax[afi][safi] >> 16);
1685 ndata[5] = (peer->pmax[afi][safi] >> 8);
1686 ndata[6] = (peer->pmax[afi][safi]);
1687
1688 SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1689 bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1690 BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1691 }
1692
1693 /* restart timer start */
1694 if (peer->pmax_restart[afi][safi])
1695 {
1696 peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1697
1698 if (BGP_DEBUG (events, EVENTS))
1699 zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1700 peer->host, peer->v_pmax_restart);
1701
1702 BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1703 peer->v_pmax_restart);
1704 }
1705
1706 return 1;
1707 }
1708 else
1709 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1710
1711 if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1712 {
1713 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1714 && ! always)
1715 return 0;
1716
1717 zlog (peer->log, LOG_INFO,
1718 "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1719 afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1720 peer->pmax[afi][safi]);
1721 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1722 }
1723 else
1724 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1725 return 0;
1726 }
1727
1728 /* Unconditionally remove the route from the RIB, without taking
1729 * damping into consideration (eg, because the session went down)
1730 */
1731 static void
1732 bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1733 afi_t afi, safi_t safi)
1734 {
1735 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1736
1737 if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1738 bgp_info_delete (rn, ri); /* keep historical info */
1739
1740 bgp_process (peer->bgp, rn, afi, safi);
1741 }
1742
1743 static void
1744 bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1745 afi_t afi, safi_t safi)
1746 {
1747 int status = BGP_DAMP_NONE;
1748
1749 /* apply dampening, if result is suppressed, we'll be retaining
1750 * the bgp_info in the RIB for historical reference.
1751 */
1752 if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1753 && peer_sort (peer) == BGP_PEER_EBGP)
1754 if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1755 == BGP_DAMP_SUPPRESSED)
1756 {
1757 bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1758 return;
1759 }
1760
1761 bgp_rib_remove (rn, ri, peer, afi, safi);
1762 }
1763
1764 static void
1765 bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1766 struct attr *attr, struct peer *peer, struct prefix *p, int type,
1767 int sub_type, struct prefix_rd *prd, u_char *tag)
1768 {
1769 struct bgp_node *rn;
1770 struct bgp *bgp;
1771 struct attr new_attr = { 0 };
1772 struct attr *attr_new;
1773 struct attr *attr_new2;
1774 struct bgp_info *ri;
1775 struct bgp_info *new;
1776 const char *reason;
1777 char buf[SU_ADDRSTRLEN];
1778
1779 //memset (new_attr, 0, sizeof (struct attr));
1780
1781 /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1782 if (peer == rsclient)
1783 return;
1784
1785 bgp = peer->bgp;
1786 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1787
1788 /* Check previously received route. */
1789 for (ri = rn->info; ri; ri = ri->next)
1790 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1791 break;
1792
1793 /* AS path loop check. */
1794 if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1795 {
1796 reason = "as-path contains our own AS;";
1797 goto filtered;
1798 }
1799
1800 /* Route reflector originator ID check. */
1801 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
1802 && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
1803 {
1804 reason = "originator is us;";
1805 goto filtered;
1806 }
1807
1808 bgp_attr_dup (&new_attr, attr);
1809
1810 /* Apply export policy. */
1811 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1812 bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1813 {
1814 reason = "export-policy;";
1815 goto filtered;
1816 }
1817
1818 attr_new2 = bgp_attr_intern (&new_attr);
1819
1820 /* Apply import policy. */
1821 if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1822 {
1823 bgp_attr_unintern (attr_new2);
1824
1825 reason = "import-policy;";
1826 goto filtered;
1827 }
1828
1829 attr_new = bgp_attr_intern (&new_attr);
1830 bgp_attr_unintern (attr_new2);
1831
1832 /* IPv4 unicast next hop check. */
1833 if (afi == AFI_IP && safi == SAFI_UNICAST)
1834 {
1835 /* Next hop must not be 0.0.0.0 nor Class E address. */
1836 if (new_attr.nexthop.s_addr == 0
1837 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
1838 {
1839 bgp_attr_unintern (attr_new);
1840
1841 reason = "martian next-hop;";
1842 goto filtered;
1843 }
1844 }
1845
1846 /* new_attr isn't passed to any functions after here */
1847 bgp_attr_extra_free (&new_attr);
1848
1849 /* If the update is implicit withdraw. */
1850 if (ri)
1851 {
1852 ri->uptime = time (NULL);
1853
1854 /* Same attribute comes in. */
1855 if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1856 && attrhash_cmp (ri->attr, attr_new))
1857 {
1858
1859 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1860
1861 if (BGP_DEBUG (update, UPDATE_IN))
1862 zlog (peer->log, LOG_DEBUG,
1863 "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1864 peer->host,
1865 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1866 p->prefixlen, rsclient->host);
1867
1868 bgp_unlock_node (rn);
1869 bgp_attr_unintern (attr_new);
1870
1871 return;
1872 }
1873
1874 /* Withdraw/Announce before we fully processed the withdraw */
1875 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1876 bgp_info_restore (rn, ri);
1877
1878 /* Received Logging. */
1879 if (BGP_DEBUG (update, UPDATE_IN))
1880 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1881 peer->host,
1882 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1883 p->prefixlen, rsclient->host);
1884
1885 /* The attribute is changed. */
1886 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1887
1888 /* Update to new attribute. */
1889 bgp_attr_unintern (ri->attr);
1890 ri->attr = attr_new;
1891
1892 /* Update MPLS tag. */
1893 if (safi == SAFI_MPLS_VPN)
1894 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
1895
1896 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
1897
1898 /* Process change. */
1899 bgp_process (bgp, rn, afi, safi);
1900 bgp_unlock_node (rn);
1901
1902 return;
1903 }
1904
1905 /* Received Logging. */
1906 if (BGP_DEBUG (update, UPDATE_IN))
1907 {
1908 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1909 peer->host,
1910 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1911 p->prefixlen, rsclient->host);
1912 }
1913
1914 /* Make new BGP info. */
1915 new = bgp_info_new ();
1916 new->type = type;
1917 new->sub_type = sub_type;
1918 new->peer = peer;
1919 new->attr = attr_new;
1920 new->uptime = time (NULL);
1921
1922 /* Update MPLS tag. */
1923 if (safi == SAFI_MPLS_VPN)
1924 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
1925
1926 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
1927
1928 /* Register new BGP information. */
1929 bgp_info_add (rn, new);
1930
1931 /* route_node_get lock */
1932 bgp_unlock_node (rn);
1933
1934 /* Process change. */
1935 bgp_process (bgp, rn, afi, safi);
1936
1937 bgp_attr_extra_free (&new_attr);
1938
1939 return;
1940
1941 filtered:
1942
1943 /* This BGP update is filtered. Log the reason then update BGP entry. */
1944 if (BGP_DEBUG (update, UPDATE_IN))
1945 zlog (peer->log, LOG_DEBUG,
1946 "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
1947 peer->host,
1948 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1949 p->prefixlen, rsclient->host, reason);
1950
1951 if (ri)
1952 bgp_rib_remove (rn, ri, peer, afi, safi);
1953
1954 bgp_unlock_node (rn);
1955
1956 if (new_attr.extra)
1957 bgp_attr_extra_free (&new_attr);
1958
1959 return;
1960 }
1961
1962 static void
1963 bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1964 struct peer *peer, struct prefix *p, int type, int sub_type,
1965 struct prefix_rd *prd, u_char *tag)
1966 {
1967 struct bgp_node *rn;
1968 struct bgp_info *ri;
1969 char buf[SU_ADDRSTRLEN];
1970
1971 if (rsclient == peer)
1972 return;
1973
1974 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1975
1976 /* Lookup withdrawn route. */
1977 for (ri = rn->info; ri; ri = ri->next)
1978 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1979 break;
1980
1981 /* Withdraw specified route from routing table. */
1982 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1983 bgp_rib_withdraw (rn, ri, peer, afi, safi);
1984 else if (BGP_DEBUG (update, UPDATE_IN))
1985 zlog (peer->log, LOG_DEBUG,
1986 "%s Can't find the route %s/%d", peer->host,
1987 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1988 p->prefixlen);
1989
1990 /* Unlock bgp_node_get() lock. */
1991 bgp_unlock_node (rn);
1992 }
1993
1994 static int
1995 bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
1996 afi_t afi, safi_t safi, int type, int sub_type,
1997 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
1998 {
1999 int ret;
2000 int aspath_loop_count = 0;
2001 struct bgp_node *rn;
2002 struct bgp *bgp;
2003 struct attr new_attr = { 0 };
2004 struct attr *attr_new;
2005 struct bgp_info *ri;
2006 struct bgp_info *new;
2007 const char *reason;
2008 char buf[SU_ADDRSTRLEN];
2009
2010 bgp = peer->bgp;
2011 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2012
2013 /* When peer's soft reconfiguration enabled. Record input packet in
2014 Adj-RIBs-In. */
2015 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2016 && peer != bgp->peer_self && ! soft_reconfig)
2017 bgp_adj_in_set (rn, peer, attr);
2018
2019 /* Check previously received route. */
2020 for (ri = rn->info; ri; ri = ri->next)
2021 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2022 break;
2023
2024 /* AS path local-as loop check. */
2025 if (peer->change_local_as)
2026 {
2027 if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2028 aspath_loop_count = 1;
2029
2030 if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2031 {
2032 reason = "as-path contains our own AS;";
2033 goto filtered;
2034 }
2035 }
2036
2037 /* AS path loop check. */
2038 if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2039 || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2040 && aspath_loop_check(attr->aspath, bgp->confed_id)
2041 > peer->allowas_in[afi][safi]))
2042 {
2043 reason = "as-path contains our own AS;";
2044 goto filtered;
2045 }
2046
2047 /* Route reflector originator ID check. */
2048 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
2049 && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
2050 {
2051 reason = "originator is us;";
2052 goto filtered;
2053 }
2054
2055 /* Route reflector cluster ID check. */
2056 if (bgp_cluster_filter (peer, attr))
2057 {
2058 reason = "reflected from the same cluster;";
2059 goto filtered;
2060 }
2061
2062 /* Apply incoming filter. */
2063 if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2064 {
2065 reason = "filter;";
2066 goto filtered;
2067 }
2068
2069 /* Apply incoming route-map. */
2070 bgp_attr_dup (&new_attr, attr);
2071
2072 if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2073 {
2074 reason = "route-map;";
2075 goto filtered;
2076 }
2077
2078 /* IPv4 unicast next hop check. */
2079 if (afi == AFI_IP && safi == SAFI_UNICAST)
2080 {
2081 /* If the peer is EBGP and nexthop is not on connected route,
2082 discard it. */
2083 if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
2084 && ! bgp_nexthop_check_ebgp (afi, &new_attr)
2085 && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
2086 {
2087 reason = "non-connected next-hop;";
2088 goto filtered;
2089 }
2090
2091 /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
2092 must not be my own address. */
2093 if (bgp_nexthop_self (afi, &new_attr)
2094 || new_attr.nexthop.s_addr == 0
2095 || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
2096 {
2097 reason = "martian next-hop;";
2098 goto filtered;
2099 }
2100 }
2101
2102 attr_new = bgp_attr_intern (&new_attr);
2103
2104 /* If the update is implicit withdraw. */
2105 if (ri)
2106 {
2107 ri->uptime = time (NULL);
2108
2109 /* Same attribute comes in. */
2110 if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2111 && attrhash_cmp (ri->attr, attr_new))
2112 {
2113 bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2114
2115 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2116 && peer_sort (peer) == BGP_PEER_EBGP
2117 && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2118 {
2119 if (BGP_DEBUG (update, UPDATE_IN))
2120 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2121 peer->host,
2122 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2123 p->prefixlen);
2124
2125 if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2126 {
2127 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2128 bgp_process (bgp, rn, afi, safi);
2129 }
2130 }
2131 else /* Duplicate - odd */
2132 {
2133 if (BGP_DEBUG (update, UPDATE_IN))
2134 zlog (peer->log, LOG_DEBUG,
2135 "%s rcvd %s/%d...duplicate ignored",
2136 peer->host,
2137 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2138 p->prefixlen);
2139
2140 /* graceful restart STALE flag unset. */
2141 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2142 {
2143 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2144 bgp_process (bgp, rn, afi, safi);
2145 }
2146 }
2147
2148 bgp_unlock_node (rn);
2149 bgp_attr_unintern (attr_new);
2150 bgp_attr_extra_free (&new_attr);
2151
2152 return 0;
2153 }
2154
2155 /* Withdraw/Announce before we fully processed the withdraw */
2156 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2157 {
2158 if (BGP_DEBUG (update, UPDATE_IN))
2159 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2160 peer->host,
2161 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2162 p->prefixlen);
2163 bgp_info_restore (rn, ri);
2164 }
2165
2166 /* Received Logging. */
2167 if (BGP_DEBUG (update, UPDATE_IN))
2168 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2169 peer->host,
2170 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2171 p->prefixlen);
2172
2173 /* graceful restart STALE flag unset. */
2174 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2175 bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2176
2177 /* The attribute is changed. */
2178 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2179
2180 /* implicit withdraw, decrement aggregate and pcount here.
2181 * only if update is accepted, they'll increment below.
2182 */
2183 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2184
2185 /* Update bgp route dampening information. */
2186 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2187 && peer_sort (peer) == BGP_PEER_EBGP)
2188 {
2189 /* This is implicit withdraw so we should update dampening
2190 information. */
2191 if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2192 bgp_damp_withdraw (ri, rn, afi, safi, 1);
2193 }
2194
2195 /* Update to new attribute. */
2196 bgp_attr_unintern (ri->attr);
2197 ri->attr = attr_new;
2198
2199 /* Update MPLS tag. */
2200 if (safi == SAFI_MPLS_VPN)
2201 memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
2202
2203 /* Update bgp route dampening information. */
2204 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2205 && peer_sort (peer) == BGP_PEER_EBGP)
2206 {
2207 /* Now we do normal update dampening. */
2208 ret = bgp_damp_update (ri, rn, afi, safi);
2209 if (ret == BGP_DAMP_SUPPRESSED)
2210 {
2211 bgp_unlock_node (rn);
2212 bgp_attr_extra_free (&new_attr);
2213 return 0;
2214 }
2215 }
2216
2217 /* Nexthop reachability check. */
2218 if ((afi == AFI_IP || afi == AFI_IP6)
2219 && safi == SAFI_UNICAST
2220 && (peer_sort (peer) == BGP_PEER_IBGP
2221 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2222 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2223 {
2224 if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
2225 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2226 else
2227 bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
2228 }
2229 else
2230 bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2231
2232 /* Process change. */
2233 bgp_aggregate_increment (bgp, p, ri, afi, safi);
2234
2235 bgp_process (bgp, rn, afi, safi);
2236 bgp_unlock_node (rn);
2237 bgp_attr_extra_free (&new_attr);
2238
2239 return 0;
2240 }
2241
2242 /* Received Logging. */
2243 if (BGP_DEBUG (update, UPDATE_IN))
2244 {
2245 zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2246 peer->host,
2247 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2248 p->prefixlen);
2249 }
2250
2251 /* Make new BGP info. */
2252 new = bgp_info_new ();
2253 new->type = type;
2254 new->sub_type = sub_type;
2255 new->peer = peer;
2256 new->attr = attr_new;
2257 new->uptime = time (NULL);
2258
2259 /* Update MPLS tag. */
2260 if (safi == SAFI_MPLS_VPN)
2261 memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
2262
2263 /* Nexthop reachability check. */
2264 if ((afi == AFI_IP || afi == AFI_IP6)
2265 && safi == SAFI_UNICAST
2266 && (peer_sort (peer) == BGP_PEER_IBGP
2267 || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2268 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2269 {
2270 if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
2271 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2272 else
2273 bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
2274 }
2275 else
2276 bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2277
2278 /* Increment prefix */
2279 bgp_aggregate_increment (bgp, p, new, afi, safi);
2280
2281 /* Register new BGP information. */
2282 bgp_info_add (rn, new);
2283
2284 /* route_node_get lock */
2285 bgp_unlock_node (rn);
2286
2287 bgp_attr_extra_free (&new_attr);
2288
2289 /* If maximum prefix count is configured and current prefix
2290 count exeed it. */
2291 if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2292 return -1;
2293
2294 /* Process change. */
2295 bgp_process (bgp, rn, afi, safi);
2296
2297 return 0;
2298
2299 /* This BGP update is filtered. Log the reason then update BGP
2300 entry. */
2301 filtered:
2302 if (BGP_DEBUG (update, UPDATE_IN))
2303 zlog (peer->log, LOG_DEBUG,
2304 "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2305 peer->host,
2306 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2307 p->prefixlen, reason);
2308
2309 if (ri)
2310 bgp_rib_remove (rn, ri, peer, afi, safi);
2311
2312 bgp_unlock_node (rn);
2313
2314 bgp_attr_extra_free (&new_attr);
2315
2316 return 0;
2317 }
2318
2319 int
2320 bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2321 afi_t afi, safi_t safi, int type, int sub_type,
2322 struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2323 {
2324 struct peer *rsclient;
2325 struct listnode *node, *nnode;
2326 struct bgp *bgp;
2327 int ret;
2328
2329 ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2330 soft_reconfig);
2331
2332 bgp = peer->bgp;
2333
2334 /* Process the update for each RS-client. */
2335 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2336 {
2337 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2338 bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2339 sub_type, prd, tag);
2340 }
2341
2342 return ret;
2343 }
2344
2345 int
2346 bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
2347 afi_t afi, safi_t safi, int type, int sub_type,
2348 struct prefix_rd *prd, u_char *tag)
2349 {
2350 struct bgp *bgp;
2351 char buf[SU_ADDRSTRLEN];
2352 struct bgp_node *rn;
2353 struct bgp_info *ri;
2354 struct peer *rsclient;
2355 struct listnode *node, *nnode;
2356
2357 bgp = peer->bgp;
2358
2359 /* Process the withdraw for each RS-client. */
2360 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2361 {
2362 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2363 bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2364 }
2365
2366 /* Logging. */
2367 if (BGP_DEBUG (update, UPDATE_IN))
2368 zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
2369 peer->host,
2370 inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2371 p->prefixlen);
2372
2373 /* Lookup node. */
2374 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2375
2376 /* If peer is soft reconfiguration enabled. Record input packet for
2377 further calculation. */
2378 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2379 && peer != bgp->peer_self)
2380 bgp_adj_in_unset (rn, peer);
2381
2382 /* Lookup withdrawn route. */
2383 for (ri = rn->info; ri; ri = ri->next)
2384 if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2385 break;
2386
2387 /* Withdraw specified route from routing table. */
2388 if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2389 bgp_rib_withdraw (rn, ri, peer, afi, safi);
2390 else if (BGP_DEBUG (update, UPDATE_IN))
2391 zlog (peer->log, LOG_DEBUG,
2392 "%s Can't find the route %s/%d", peer->host,
2393 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2394 p->prefixlen);
2395
2396 /* Unlock bgp_node_get() lock. */
2397 bgp_unlock_node (rn);
2398
2399 return 0;
2400 }
2401 \f
2402 void
2403 bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2404 {
2405 struct bgp *bgp;
2406 struct attr attr;
2407 struct aspath *aspath = { 0 };
2408 struct prefix p;
2409 struct bgp_info binfo;
2410 struct peer *from;
2411 int ret = RMAP_DENYMATCH;
2412
2413 if (!(afi == AFI_IP || afi == AFI_IP6))
2414 return;
2415
2416 bgp = peer->bgp;
2417 from = bgp->peer_self;
2418
2419 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2420 aspath = attr.aspath;
2421 attr.local_pref = bgp->default_local_pref;
2422 memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2423
2424 if (afi == AFI_IP)
2425 str2prefix ("0.0.0.0/0", &p);
2426 #ifdef HAVE_IPV6
2427 else if (afi == AFI_IP6)
2428 {
2429 struct attr_extra *ae;
2430 attr.extra = NULL;
2431
2432 ae = bgp_attr_extra_get (&attr);
2433 attr.extra = ae;
2434
2435 str2prefix ("::/0", &p);
2436
2437 /* IPv6 global nexthop must be included. */
2438 memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
2439 IPV6_MAX_BYTELEN);
2440 ae->mp_nexthop_len = 16;
2441
2442 /* If the peer is on shared nextwork and we have link-local
2443 nexthop set it. */
2444 if (peer->shared_network
2445 && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2446 {
2447 memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
2448 IPV6_MAX_BYTELEN);
2449 ae->mp_nexthop_len = 32;
2450 }
2451 }
2452 #endif /* HAVE_IPV6 */
2453
2454 if (peer->default_rmap[afi][safi].name)
2455 {
2456 binfo.peer = bgp->peer_self;
2457 binfo.attr = &attr;
2458
2459 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2460
2461 ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2462 RMAP_BGP, &binfo);
2463
2464 bgp->peer_self->rmap_type = 0;
2465
2466 if (ret == RMAP_DENYMATCH)
2467 {
2468 bgp_attr_flush (&attr);
2469 withdraw = 1;
2470 }
2471 }
2472
2473 if (withdraw)
2474 {
2475 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2476 bgp_default_withdraw_send (peer, afi, safi);
2477 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2478 }
2479 else
2480 {
2481 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2482 bgp_default_update_send (peer, &attr, afi, safi, from);
2483 }
2484
2485 bgp_attr_extra_free (&attr);
2486 aspath_unintern (aspath);
2487 }
2488 \f
2489 static void
2490 bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
2491 struct bgp_table *table, int rsclient)
2492 {
2493 struct bgp_node *rn;
2494 struct bgp_info *ri;
2495 struct attr attr;
2496
2497 memset (&attr, 0, sizeof (struct attr));
2498
2499 if (! table)
2500 table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
2501
2502 if (safi != SAFI_MPLS_VPN
2503 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2504 bgp_default_originate (peer, afi, safi, 0);
2505
2506 for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2507 for (ri = rn->info; ri; ri = ri->next)
2508 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2509 {
2510 if ( (rsclient) ?
2511 (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2512 : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
2513 bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2514 else
2515 bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
2516
2517 bgp_attr_extra_free (&attr);
2518 }
2519 }
2520
2521 void
2522 bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2523 {
2524 struct bgp_node *rn;
2525 struct bgp_table *table;
2526
2527 if (peer->status != Established)
2528 return;
2529
2530 if (! peer->afc_nego[afi][safi])
2531 return;
2532
2533 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2534 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2535 return;
2536
2537 if (safi != SAFI_MPLS_VPN)
2538 bgp_announce_table (peer, afi, safi, NULL, 0);
2539 else
2540 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2541 rn = bgp_route_next(rn))
2542 if ((table = (rn->info)) != NULL)
2543 bgp_announce_table (peer, afi, safi, table, 0);
2544
2545 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2546 bgp_announce_table (peer, afi, safi, NULL, 1);
2547 }
2548
2549 void
2550 bgp_announce_route_all (struct peer *peer)
2551 {
2552 afi_t afi;
2553 safi_t safi;
2554
2555 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2556 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2557 bgp_announce_route (peer, afi, safi);
2558 }
2559 \f
2560 static void
2561 bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2562 safi_t safi, struct bgp_table *table)
2563 {
2564 struct bgp_node *rn;
2565 struct bgp_adj_in *ain;
2566
2567 if (! table)
2568 table = rsclient->bgp->rib[afi][safi];
2569
2570 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2571 for (ain = rn->adj_in; ain; ain = ain->next)
2572 {
2573 bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2574 &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2575 }
2576 }
2577
2578 void
2579 bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2580 {
2581 struct bgp_table *table;
2582 struct bgp_node *rn;
2583
2584 if (safi != SAFI_MPLS_VPN)
2585 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2586
2587 else
2588 for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2589 rn = bgp_route_next (rn))
2590 if ((table = rn->info) != NULL)
2591 bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2592 }
2593 \f
2594 static void
2595 bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2596 struct bgp_table *table)
2597 {
2598 int ret;
2599 struct bgp_node *rn;
2600 struct bgp_adj_in *ain;
2601
2602 if (! table)
2603 table = peer->bgp->rib[afi][safi];
2604
2605 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2606 for (ain = rn->adj_in; ain; ain = ain->next)
2607 {
2608 if (ain->peer == peer)
2609 {
2610 ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2611 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2612 NULL, NULL, 1);
2613 if (ret < 0)
2614 {
2615 bgp_unlock_node (rn);
2616 return;
2617 }
2618 continue;
2619 }
2620 }
2621 }
2622
2623 void
2624 bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2625 {
2626 struct bgp_node *rn;
2627 struct bgp_table *table;
2628
2629 if (peer->status != Established)
2630 return;
2631
2632 if (safi != SAFI_MPLS_VPN)
2633 bgp_soft_reconfig_table (peer, afi, safi, NULL);
2634 else
2635 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2636 rn = bgp_route_next (rn))
2637 if ((table = rn->info) != NULL)
2638 bgp_soft_reconfig_table (peer, afi, safi, table);
2639 }
2640 \f
2641 static wq_item_status
2642 bgp_clear_route_node (struct work_queue *wq, void *data)
2643 {
2644 struct bgp_node *rn = data;
2645 struct peer *peer = wq->spec.data;
2646 struct bgp_info *ri;
2647 afi_t afi = rn->table->afi;
2648 safi_t safi = rn->table->safi;
2649
2650 assert (rn && peer);
2651
2652 for (ri = rn->info; ri; ri = ri->next)
2653 if (ri->peer == peer)
2654 {
2655 /* graceful restart STALE flag set. */
2656 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2657 && peer->nsf[afi][safi]
2658 && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
2659 && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2660 bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
2661 else
2662 bgp_rib_remove (rn, ri, peer, afi, safi);
2663 break;
2664 }
2665 return WQ_SUCCESS;
2666 }
2667
2668 static void
2669 bgp_clear_node_queue_del (struct work_queue *wq, void *data)
2670 {
2671 struct bgp_node *rn = data;
2672
2673 bgp_unlock_node (rn);
2674 }
2675
2676 static void
2677 bgp_clear_node_complete (struct work_queue *wq)
2678 {
2679 struct peer *peer = wq->spec.data;
2680
2681 peer_unlock (peer); /* bgp_clear_node_complete */
2682
2683 /* Tickle FSM to start moving again */
2684 BGP_EVENT_ADD (peer, Clearing_Completed);
2685 }
2686
2687 static void
2688 bgp_clear_node_queue_init (struct peer *peer)
2689 {
2690 #define CLEAR_QUEUE_NAME_LEN 26 /* "clear 2001:123:123:123::1" */
2691 char wname[CLEAR_QUEUE_NAME_LEN];
2692
2693 snprintf (wname, CLEAR_QUEUE_NAME_LEN, "clear %s", peer->host);
2694 #undef CLEAR_QUEUE_NAME_LEN
2695
2696 if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
2697 {
2698 zlog_err ("%s: Failed to allocate work queue", __func__);
2699 exit (1);
2700 }
2701 peer->clear_node_queue->spec.hold = 10;
2702 peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2703 peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2704 peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2705 peer->clear_node_queue->spec.max_retries = 0;
2706
2707 /* we only 'lock' this peer reference when the queue is actually active */
2708 peer->clear_node_queue->spec.data = peer;
2709 }
2710
2711 static void
2712 bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
2713 struct bgp_table *table, struct peer *rsclient)
2714 {
2715 struct bgp_node *rn;
2716
2717
2718 if (! table)
2719 table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
2720
2721 /* If still no table => afi/safi isn't configured at all or smth. */
2722 if (! table)
2723 return;
2724
2725 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2726 {
2727 struct bgp_info *ri;
2728 struct bgp_adj_in *ain;
2729 struct bgp_adj_out *aout;
2730
2731 if (rn->info == NULL)
2732 continue;
2733
2734 /* XXX:TODO: This is suboptimal, every non-empty route_node is
2735 * queued for every clearing peer, regardless of whether it is
2736 * relevant to the peer at hand.
2737 *
2738 * Overview: There are 3 different indices which need to be
2739 * scrubbed, potentially, when a peer is removed:
2740 *
2741 * 1 peer's routes visible via the RIB (ie accepted routes)
2742 * 2 peer's routes visible by the (optional) peer's adj-in index
2743 * 3 other routes visible by the peer's adj-out index
2744 *
2745 * 3 there is no hurry in scrubbing, once the struct peer is
2746 * removed from bgp->peer, we could just GC such deleted peer's
2747 * adj-outs at our leisure.
2748 *
2749 * 1 and 2 must be 'scrubbed' in some way, at least made
2750 * invisible via RIB index before peer session is allowed to be
2751 * brought back up. So one needs to know when such a 'search' is
2752 * complete.
2753 *
2754 * Ideally:
2755 *
2756 * - there'd be a single global queue or a single RIB walker
2757 * - rather than tracking which route_nodes still need to be
2758 * examined on a peer basis, we'd track which peers still
2759 * aren't cleared
2760 *
2761 * Given that our per-peer prefix-counts now should be reliable,
2762 * this may actually be achievable. It doesn't seem to be a huge
2763 * problem at this time,
2764 */
2765 for (ri = rn->info; ri; ri = ri->next)
2766 if (ri->peer == peer)
2767 {
2768 bgp_lock_node (rn); /* unlocked: bgp_clear_node_queue_del */
2769 work_queue_add (peer->clear_node_queue, rn);
2770 }
2771
2772 for (ain = rn->adj_in; ain; ain = ain->next)
2773 if (ain->peer == peer)
2774 {
2775 bgp_adj_in_remove (rn, ain);
2776 bgp_unlock_node (rn);
2777 break;
2778 }
2779 for (aout = rn->adj_out; aout; aout = aout->next)
2780 if (aout->peer == peer)
2781 {
2782 bgp_adj_out_remove (rn, aout, peer, afi, safi);
2783 bgp_unlock_node (rn);
2784 break;
2785 }
2786 }
2787 return;
2788 }
2789
2790 void
2791 bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi)
2792 {
2793 struct bgp_node *rn;
2794 struct bgp_table *table;
2795 struct peer *rsclient;
2796 struct listnode *node, *nnode;
2797
2798 if (peer->clear_node_queue == NULL)
2799 bgp_clear_node_queue_init (peer);
2800
2801 /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2802 * Idle until it receives a Clearing_Completed event. This protects
2803 * against peers which flap faster than we can we clear, which could
2804 * lead to:
2805 *
2806 * a) race with routes from the new session being installed before
2807 * clear_route_node visits the node (to delete the route of that
2808 * peer)
2809 * b) resource exhaustion, clear_route_node likely leads to an entry
2810 * on the process_main queue. Fast-flapping could cause that queue
2811 * to grow and grow.
2812 */
2813 if (!peer->clear_node_queue->thread)
2814 peer_lock (peer); /* bgp_clear_node_complete */
2815
2816 if (safi != SAFI_MPLS_VPN)
2817 bgp_clear_route_table (peer, afi, safi, NULL, NULL);
2818 else
2819 for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2820 rn = bgp_route_next (rn))
2821 if ((table = rn->info) != NULL)
2822 bgp_clear_route_table (peer, afi, safi, table, NULL);
2823
2824 for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2825 {
2826 if (CHECK_FLAG(rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2827 bgp_clear_route_table (peer, afi, safi, NULL, rsclient);
2828 }
2829
2830 /* If no routes were cleared, nothing was added to workqueue, the
2831 * completion function won't be run by workqueue code - call it here.
2832 * XXX: Actually, this assumption doesn't hold, see
2833 * bgp_clear_route_table(), we queue all non-empty nodes.
2834 *
2835 * Additionally, there is a presumption in FSM that clearing is only
2836 * really needed if peer state is Established - peers in
2837 * pre-Established states shouldn't have any route-update state
2838 * associated with them (in or out).
2839 *
2840 * We still can get here in pre-Established though, through
2841 * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2842 * check to ensure the assumption above holds.
2843 *
2844 * At some future point, this check could be move to the top of the
2845 * function, and do a quick early-return when state is
2846 * pre-Established, avoiding above list and table scans. Once we're
2847 * sure it is safe..
2848 */
2849 if (!peer->clear_node_queue->thread)
2850 bgp_clear_node_complete (peer->clear_node_queue);
2851 else
2852 {
2853 /* clearing queue scheduled. Normal if in Established state
2854 * (and about to transition out of it), but otherwise...
2855 */
2856 if (peer->status != Established)
2857 {
2858 plog_err (peer->log, "%s [Error] State %s is not Established,"
2859 " but routes were cleared - bug!",
2860 peer->host, LOOKUP (bgp_status_msg, peer->status));
2861 assert (peer->status == Established);
2862 }
2863 }
2864 }
2865
2866 void
2867 bgp_clear_route_all (struct peer *peer)
2868 {
2869 afi_t afi;
2870 safi_t safi;
2871
2872 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2873 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2874 bgp_clear_route (peer, afi, safi);
2875 }
2876
2877 void
2878 bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2879 {
2880 struct bgp_table *table;
2881 struct bgp_node *rn;
2882 struct bgp_adj_in *ain;
2883
2884 table = peer->bgp->rib[afi][safi];
2885
2886 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2887 for (ain = rn->adj_in; ain ; ain = ain->next)
2888 if (ain->peer == peer)
2889 {
2890 bgp_adj_in_remove (rn, ain);
2891 bgp_unlock_node (rn);
2892 break;
2893 }
2894 }
2895
2896 void
2897 bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2898 {
2899 struct bgp_node *rn;
2900 struct bgp_info *ri;
2901 struct bgp_table *table;
2902
2903 table = peer->bgp->rib[afi][safi];
2904
2905 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2906 {
2907 for (ri = rn->info; ri; ri = ri->next)
2908 if (ri->peer == peer)
2909 {
2910 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2911 bgp_rib_remove (rn, ri, peer, afi, safi);
2912 break;
2913 }
2914 }
2915 }
2916 \f
2917 /* Delete all kernel routes. */
2918 void
2919 bgp_cleanup_routes ()
2920 {
2921 struct bgp *bgp;
2922 struct listnode *node, *nnode;
2923 struct bgp_node *rn;
2924 struct bgp_table *table;
2925 struct bgp_info *ri;
2926
2927 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
2928 {
2929 table = bgp->rib[AFI_IP][SAFI_UNICAST];
2930
2931 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2932 for (ri = rn->info; ri; ri = ri->next)
2933 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2934 && ri->type == ZEBRA_ROUTE_BGP
2935 && ri->sub_type == BGP_ROUTE_NORMAL)
2936 bgp_zebra_withdraw (&rn->p, ri);
2937
2938 table = bgp->rib[AFI_IP6][SAFI_UNICAST];
2939
2940 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2941 for (ri = rn->info; ri; ri = ri->next)
2942 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2943 && ri->type == ZEBRA_ROUTE_BGP
2944 && ri->sub_type == BGP_ROUTE_NORMAL)
2945 bgp_zebra_withdraw (&rn->p, ri);
2946 }
2947 }
2948
2949 void
2950 bgp_reset ()
2951 {
2952 vty_reset ();
2953 bgp_zclient_reset ();
2954 access_list_reset ();
2955 prefix_list_reset ();
2956 }
2957 \f
2958 /* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
2959 value. */
2960 int
2961 bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
2962 {
2963 u_char *pnt;
2964 u_char *lim;
2965 struct prefix p;
2966 int psize;
2967 int ret;
2968
2969 /* Check peer status. */
2970 if (peer->status != Established)
2971 return 0;
2972
2973 pnt = packet->nlri;
2974 lim = pnt + packet->length;
2975
2976 for (; pnt < lim; pnt += psize)
2977 {
2978 /* Clear prefix structure. */
2979 memset (&p, 0, sizeof (struct prefix));
2980
2981 /* Fetch prefix length. */
2982 p.prefixlen = *pnt++;
2983 p.family = afi2family (packet->afi);
2984
2985 /* Already checked in nlri_sanity_check(). We do double check
2986 here. */
2987 if ((packet->afi == AFI_IP && p.prefixlen > 32)
2988 || (packet->afi == AFI_IP6 && p.prefixlen > 128))
2989 return -1;
2990
2991 /* Packet size overflow check. */
2992 psize = PSIZE (p.prefixlen);
2993
2994 /* When packet overflow occur return immediately. */
2995 if (pnt + psize > lim)
2996 return -1;
2997
2998 /* Fetch prefix from NLRI packet. */
2999 memcpy (&p.u.prefix, pnt, psize);
3000
3001 /* Check address. */
3002 if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3003 {
3004 if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3005 {
3006 /*
3007 * From draft-ietf-idr-bgp4-22, Section 6.3:
3008 * If a BGP router receives an UPDATE message with a
3009 * semantically incorrect NLRI field, in which a prefix is
3010 * semantically incorrect (eg. an unexpected multicast IP
3011 * address), it should ignore the prefix.
3012 */
3013 zlog (peer->log, LOG_ERR,
3014 "IPv4 unicast NLRI is multicast address %s",
3015 inet_ntoa (p.u.prefix4));
3016
3017 return -1;
3018 }
3019 }
3020
3021 #ifdef HAVE_IPV6
3022 /* Check address. */
3023 if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3024 {
3025 if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3026 {
3027 char buf[BUFSIZ];
3028
3029 zlog (peer->log, LOG_WARNING,
3030 "IPv6 link-local NLRI received %s ignore this NLRI",
3031 inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3032
3033 continue;
3034 }
3035 }
3036 #endif /* HAVE_IPV6 */
3037
3038 /* Normal process. */
3039 if (attr)
3040 ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3041 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3042 else
3043 ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3044 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3045
3046 /* Address family configuration mismatch or maximum-prefix count
3047 overflow. */
3048 if (ret < 0)
3049 return -1;
3050 }
3051
3052 /* Packet length consistency check. */
3053 if (pnt != lim)
3054 return -1;
3055
3056 return 0;
3057 }
3058
3059 /* NLRI encode syntax check routine. */
3060 int
3061 bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3062 bgp_size_t length)
3063 {
3064 u_char *end;
3065 u_char prefixlen;
3066 int psize;
3067
3068 end = pnt + length;
3069
3070 /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3071 syntactic validity. If the field is syntactically incorrect,
3072 then the Error Subcode is set to Invalid Network Field. */
3073
3074 while (pnt < end)
3075 {
3076 prefixlen = *pnt++;
3077
3078 /* Prefix length check. */
3079 if ((afi == AFI_IP && prefixlen > 32)
3080 || (afi == AFI_IP6 && prefixlen > 128))
3081 {
3082 plog_err (peer->log,
3083 "%s [Error] Update packet error (wrong prefix length %d)",
3084 peer->host, prefixlen);
3085 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3086 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3087 return -1;
3088 }
3089
3090 /* Packet size overflow check. */
3091 psize = PSIZE (prefixlen);
3092
3093 if (pnt + psize > end)
3094 {
3095 plog_err (peer->log,
3096 "%s [Error] Update packet error"
3097 " (prefix data overflow prefix size is %d)",
3098 peer->host, psize);
3099 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3100 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3101 return -1;
3102 }
3103
3104 pnt += psize;
3105 }
3106
3107 /* Packet length consistency check. */
3108 if (pnt != end)
3109 {
3110 plog_err (peer->log,
3111 "%s [Error] Update packet error"
3112 " (prefix length mismatch with total length)",
3113 peer->host);
3114 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3115 BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3116 return -1;
3117 }
3118 return 0;
3119 }
3120 \f
3121 static struct bgp_static *
3122 bgp_static_new ()
3123 {
3124 struct bgp_static *new;
3125 new = XMALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
3126 memset (new, 0, sizeof (struct bgp_static));
3127 return new;
3128 }
3129
3130 static void
3131 bgp_static_free (struct bgp_static *bgp_static)
3132 {
3133 if (bgp_static->rmap.name)
3134 free (bgp_static->rmap.name);
3135 XFREE (MTYPE_BGP_STATIC, bgp_static);
3136 }
3137
3138 static void
3139 bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3140 struct prefix *p, afi_t afi, safi_t safi)
3141 {
3142 struct bgp_node *rn;
3143 struct bgp_info *ri;
3144
3145 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3146
3147 /* Check selected route and self inserted route. */
3148 for (ri = rn->info; ri; ri = ri->next)
3149 if (ri->peer == bgp->peer_self
3150 && ri->type == ZEBRA_ROUTE_BGP
3151 && ri->sub_type == BGP_ROUTE_STATIC)
3152 break;
3153
3154 /* Withdraw static BGP route from routing table. */
3155 if (ri)
3156 {
3157 bgp_info_delete (rn, ri);
3158 bgp_process (bgp, rn, afi, safi);
3159 }
3160
3161 /* Unlock bgp_node_lookup. */
3162 bgp_unlock_node (rn);
3163 }
3164
3165 static void
3166 bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
3167 struct bgp_static *bgp_static,
3168 afi_t afi, safi_t safi)
3169 {
3170 struct bgp_node *rn;
3171 struct bgp_info *ri;
3172 struct bgp_info *new;
3173 struct bgp_info info;
3174 struct attr *attr_new;
3175 struct attr attr = {0 };
3176 struct attr new_attr = { .extra = 0 };
3177 struct bgp *bgp;
3178 int ret;
3179 char buf[SU_ADDRSTRLEN];
3180
3181 bgp = rsclient->bgp;
3182
3183 assert (bgp_static);
3184 if (!bgp_static)
3185 return;
3186
3187 rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3188
3189 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3190
3191 attr.nexthop = bgp_static->igpnexthop;
3192 attr.med = bgp_static->igpmetric;
3193 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3194
3195 if (bgp_static->ttl)
3196 {
3197 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT);
3198 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3199 attr.pathlimit.as = 0;
3200 attr.pathlimit.ttl = bgp_static->ttl;
3201 }
3202
3203 if (bgp_static->atomic)
3204 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3205
3206 /* Apply network route-map for export to this rsclient. */
3207 if (bgp_static->rmap.name)
3208 {
3209 struct attr attr_tmp = attr;
3210 info.peer = rsclient;
3211 info.attr = &attr_tmp;
3212
3213 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3214 SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3215
3216 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3217
3218 rsclient->rmap_type = 0;
3219
3220 if (ret == RMAP_DENYMATCH)
3221 {
3222 /* Free uninterned attribute. */
3223 bgp_attr_flush (&attr_tmp);
3224
3225 /* Unintern original. */
3226 aspath_unintern (attr.aspath);
3227 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3228 bgp_attr_extra_free (&attr);
3229
3230 return;
3231 }
3232 attr_new = bgp_attr_intern (&attr_tmp);
3233 }
3234 else
3235 attr_new = bgp_attr_intern (&attr);
3236
3237 new_attr = *attr_new;
3238
3239 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3240
3241 if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3242 == RMAP_DENY)
3243 {
3244 /* This BGP update is filtered. Log the reason then update BGP entry. */
3245 if (BGP_DEBUG (update, UPDATE_IN))
3246 zlog (rsclient->log, LOG_DEBUG,
3247 "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3248 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3249 p->prefixlen, rsclient->host);
3250
3251 bgp->peer_self->rmap_type = 0;
3252
3253 bgp_attr_unintern (attr_new);
3254 aspath_unintern (attr.aspath);
3255 bgp_attr_extra_free (&attr);
3256
3257 bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3258
3259 return;
3260 }
3261
3262 bgp->peer_self->rmap_type = 0;
3263
3264 bgp_attr_unintern (attr_new);
3265 attr_new = bgp_attr_intern (&new_attr);
3266
3267 for (ri = rn->info; ri; ri = ri->next)
3268 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3269 && ri->sub_type == BGP_ROUTE_STATIC)
3270 break;
3271
3272 if (ri)
3273 {
3274 if (attrhash_cmp (ri->attr, attr_new) &&
3275 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3276 {
3277 bgp_unlock_node (rn);
3278 bgp_attr_unintern (attr_new);
3279 aspath_unintern (attr.aspath);
3280 bgp_attr_extra_free (&attr);
3281 return;
3282 }
3283 else
3284 {
3285 /* The attribute is changed. */
3286 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3287
3288 /* Rewrite BGP route information. */
3289 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3290 bgp_info_restore(rn, ri);
3291 bgp_attr_unintern (ri->attr);
3292 ri->attr = attr_new;
3293 ri->uptime = time (NULL);
3294
3295 /* Process change. */
3296 bgp_process (bgp, rn, afi, safi);
3297 bgp_unlock_node (rn);
3298 aspath_unintern (attr.aspath);
3299 bgp_attr_extra_free (&attr);
3300 return;
3301 }
3302 }
3303
3304 /* Make new BGP info. */
3305 new = bgp_info_new ();
3306 new->type = ZEBRA_ROUTE_BGP;
3307 new->sub_type = BGP_ROUTE_STATIC;
3308 new->peer = bgp->peer_self;
3309 SET_FLAG (new->flags, BGP_INFO_VALID);
3310 new->attr = attr_new;
3311 new->uptime = time (NULL);
3312
3313 /* Register new BGP information. */
3314 bgp_info_add (rn, new);
3315
3316 /* route_node_get lock */
3317 bgp_unlock_node (rn);
3318
3319 /* Process change. */
3320 bgp_process (bgp, rn, afi, safi);
3321
3322 /* Unintern original. */
3323 aspath_unintern (attr.aspath);
3324 bgp_attr_extra_free (&attr);
3325 }
3326
3327 static void
3328 bgp_static_update_main (struct bgp *bgp, struct prefix *p,
3329 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3330 {
3331 struct bgp_node *rn;
3332 struct bgp_info *ri;
3333 struct bgp_info *new;
3334 struct bgp_info info;
3335 struct attr attr = { 0 };
3336 struct attr *attr_new;
3337 int ret;
3338
3339 assert (bgp_static);
3340 if (!bgp_static)
3341 return;
3342
3343 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3344
3345 bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3346
3347 attr.nexthop = bgp_static->igpnexthop;
3348 attr.med = bgp_static->igpmetric;
3349 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3350
3351 if (bgp_static->ttl)
3352 {
3353 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT);
3354 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3355 attr.pathlimit.as = 0;
3356 attr.pathlimit.ttl = bgp_static->ttl;
3357 }
3358
3359 if (bgp_static->atomic)
3360 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3361
3362 /* Apply route-map. */
3363 if (bgp_static->rmap.name)
3364 {
3365 struct attr attr_tmp = attr;
3366 info.peer = bgp->peer_self;
3367 info.attr = &attr_tmp;
3368
3369 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3370
3371 ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3372
3373 bgp->peer_self->rmap_type = 0;
3374
3375 if (ret == RMAP_DENYMATCH)
3376 {
3377 /* Free uninterned attribute. */
3378 bgp_attr_flush (&attr_tmp);
3379
3380 /* Unintern original. */
3381 aspath_unintern (attr.aspath);
3382 bgp_attr_extra_free (&attr);
3383 bgp_static_withdraw (bgp, p, afi, safi);
3384 return;
3385 }
3386 attr_new = bgp_attr_intern (&attr_tmp);
3387 }
3388 else
3389 attr_new = bgp_attr_intern (&attr);
3390
3391 for (ri = rn->info; ri; ri = ri->next)
3392 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3393 && ri->sub_type == BGP_ROUTE_STATIC)
3394 break;
3395
3396 if (ri)
3397 {
3398 if (attrhash_cmp (ri->attr, attr_new) &&
3399 !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3400 {
3401 bgp_unlock_node (rn);
3402 bgp_attr_unintern (attr_new);
3403 aspath_unintern (attr.aspath);
3404 bgp_attr_extra_free (&attr);
3405 return;
3406 }
3407 else
3408 {
3409 /* The attribute is changed. */
3410 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3411
3412 /* Rewrite BGP route information. */
3413 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3414 bgp_info_restore(rn, ri);
3415 else
3416 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3417 bgp_attr_unintern (ri->attr);
3418 ri->attr = attr_new;
3419 ri->uptime = time (NULL);
3420
3421 /* Process change. */
3422 bgp_aggregate_increment (bgp, p, ri, afi, safi);
3423 bgp_process (bgp, rn, afi, safi);
3424 bgp_unlock_node (rn);
3425 aspath_unintern (attr.aspath);
3426 bgp_attr_extra_free (&attr);
3427 return;
3428 }
3429 }
3430
3431 /* Make new BGP info. */
3432 new = bgp_info_new ();
3433 new->type = ZEBRA_ROUTE_BGP;
3434 new->sub_type = BGP_ROUTE_STATIC;
3435 new->peer = bgp->peer_self;
3436 SET_FLAG (new->flags, BGP_INFO_VALID);
3437 new->attr = attr_new;
3438 new->uptime = time (NULL);
3439
3440 /* Aggregate address increment. */
3441 bgp_aggregate_increment (bgp, p, new, afi, safi);
3442
3443 /* Register new BGP information. */
3444 bgp_info_add (rn, new);
3445
3446 /* route_node_get lock */
3447 bgp_unlock_node (rn);
3448
3449 /* Process change. */
3450 bgp_process (bgp, rn, afi, safi);
3451
3452 /* Unintern original. */
3453 aspath_unintern (attr.aspath);
3454 bgp_attr_extra_free (&attr);
3455 }
3456
3457 void
3458 bgp_static_update (struct bgp *bgp, struct prefix *p,
3459 struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3460 {
3461 struct peer *rsclient;
3462 struct listnode *node, *nnode;
3463
3464 bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3465
3466 for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
3467 {
3468 if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3469 bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
3470 }
3471 }
3472
3473 static void
3474 bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
3475 u_char safi, struct prefix_rd *prd, u_char *tag)
3476 {
3477 struct bgp_node *rn;
3478 struct bgp_info *new;
3479
3480 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3481
3482 /* Make new BGP info. */
3483 new = bgp_info_new ();
3484 new->type = ZEBRA_ROUTE_BGP;
3485 new->sub_type = BGP_ROUTE_STATIC;
3486 new->peer = bgp->peer_self;
3487 new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3488 SET_FLAG (new->flags, BGP_INFO_VALID);
3489 new->uptime = time (NULL);
3490 new->extra = bgp_info_extra_new();
3491 memcpy (new->extra->tag, tag, 3);
3492
3493 /* Aggregate address increment. */
3494 bgp_aggregate_increment (bgp, p, new, afi, safi);
3495
3496 /* Register new BGP information. */
3497 bgp_info_add (rn, new);
3498
3499 /* route_node_get lock */
3500 bgp_unlock_node (rn);
3501
3502 /* Process change. */
3503 bgp_process (bgp, rn, afi, safi);
3504 }
3505
3506 void
3507 bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3508 safi_t safi)
3509 {
3510 struct bgp_node *rn;
3511 struct bgp_info *ri;
3512
3513 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3514
3515 /* Check selected route and self inserted route. */
3516 for (ri = rn->info; ri; ri = ri->next)
3517 if (ri->peer == bgp->peer_self
3518 && ri->type == ZEBRA_ROUTE_BGP
3519 && ri->sub_type == BGP_ROUTE_STATIC)
3520 break;
3521
3522 /* Withdraw static BGP route from routing table. */
3523 if (ri)
3524 {
3525 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3526 bgp_info_delete (rn, ri);
3527 bgp_process (bgp, rn, afi, safi);
3528 }
3529
3530 /* Unlock bgp_node_lookup. */
3531 bgp_unlock_node (rn);
3532 }
3533
3534 void
3535 bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3536 {
3537 struct bgp_static *bgp_static;
3538 struct bgp *bgp;
3539 struct bgp_node *rn;
3540 struct prefix *p;
3541
3542 bgp = rsclient->bgp;
3543
3544 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3545 if ((bgp_static = rn->info) != NULL)
3546 {
3547 p = &rn->p;
3548
3549 bgp_static_update_rsclient (rsclient, p, bgp_static,
3550 afi, safi);
3551 }
3552 }
3553
3554 static void
3555 bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
3556 u_char safi, struct prefix_rd *prd, u_char *tag)
3557 {
3558 struct bgp_node *rn;
3559 struct bgp_info *ri;
3560
3561 rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3562
3563 /* Check selected route and self inserted route. */
3564 for (ri = rn->info; ri; ri = ri->next)
3565 if (ri->peer == bgp->peer_self
3566 && ri->type == ZEBRA_ROUTE_BGP
3567 && ri->sub_type == BGP_ROUTE_STATIC)
3568 break;
3569
3570 /* Withdraw static BGP route from routing table. */
3571 if (ri)
3572 {
3573 bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3574 bgp_info_delete (rn, ri);
3575 bgp_process (bgp, rn, afi, safi);
3576 }
3577
3578 /* Unlock bgp_node_lookup. */
3579 bgp_unlock_node (rn);
3580 }
3581
3582 static void
3583 bgp_pathlimit_update_parents (struct bgp *bgp, struct bgp_node *rn,
3584 int ttl_edge)
3585 {
3586 struct bgp_node *parent = rn;
3587 struct bgp_static *sp;
3588
3589 /* Existing static changed TTL, search parents and adjust their atomic */
3590 while ((parent = parent->parent))
3591 if ((sp = parent->info))
3592 {
3593 int sp_level = (sp->atomic ? 1 : 0);
3594 ttl_edge ? sp->atomic++ : sp->atomic--;
3595
3596 /* did we change state of parent whether atomic is set or not? */
3597 if (sp_level != (sp->atomic ? 1 : 0))
3598 {
3599 bgp_static_update (bgp, &parent->p, sp,
3600 rn->table->afi, rn->table->safi);
3601 }
3602 }
3603 }
3604
3605 /* Configure static BGP network. When user don't run zebra, static
3606 route should be installed as valid. */
3607 static int
3608 bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
3609 u_int16_t afi, u_char safi, const char *rmap, int backdoor,
3610 u_char ttl)
3611 {
3612 int ret;
3613 struct prefix p;
3614 struct bgp_static *bgp_static;
3615 struct bgp_node *rn;
3616 u_char need_update = 0;
3617 u_char ttl_change = 0;
3618 u_char ttl_edge = (ttl ? 1 : 0);
3619 u_char new = 0;
3620
3621 /* Convert IP prefix string to struct prefix. */
3622 ret = str2prefix (ip_str, &p);
3623 if (! ret)
3624 {
3625 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3626 return CMD_WARNING;
3627 }
3628 #ifdef HAVE_IPV6
3629 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3630 {
3631 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3632 VTY_NEWLINE);
3633 return CMD_WARNING;
3634 }
3635 #endif /* HAVE_IPV6 */
3636
3637 apply_mask (&p);
3638
3639 /* Set BGP static route configuration. */
3640 rn = bgp_node_get (bgp->route[afi][safi], &p);
3641
3642 if (rn->info)
3643 {
3644 /* Configuration change. */
3645 bgp_static = rn->info;
3646
3647 /* Check previous routes are installed into BGP. */
3648 if (bgp_static->valid)
3649 {
3650 if (bgp_static->backdoor != backdoor
3651 || bgp_static->ttl != ttl)
3652 need_update = 1;
3653 }
3654
3655 /* need to catch TTL set/unset transitions for handling of
3656 * ATOMIC_AGGREGATE
3657 */
3658 if ((bgp_static->ttl ? 1 : 0) != ttl_edge)
3659 ttl_change = 1;
3660
3661 bgp_static->backdoor = backdoor;
3662 bgp_static->ttl = ttl;
3663
3664 if (rmap)
3665 {
3666 if (bgp_static->rmap.name)
3667 free (bgp_static->rmap.name);
3668 bgp_static->rmap.name = strdup (rmap);
3669 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3670 }
3671 else
3672 {
3673 if (bgp_static->rmap.name)
3674 free (bgp_static->rmap.name);
3675 bgp_static->rmap.name = NULL;
3676 bgp_static->rmap.map = NULL;
3677 bgp_static->valid = 0;
3678 }
3679 bgp_unlock_node (rn);
3680 }
3681 else
3682 {
3683 /* New configuration. */
3684 bgp_static = bgp_static_new ();
3685 bgp_static->backdoor = backdoor;
3686 bgp_static->valid = 0;
3687 bgp_static->igpmetric = 0;
3688 bgp_static->igpnexthop.s_addr = 0;
3689 bgp_static->ttl = ttl;
3690 ttl_change = ttl_edge;
3691 new = 1;
3692
3693 if (rmap)
3694 {
3695 if (bgp_static->rmap.name)
3696 free (bgp_static->rmap.name);
3697 bgp_static->rmap.name = strdup (rmap);
3698 bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3699 }
3700 rn->info = bgp_static;
3701 }
3702
3703 /* ".. sites that choose to advertise the
3704 * AS_PATHLIMIT path attribute SHOULD advertise the ATOMIC_AGGREGATE on
3705 * all less specific covering prefixes as well as the more specific
3706 * prefixes."
3707 *
3708 * So:
3709 * Prefix that has just had pathlimit set/unset:
3710 * - Must bump ATOMIC refcount on all parents.
3711 *
3712 * To catch less specific prefixes:
3713 * - Must search children for ones with TTL, bump atomic refcount
3714 * (we dont care if we're deleting a less specific prefix..)
3715 */
3716 if (ttl_change)
3717 {
3718 /* Existing static changed TTL, search parents and adjust their atomic */
3719 bgp_pathlimit_update_parents (bgp, rn, ttl_edge);
3720 }
3721
3722 if (new)
3723 {
3724 struct bgp_node *child;
3725 struct bgp_static *sc;
3726
3727 /* New static, search children and bump this statics atomic.. */
3728 child = bgp_lock_node (rn); /* route_next_until unlocks it.. */
3729 while ((child = bgp_route_next_until (child, rn)))
3730 {
3731 if ((sc = child->info) && sc->ttl)
3732 bgp_static->atomic++;
3733 }
3734 }
3735
3736 /* If BGP scan is not enabled, we should install this route here. */
3737 if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3738 {
3739 bgp_static->valid = 1;
3740
3741 if (need_update)
3742 bgp_static_withdraw (bgp, &p, afi, safi);
3743
3744 if (! bgp_static->backdoor)
3745 bgp_static_update (bgp, &p, bgp_static, afi, safi);
3746 }
3747
3748 return CMD_SUCCESS;
3749 }
3750
3751 /* Configure static BGP network. */
3752 static int
3753 bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
3754 u_int16_t afi, u_char safi)
3755 {
3756 int ret;
3757 struct prefix p;
3758 struct bgp_static *bgp_static;
3759 struct bgp_node *rn;
3760
3761 /* Convert IP prefix string to struct prefix. */
3762 ret = str2prefix (ip_str, &p);
3763 if (! ret)
3764 {
3765 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3766 return CMD_WARNING;
3767 }
3768 #ifdef HAVE_IPV6
3769 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3770 {
3771 vty_out (vty, "%% Malformed prefix (link-local address)%s",
3772 VTY_NEWLINE);
3773 return CMD_WARNING;
3774 }
3775 #endif /* HAVE_IPV6 */
3776
3777 apply_mask (&p);
3778
3779 rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3780 if (! rn)
3781 {
3782 vty_out (vty, "%% Can't find specified static route configuration.%s",
3783 VTY_NEWLINE);
3784 return CMD_WARNING;
3785 }
3786
3787 bgp_static = rn->info;
3788
3789 /* decrement atomic in parents, see bgp_static_set */
3790 bgp_pathlimit_update_parents (bgp, rn, 0);
3791
3792 /* Update BGP RIB. */
3793 if (! bgp_static->backdoor)
3794 bgp_static_withdraw (bgp, &p, afi, safi);
3795
3796 /* Clear configuration. */
3797 bgp_static_free (bgp_static);
3798 rn->info = NULL;
3799 bgp_unlock_node (rn);
3800 bgp_unlock_node (rn);
3801
3802 return CMD_SUCCESS;
3803 }
3804
3805 /* Called from bgp_delete(). Delete all static routes from the BGP
3806 instance. */
3807 void
3808 bgp_static_delete (struct bgp *bgp)
3809 {
3810 afi_t afi;
3811 safi_t safi;
3812 struct bgp_node *rn;
3813 struct bgp_node *rm;
3814 struct bgp_table *table;
3815 struct bgp_static *bgp_static;
3816
3817 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3818 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3819 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3820 if (rn->info != NULL)
3821 {
3822 if (safi == SAFI_MPLS_VPN)
3823 {
3824 table = rn->info;
3825
3826 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3827 {
3828 bgp_static = rn->info;
3829 bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3830 AFI_IP, SAFI_MPLS_VPN,
3831 (struct prefix_rd *)&rn->p,
3832 bgp_static->tag);
3833 bgp_static_free (bgp_static);
3834 rn->info = NULL;
3835 bgp_unlock_node (rn);
3836 }
3837 }
3838 else
3839 {
3840 bgp_static = rn->info;
3841 bgp_static_withdraw (bgp, &rn->p, afi, safi);
3842 bgp_static_free (bgp_static);
3843 rn->info = NULL;
3844 bgp_unlock_node (rn);
3845 }
3846 }
3847 }
3848
3849 int
3850 bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3851 const char *tag_str)
3852 {
3853 int ret;
3854 struct prefix p;
3855 struct prefix_rd prd;
3856 struct bgp *bgp;
3857 struct bgp_node *prn;
3858 struct bgp_node *rn;
3859 struct bgp_table *table;
3860 struct bgp_static *bgp_static;
3861 u_char tag[3];
3862
3863 bgp = vty->index;
3864
3865 ret = str2prefix (ip_str, &p);
3866 if (! ret)
3867 {
3868 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3869 return CMD_WARNING;
3870 }
3871 apply_mask (&p);
3872
3873 ret = str2prefix_rd (rd_str, &prd);
3874 if (! ret)
3875 {
3876 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3877 return CMD_WARNING;
3878 }
3879
3880 ret = str2tag (tag_str, tag);
3881 if (! ret)
3882 {
3883 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3884 return CMD_WARNING;
3885 }
3886
3887 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3888 (struct prefix *)&prd);
3889 if (prn->info == NULL)
3890 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
3891 else
3892 bgp_unlock_node (prn);
3893 table = prn->info;
3894
3895 rn = bgp_node_get (table, &p);
3896
3897 if (rn->info)
3898 {
3899 vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3900 bgp_unlock_node (rn);
3901 }
3902 else
3903 {
3904 /* New configuration. */
3905 bgp_static = bgp_static_new ();
3906 bgp_static->valid = 1;
3907 memcpy (bgp_static->tag, tag, 3);
3908 rn->info = bgp_static;
3909
3910 bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3911 }
3912
3913 return CMD_SUCCESS;
3914 }
3915
3916 /* Configure static BGP network. */
3917 int
3918 bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3919 const char *rd_str, const char *tag_str)
3920 {
3921 int ret;
3922 struct bgp *bgp;
3923 struct prefix p;
3924 struct prefix_rd prd;
3925 struct bgp_node *prn;
3926 struct bgp_node *rn;
3927 struct bgp_table *table;
3928 struct bgp_static *bgp_static;
3929 u_char tag[3];
3930
3931 bgp = vty->index;
3932
3933 /* Convert IP prefix string to struct prefix. */
3934 ret = str2prefix (ip_str, &p);
3935 if (! ret)
3936 {
3937 vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3938 return CMD_WARNING;
3939 }
3940 apply_mask (&p);
3941
3942 ret = str2prefix_rd (rd_str, &prd);
3943 if (! ret)
3944 {
3945 vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3946 return CMD_WARNING;
3947 }
3948
3949 ret = str2tag (tag_str, tag);
3950 if (! ret)
3951 {
3952 vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3953 return CMD_WARNING;
3954 }
3955
3956 prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3957 (struct prefix *)&prd);
3958 if (prn->info == NULL)
3959 prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
3960 else
3961 bgp_unlock_node (prn);
3962 table = prn->info;
3963
3964 rn = bgp_node_lookup (table, &p);
3965
3966 if (rn)
3967 {
3968 bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3969
3970 bgp_static = rn->info;
3971 bgp_static_free (bgp_static);
3972 rn->info = NULL;
3973 bgp_unlock_node (rn);
3974 bgp_unlock_node (rn);
3975 }
3976 else
3977 vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
3978
3979 return CMD_SUCCESS;
3980 }
3981 \f
3982 DEFUN (bgp_network,
3983 bgp_network_cmd,
3984 "network A.B.C.D/M",
3985 "Specify a network to announce via BGP\n"
3986 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
3987 {
3988 u_char ttl = 0;
3989
3990 if (argc == 2)
3991 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
3992
3993 return bgp_static_set (vty, vty->index, argv[0],
3994 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
3995 }
3996
3997 ALIAS (bgp_network,
3998 bgp_network_ttl_cmd,
3999 "network A.B.C.D/M pathlimit <0-255>",
4000 "Specify a network to announce via BGP\n"
4001 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4002 "AS-Path hopcount limit attribute\n"
4003 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4004
4005 DEFUN (bgp_network_route_map,
4006 bgp_network_route_map_cmd,
4007 "network A.B.C.D/M route-map WORD",
4008 "Specify a network to announce via BGP\n"
4009 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4010 "Route-map to modify the attributes\n"
4011 "Name of the route map\n")
4012 {
4013 return bgp_static_set (vty, vty->index, argv[0],
4014 AFI_IP, bgp_node_safi (vty), argv[1], 0, 0);
4015 }
4016
4017 DEFUN (bgp_network_backdoor,
4018 bgp_network_backdoor_cmd,
4019 "network A.B.C.D/M backdoor",
4020 "Specify a network to announce via BGP\n"
4021 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4022 "Specify a BGP backdoor route\n")
4023 {
4024 u_char ttl = 0;
4025
4026 if (argc == 2)
4027 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4028
4029 return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
4030 NULL, 1, ttl);
4031 }
4032
4033 ALIAS (bgp_network_backdoor,
4034 bgp_network_backdoor_ttl_cmd,
4035 "network A.B.C.D/M backdoor pathlimit <0-255>",
4036 "Specify a network to announce via BGP\n"
4037 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4038 "Specify a BGP backdoor route\n"
4039 "AS-Path hopcount limit attribute\n"
4040 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4041
4042 DEFUN (bgp_network_mask,
4043 bgp_network_mask_cmd,
4044 "network A.B.C.D mask A.B.C.D",
4045 "Specify a network to announce via BGP\n"
4046 "Network number\n"
4047 "Network mask\n"
4048 "Network mask\n")
4049 {
4050 int ret;
4051 char prefix_str[BUFSIZ];
4052 u_char ttl = 0;
4053
4054 if (argc == 3)
4055 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[2], 1, 255);
4056
4057 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4058 if (! ret)
4059 {
4060 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4061 return CMD_WARNING;
4062 }
4063
4064 return bgp_static_set (vty, vty->index, prefix_str,
4065 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
4066 }
4067
4068 ALIAS (bgp_network_mask,
4069 bgp_network_mask_ttl_cmd,
4070 "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4071 "Specify a network to announce via BGP\n"
4072 "Network number\n"
4073 "Network mask\n"
4074 "Network mask\n"
4075 "AS-Path hopcount limit attribute\n"
4076 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4077
4078 DEFUN (bgp_network_mask_route_map,
4079 bgp_network_mask_route_map_cmd,
4080 "network A.B.C.D mask A.B.C.D route-map WORD",
4081 "Specify a network to announce via BGP\n"
4082 "Network number\n"
4083 "Network mask\n"
4084 "Network mask\n"
4085 "Route-map to modify the attributes\n"
4086 "Name of the route map\n")
4087 {
4088 int ret;
4089 char prefix_str[BUFSIZ];
4090
4091 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4092 if (! ret)
4093 {
4094 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4095 return CMD_WARNING;
4096 }
4097
4098 return bgp_static_set (vty, vty->index, prefix_str,
4099 AFI_IP, bgp_node_safi (vty), argv[2], 0, 0);
4100 }
4101
4102 DEFUN (bgp_network_mask_backdoor,
4103 bgp_network_mask_backdoor_cmd,
4104 "network A.B.C.D mask A.B.C.D backdoor",
4105 "Specify a network to announce via BGP\n"
4106 "Network number\n"
4107 "Network mask\n"
4108 "Network mask\n"
4109 "Specify a BGP backdoor route\n")
4110 {
4111 int ret;
4112 char prefix_str[BUFSIZ];
4113 u_char ttl = 0;
4114
4115 if (argc == 3)
4116 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[2], 1, 255);
4117
4118 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4119 if (! ret)
4120 {
4121 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4122 return CMD_WARNING;
4123 }
4124
4125 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4126 NULL, 1, ttl);
4127 }
4128
4129 ALIAS (bgp_network_mask_backdoor,
4130 bgp_network_mask_backdoor_ttl_cmd,
4131 "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4132 "Specify a network to announce via BGP\n"
4133 "Network number\n"
4134 "Network mask\n"
4135 "Network mask\n"
4136 "Specify a BGP backdoor route\n"
4137 "AS-Path hopcount limit attribute\n"
4138 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4139
4140 DEFUN (bgp_network_mask_natural,
4141 bgp_network_mask_natural_cmd,
4142 "network A.B.C.D",
4143 "Specify a network to announce via BGP\n"
4144 "Network number\n")
4145 {
4146 int ret;
4147 char prefix_str[BUFSIZ];
4148 u_char ttl = 0;
4149
4150 if (argc == 2)
4151 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4152
4153 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4154 if (! ret)
4155 {
4156 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4157 return CMD_WARNING;
4158 }
4159
4160 return bgp_static_set (vty, vty->index, prefix_str,
4161 AFI_IP, bgp_node_safi (vty), NULL, 0, ttl);
4162 }
4163
4164 ALIAS (bgp_network_mask_natural,
4165 bgp_network_mask_natural_ttl_cmd,
4166 "network A.B.C.D pathlimit <0-255>",
4167 "Specify a network to announce via BGP\n"
4168 "Network number\n"
4169 "AS-Path hopcount limit attribute\n"
4170 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4171
4172 DEFUN (bgp_network_mask_natural_route_map,
4173 bgp_network_mask_natural_route_map_cmd,
4174 "network A.B.C.D route-map WORD",
4175 "Specify a network to announce via BGP\n"
4176 "Network number\n"
4177 "Route-map to modify the attributes\n"
4178 "Name of the route map\n")
4179 {
4180 int ret;
4181 char prefix_str[BUFSIZ];
4182
4183 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4184 if (! ret)
4185 {
4186 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4187 return CMD_WARNING;
4188 }
4189
4190 return bgp_static_set (vty, vty->index, prefix_str,
4191 AFI_IP, bgp_node_safi (vty), argv[1], 0, 0);
4192 }
4193
4194 DEFUN (bgp_network_mask_natural_backdoor,
4195 bgp_network_mask_natural_backdoor_cmd,
4196 "network A.B.C.D backdoor",
4197 "Specify a network to announce via BGP\n"
4198 "Network number\n"
4199 "Specify a BGP backdoor route\n")
4200 {
4201 int ret;
4202 char prefix_str[BUFSIZ];
4203 u_char ttl = 0;
4204
4205 if (argc == 2)
4206 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4207
4208 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4209 if (! ret)
4210 {
4211 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4212 return CMD_WARNING;
4213 }
4214
4215 return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4216 NULL, 1, ttl);
4217 }
4218
4219 ALIAS (bgp_network_mask_natural_backdoor,
4220 bgp_network_mask_natural_backdoor_ttl_cmd,
4221 "network A.B.C.D backdoor pathlimit (1-255>",
4222 "Specify a network to announce via BGP\n"
4223 "Network number\n"
4224 "Specify a BGP backdoor route\n"
4225 "AS-Path hopcount limit attribute\n"
4226 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4227
4228 DEFUN (no_bgp_network,
4229 no_bgp_network_cmd,
4230 "no network A.B.C.D/M",
4231 NO_STR
4232 "Specify a network to announce via BGP\n"
4233 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4234 {
4235 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4236 bgp_node_safi (vty));
4237 }
4238
4239 ALIAS (no_bgp_network,
4240 no_bgp_network_ttl_cmd,
4241 "no network A.B.C.D/M pathlimit <0-255>",
4242 NO_STR
4243 "Specify a network to announce via BGP\n"
4244 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4245 "AS-Path hopcount limit attribute\n"
4246 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4247
4248 ALIAS (no_bgp_network,
4249 no_bgp_network_route_map_cmd,
4250 "no network A.B.C.D/M route-map WORD",
4251 NO_STR
4252 "Specify a network to announce via BGP\n"
4253 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4254 "Route-map to modify the attributes\n"
4255 "Name of the route map\n")
4256
4257 ALIAS (no_bgp_network,
4258 no_bgp_network_backdoor_cmd,
4259 "no network A.B.C.D/M backdoor",
4260 NO_STR
4261 "Specify a network to announce via BGP\n"
4262 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4263 "Specify a BGP backdoor route\n")
4264
4265 ALIAS (no_bgp_network,
4266 no_bgp_network_backdoor_ttl_cmd,
4267 "no network A.B.C.D/M backdoor pathlimit <0-255>",
4268 NO_STR
4269 "Specify a network to announce via BGP\n"
4270 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\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")
4274
4275 DEFUN (no_bgp_network_mask,
4276 no_bgp_network_mask_cmd,
4277 "no network A.B.C.D mask A.B.C.D",
4278 NO_STR
4279 "Specify a network to announce via BGP\n"
4280 "Network number\n"
4281 "Network mask\n"
4282 "Network mask\n")
4283 {
4284 int ret;
4285 char prefix_str[BUFSIZ];
4286
4287 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4288 if (! ret)
4289 {
4290 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4291 return CMD_WARNING;
4292 }
4293
4294 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4295 bgp_node_safi (vty));
4296 }
4297
4298 ALIAS (no_bgp_network,
4299 no_bgp_network_mask_ttl_cmd,
4300 "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4301 NO_STR
4302 "Specify a network to announce via BGP\n"
4303 "Network number\n"
4304 "Network mask\n"
4305 "Network mask\n"
4306 "AS-Path hopcount limit attribute\n"
4307 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4308
4309 ALIAS (no_bgp_network_mask,
4310 no_bgp_network_mask_route_map_cmd,
4311 "no network A.B.C.D mask A.B.C.D route-map WORD",
4312 NO_STR
4313 "Specify a network to announce via BGP\n"
4314 "Network number\n"
4315 "Network mask\n"
4316 "Network mask\n"
4317 "Route-map to modify the attributes\n"
4318 "Name of the route map\n")
4319
4320 ALIAS (no_bgp_network_mask,
4321 no_bgp_network_mask_backdoor_cmd,
4322 "no network A.B.C.D mask A.B.C.D backdoor",
4323 NO_STR
4324 "Specify a network to announce via BGP\n"
4325 "Network number\n"
4326 "Network mask\n"
4327 "Network mask\n"
4328 "Specify a BGP backdoor route\n")
4329
4330 ALIAS (no_bgp_network_mask,
4331 no_bgp_network_mask_backdoor_ttl_cmd,
4332 "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4333 NO_STR
4334 "Specify a network to announce via BGP\n"
4335 "Network number\n"
4336 "Network mask\n"
4337 "Network mask\n"
4338 "Specify a BGP backdoor route\n"
4339 "AS-Path hopcount limit attribute\n"
4340 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4341
4342 DEFUN (no_bgp_network_mask_natural,
4343 no_bgp_network_mask_natural_cmd,
4344 "no network A.B.C.D",
4345 NO_STR
4346 "Specify a network to announce via BGP\n"
4347 "Network number\n")
4348 {
4349 int ret;
4350 char prefix_str[BUFSIZ];
4351
4352 ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4353 if (! ret)
4354 {
4355 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4356 return CMD_WARNING;
4357 }
4358
4359 return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4360 bgp_node_safi (vty));
4361 }
4362
4363 ALIAS (no_bgp_network_mask_natural,
4364 no_bgp_network_mask_natural_route_map_cmd,
4365 "no network A.B.C.D route-map WORD",
4366 NO_STR
4367 "Specify a network to announce via BGP\n"
4368 "Network number\n"
4369 "Route-map to modify the attributes\n"
4370 "Name of the route map\n")
4371
4372 ALIAS (no_bgp_network_mask_natural,
4373 no_bgp_network_mask_natural_backdoor_cmd,
4374 "no network A.B.C.D backdoor",
4375 NO_STR
4376 "Specify a network to announce via BGP\n"
4377 "Network number\n"
4378 "Specify a BGP backdoor route\n")
4379
4380 ALIAS (no_bgp_network_mask_natural,
4381 no_bgp_network_mask_natural_ttl_cmd,
4382 "no network A.B.C.D pathlimit <0-255>",
4383 NO_STR
4384 "Specify a network to announce via BGP\n"
4385 "Network number\n"
4386 "AS-Path hopcount limit attribute\n"
4387 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4388
4389 ALIAS (no_bgp_network_mask_natural,
4390 no_bgp_network_mask_natural_backdoor_ttl_cmd,
4391 "no network A.B.C.D backdoor pathlimit <0-255>",
4392 NO_STR
4393 "Specify a network to announce via BGP\n"
4394 "Network number\n"
4395 "Specify a BGP backdoor route\n"
4396 "AS-Path hopcount limit attribute\n"
4397 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4398
4399 #ifdef HAVE_IPV6
4400 DEFUN (ipv6_bgp_network,
4401 ipv6_bgp_network_cmd,
4402 "network X:X::X:X/M",
4403 "Specify a network to announce via BGP\n"
4404 "IPv6 prefix <network>/<length>\n")
4405 {
4406 u_char ttl = 0;
4407
4408 if (argc == 2)
4409 VTY_GET_INTEGER_RANGE ("Pathlimit TTL", ttl, argv[1], 1, 255);
4410
4411 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST,
4412 NULL, 0, ttl);
4413 }
4414
4415 ALIAS (ipv6_bgp_network,
4416 ipv6_bgp_network_ttl_cmd,
4417 "network X:X::X:X/M pathlimit <0-255>",
4418 "Specify a network to announce via BGP\n"
4419 "IPv6 prefix <network>/<length>\n"
4420 "AS-Path hopcount limit attribute\n"
4421 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4422
4423 DEFUN (ipv6_bgp_network_route_map,
4424 ipv6_bgp_network_route_map_cmd,
4425 "network X:X::X:X/M route-map WORD",
4426 "Specify a network to announce via BGP\n"
4427 "IPv6 prefix <network>/<length>\n"
4428 "Route-map to modify the attributes\n"
4429 "Name of the route map\n")
4430 {
4431 return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
4432 bgp_node_safi (vty), argv[1], 0, 0);
4433 }
4434
4435 DEFUN (no_ipv6_bgp_network,
4436 no_ipv6_bgp_network_cmd,
4437 "no network X:X::X:X/M",
4438 NO_STR
4439 "Specify a network to announce via BGP\n"
4440 "IPv6 prefix <network>/<length>\n")
4441 {
4442 return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
4443 }
4444
4445 ALIAS (no_ipv6_bgp_network,
4446 no_ipv6_bgp_network_route_map_cmd,
4447 "no network X:X::X:X/M route-map WORD",
4448 NO_STR
4449 "Specify a network to announce via BGP\n"
4450 "IPv6 prefix <network>/<length>\n"
4451 "Route-map to modify the attributes\n"
4452 "Name of the route map\n")
4453
4454 ALIAS (no_ipv6_bgp_network,
4455 no_ipv6_bgp_network_ttl_cmd,
4456 "no network X:X::X:X/M pathlimit <0-255>",
4457 NO_STR
4458 "Specify a network to announce via BGP\n"
4459 "IPv6 prefix <network>/<length>\n"
4460 "AS-Path hopcount limit attribute\n"
4461 "AS-Pathlimit TTL, in number of AS-Path hops\n")
4462
4463 ALIAS (ipv6_bgp_network,
4464 old_ipv6_bgp_network_cmd,
4465 "ipv6 bgp network X:X::X:X/M",
4466 IPV6_STR
4467 BGP_STR
4468 "Specify a network to announce via BGP\n"
4469 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4470
4471 ALIAS (no_ipv6_bgp_network,
4472 old_no_ipv6_bgp_network_cmd,
4473 "no ipv6 bgp network X:X::X:X/M",
4474 NO_STR
4475 IPV6_STR
4476 BGP_STR
4477 "Specify a network to announce via BGP\n"
4478 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4479 #endif /* HAVE_IPV6 */
4480 \f
4481 /* Aggreagete address:
4482
4483 advertise-map Set condition to advertise attribute
4484 as-set Generate AS set path information
4485 attribute-map Set attributes of aggregate
4486 route-map Set parameters of aggregate
4487 summary-only Filter more specific routes from updates
4488 suppress-map Conditionally filter more specific routes from updates
4489 <cr>
4490 */
4491 struct bgp_aggregate
4492 {
4493 /* Summary-only flag. */
4494 u_char summary_only;
4495
4496 /* AS set generation. */
4497 u_char as_set;
4498
4499 /* Route-map for aggregated route. */
4500 struct route_map *map;
4501
4502 /* Suppress-count. */
4503 unsigned long count;
4504
4505 /* SAFI configuration. */
4506 safi_t safi;
4507 };
4508
4509 static struct bgp_aggregate *
4510 bgp_aggregate_new ()
4511 {
4512 struct bgp_aggregate *new;
4513 new = XMALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
4514 memset (new, 0, sizeof (struct bgp_aggregate));
4515 return new;
4516 }
4517
4518 static void
4519 bgp_aggregate_free (struct bgp_aggregate *aggregate)
4520 {
4521 XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4522 }
4523
4524 static void
4525 bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4526 afi_t afi, safi_t safi, struct bgp_info *del,
4527 struct bgp_aggregate *aggregate)
4528 {
4529 struct bgp_table *table;
4530 struct bgp_node *top;
4531 struct bgp_node *rn;
4532 u_char origin;
4533 struct aspath *aspath = NULL;
4534 struct aspath *asmerge = NULL;
4535 struct community *community = NULL;
4536 struct community *commerge = NULL;
4537 struct in_addr nexthop;
4538 u_int32_t med = 0;
4539 struct bgp_info *ri;
4540 struct bgp_info *new;
4541 int first = 1;
4542 unsigned long match = 0;
4543
4544 /* Record adding route's nexthop and med. */
4545 if (rinew)
4546 {
4547 nexthop = rinew->attr->nexthop;
4548 med = rinew->attr->med;
4549 }
4550
4551 /* ORIGIN attribute: If at least one route among routes that are
4552 aggregated has ORIGIN with the value INCOMPLETE, then the
4553 aggregated route must have the ORIGIN attribute with the value
4554 INCOMPLETE. Otherwise, if at least one route among routes that
4555 are aggregated has ORIGIN with the value EGP, then the aggregated
4556 route must have the origin attribute with the value EGP. In all
4557 other case the value of the ORIGIN attribute of the aggregated
4558 route is INTERNAL. */
4559 origin = BGP_ORIGIN_IGP;
4560
4561 table = bgp->rib[afi][safi];
4562
4563 top = bgp_node_get (table, p);
4564 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4565 if (rn->p.prefixlen > p->prefixlen)
4566 {
4567 match = 0;
4568
4569 for (ri = rn->info; ri; ri = ri->next)
4570 {
4571 if (BGP_INFO_HOLDDOWN (ri))
4572 continue;
4573
4574 if (del && ri == del)
4575 continue;
4576
4577 if (! rinew && first)
4578 {
4579 nexthop = ri->attr->nexthop;
4580 med = ri->attr->med;
4581 first = 0;
4582 }
4583
4584 #ifdef AGGREGATE_NEXTHOP_CHECK
4585 if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4586 || ri->attr->med != med)
4587 {
4588 if (aspath)
4589 aspath_free (aspath);
4590 if (community)
4591 community_free (community);
4592 bgp_unlock_node (rn);
4593 bgp_unlock_node (top);
4594 return;
4595 }
4596 #endif /* AGGREGATE_NEXTHOP_CHECK */
4597
4598 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4599 {
4600 if (aggregate->summary_only)
4601 {
4602 (bgp_info_extra_get (ri))->suppress++;
4603 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4604 match++;
4605 }
4606
4607 aggregate->count++;
4608
4609 if (aggregate->as_set)
4610 {
4611 if (origin < ri->attr->origin)
4612 origin = ri->attr->origin;
4613
4614 if (aspath)
4615 {
4616 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4617 aspath_free (aspath);
4618 aspath = asmerge;
4619 }
4620 else
4621 aspath = aspath_dup (ri->attr->aspath);
4622
4623 if (ri->attr->community)
4624 {
4625 if (community)
4626 {
4627 commerge = community_merge (community,
4628 ri->attr->community);
4629 community = community_uniq_sort (commerge);
4630 community_free (commerge);
4631 }
4632 else
4633 community = community_dup (ri->attr->community);
4634 }
4635 }
4636 }
4637 }
4638 if (match)
4639 bgp_process (bgp, rn, afi, safi);
4640 }
4641 bgp_unlock_node (top);
4642
4643 if (rinew)
4644 {
4645 aggregate->count++;
4646
4647 if (aggregate->summary_only)
4648 (bgp_info_extra_get (rinew))->suppress++;
4649
4650 if (aggregate->as_set)
4651 {
4652 if (origin < rinew->attr->origin)
4653 origin = rinew->attr->origin;
4654
4655 if (aspath)
4656 {
4657 asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4658 aspath_free (aspath);
4659 aspath = asmerge;
4660 }
4661 else
4662 aspath = aspath_dup (rinew->attr->aspath);
4663
4664 if (rinew->attr->community)
4665 {
4666 if (community)
4667 {
4668 commerge = community_merge (community,
4669 rinew->attr->community);
4670 community = community_uniq_sort (commerge);
4671 community_free (commerge);
4672 }
4673 else
4674 community = community_dup (rinew->attr->community);
4675 }
4676 }
4677 }
4678
4679 if (aggregate->count > 0)
4680 {
4681 rn = bgp_node_get (table, p);
4682 new = bgp_info_new ();
4683 new->type = ZEBRA_ROUTE_BGP;
4684 new->sub_type = BGP_ROUTE_AGGREGATE;
4685 new->peer = bgp->peer_self;
4686 SET_FLAG (new->flags, BGP_INFO_VALID);
4687 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4688 new->uptime = time (NULL);
4689
4690 bgp_info_add (rn, new);
4691 bgp_unlock_node (rn);
4692 bgp_process (bgp, rn, afi, safi);
4693 }
4694 else
4695 {
4696 if (aspath)
4697 aspath_free (aspath);
4698 if (community)
4699 community_free (community);
4700 }
4701 }
4702
4703 void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4704 struct bgp_aggregate *);
4705
4706 void
4707 bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4708 struct bgp_info *ri, afi_t afi, safi_t safi)
4709 {
4710 struct bgp_node *child;
4711 struct bgp_node *rn;
4712 struct bgp_aggregate *aggregate;
4713
4714 /* MPLS-VPN aggregation is not yet supported. */
4715 if (safi == SAFI_MPLS_VPN)
4716 return;
4717
4718 if (p->prefixlen == 0)
4719 return;
4720
4721 if (BGP_INFO_HOLDDOWN (ri))
4722 return;
4723
4724 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4725
4726 /* Aggregate address configuration check. */
4727 for (rn = child; rn; rn = rn->parent)
4728 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4729 {
4730 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4731 bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
4732 }
4733 bgp_unlock_node (child);
4734 }
4735
4736 void
4737 bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4738 struct bgp_info *del, afi_t afi, safi_t safi)
4739 {
4740 struct bgp_node *child;
4741 struct bgp_node *rn;
4742 struct bgp_aggregate *aggregate;
4743
4744 /* MPLS-VPN aggregation is not yet supported. */
4745 if (safi == SAFI_MPLS_VPN)
4746 return;
4747
4748 if (p->prefixlen == 0)
4749 return;
4750
4751 child = bgp_node_get (bgp->aggregate[afi][safi], p);
4752
4753 /* Aggregate address configuration check. */
4754 for (rn = child; rn; rn = rn->parent)
4755 if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4756 {
4757 bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4758 bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
4759 }
4760 bgp_unlock_node (child);
4761 }
4762
4763 static void
4764 bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4765 struct bgp_aggregate *aggregate)
4766 {
4767 struct bgp_table *table;
4768 struct bgp_node *top;
4769 struct bgp_node *rn;
4770 struct bgp_info *new;
4771 struct bgp_info *ri;
4772 unsigned long match;
4773 u_char origin = BGP_ORIGIN_IGP;
4774 struct aspath *aspath = NULL;
4775 struct aspath *asmerge = NULL;
4776 struct community *community = NULL;
4777 struct community *commerge = NULL;
4778
4779 table = bgp->rib[afi][safi];
4780
4781 /* Sanity check. */
4782 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4783 return;
4784 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4785 return;
4786
4787 /* If routes exists below this node, generate aggregate routes. */
4788 top = bgp_node_get (table, p);
4789 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4790 if (rn->p.prefixlen > p->prefixlen)
4791 {
4792 match = 0;
4793
4794 for (ri = rn->info; ri; ri = ri->next)
4795 {
4796 if (BGP_INFO_HOLDDOWN (ri))
4797 continue;
4798
4799 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4800 {
4801 /* summary-only aggregate route suppress aggregated
4802 route announcement. */
4803 if (aggregate->summary_only)
4804 {
4805 (bgp_info_extra_get (ri))->suppress++;
4806 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4807 match++;
4808 }
4809 /* as-set aggregate route generate origin, as path,
4810 community aggregation. */
4811 if (aggregate->as_set)
4812 {
4813 if (origin < ri->attr->origin)
4814 origin = ri->attr->origin;
4815
4816 if (aspath)
4817 {
4818 asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4819 aspath_free (aspath);
4820 aspath = asmerge;
4821 }
4822 else
4823 aspath = aspath_dup (ri->attr->aspath);
4824
4825 if (ri->attr->community)
4826 {
4827 if (community)
4828 {
4829 commerge = community_merge (community,
4830 ri->attr->community);
4831 community = community_uniq_sort (commerge);
4832 community_free (commerge);
4833 }
4834 else
4835 community = community_dup (ri->attr->community);
4836 }
4837 }
4838 aggregate->count++;
4839 }
4840 }
4841
4842 /* If this node is suppressed, process the change. */
4843 if (match)
4844 bgp_process (bgp, rn, afi, safi);
4845 }
4846 bgp_unlock_node (top);
4847
4848 /* Add aggregate route to BGP table. */
4849 if (aggregate->count)
4850 {
4851 rn = bgp_node_get (table, p);
4852
4853 new = bgp_info_new ();
4854 new->type = ZEBRA_ROUTE_BGP;
4855 new->sub_type = BGP_ROUTE_AGGREGATE;
4856 new->peer = bgp->peer_self;
4857 SET_FLAG (new->flags, BGP_INFO_VALID);
4858 new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4859 new->uptime = time (NULL);
4860
4861 bgp_info_add (rn, new);
4862 bgp_unlock_node (rn);
4863
4864 /* Process change. */
4865 bgp_process (bgp, rn, afi, safi);
4866 }
4867 }
4868
4869 void
4870 bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4871 safi_t safi, struct bgp_aggregate *aggregate)
4872 {
4873 struct bgp_table *table;
4874 struct bgp_node *top;
4875 struct bgp_node *rn;
4876 struct bgp_info *ri;
4877 unsigned long match;
4878
4879 table = bgp->rib[afi][safi];
4880
4881 if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4882 return;
4883 if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4884 return;
4885
4886 /* If routes exists below this node, generate aggregate routes. */
4887 top = bgp_node_get (table, p);
4888 for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4889 if (rn->p.prefixlen > p->prefixlen)
4890 {
4891 match = 0;
4892
4893 for (ri = rn->info; ri; ri = ri->next)
4894 {
4895 if (BGP_INFO_HOLDDOWN (ri))
4896 continue;
4897
4898 if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4899 {
4900 if (aggregate->summary_only && ri->extra)
4901 {
4902 ri->extra->suppress--;
4903
4904 if (ri->extra->suppress == 0)
4905 {
4906 bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4907 match++;
4908 }
4909 }
4910 aggregate->count--;
4911 }
4912 }
4913
4914 /* If this node was suppressed, process the change. */
4915 if (match)
4916 bgp_process (bgp, rn, afi, safi);
4917 }
4918 bgp_unlock_node (top);
4919
4920 /* Delete aggregate route from BGP table. */
4921 rn = bgp_node_get (table, p);
4922
4923 for (ri = rn->info; ri; ri = ri->next)
4924 if (ri->peer == bgp->peer_self
4925 && ri->type == ZEBRA_ROUTE_BGP
4926 && ri->sub_type == BGP_ROUTE_AGGREGATE)
4927 break;
4928
4929 /* Withdraw static BGP route from routing table. */
4930 if (ri)
4931 {
4932 bgp_info_delete (rn, ri);
4933 bgp_process (bgp, rn, afi, safi);
4934 }
4935
4936 /* Unlock bgp_node_lookup. */
4937 bgp_unlock_node (rn);
4938 }
4939
4940 /* Aggregate route attribute. */
4941 #define AGGREGATE_SUMMARY_ONLY 1
4942 #define AGGREGATE_AS_SET 1
4943
4944 static int
4945 bgp_aggregate_set (struct vty *vty, const char *prefix_str,
4946 afi_t afi, safi_t safi,
4947 u_char summary_only, u_char as_set)
4948 {
4949 int ret;
4950 struct prefix p;
4951 struct bgp_node *rn;
4952 struct bgp *bgp;
4953 struct bgp_aggregate *aggregate;
4954
4955 /* Convert string to prefix structure. */
4956 ret = str2prefix (prefix_str, &p);
4957 if (!ret)
4958 {
4959 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4960 return CMD_WARNING;
4961 }
4962 apply_mask (&p);
4963
4964 /* Get BGP structure. */
4965 bgp = vty->index;
4966
4967 /* Old configuration check. */
4968 rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4969
4970 if (rn->info)
4971 {
4972 vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
4973 bgp_unlock_node (rn);
4974 return CMD_WARNING;
4975 }
4976
4977 /* Make aggregate address structure. */
4978 aggregate = bgp_aggregate_new ();
4979 aggregate->summary_only = summary_only;
4980 aggregate->as_set = as_set;
4981 aggregate->safi = safi;
4982 rn->info = aggregate;
4983
4984 /* Aggregate address insert into BGP routing table. */
4985 if (safi & SAFI_UNICAST)
4986 bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
4987 if (safi & SAFI_MULTICAST)
4988 bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4989
4990 return CMD_SUCCESS;
4991 }
4992
4993 static int
4994 bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4995 afi_t afi, safi_t safi)
4996 {
4997 int ret;
4998 struct prefix p;
4999 struct bgp_node *rn;
5000 struct bgp *bgp;
5001 struct bgp_aggregate *aggregate;
5002
5003 /* Convert string to prefix structure. */
5004 ret = str2prefix (prefix_str, &p);
5005 if (!ret)
5006 {
5007 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
5008 return CMD_WARNING;
5009 }
5010 apply_mask (&p);
5011
5012 /* Get BGP structure. */
5013 bgp = vty->index;
5014
5015 /* Old configuration check. */
5016 rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
5017 if (! rn)
5018 {
5019 vty_out (vty, "%% There is no aggregate-address configuration.%s",
5020 VTY_NEWLINE);
5021 return CMD_WARNING;
5022 }
5023
5024 aggregate = rn->info;
5025 if (aggregate->safi & SAFI_UNICAST)
5026 bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
5027 if (aggregate->safi & SAFI_MULTICAST)
5028 bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5029
5030 /* Unlock aggregate address configuration. */
5031 rn->info = NULL;
5032 bgp_aggregate_free (aggregate);
5033 bgp_unlock_node (rn);
5034 bgp_unlock_node (rn);
5035
5036 return CMD_SUCCESS;
5037 }
5038
5039 DEFUN (aggregate_address,
5040 aggregate_address_cmd,
5041 "aggregate-address A.B.C.D/M",
5042 "Configure BGP aggregate entries\n"
5043 "Aggregate prefix\n")
5044 {
5045 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
5046 }
5047
5048 DEFUN (aggregate_address_mask,
5049 aggregate_address_mask_cmd,
5050 "aggregate-address A.B.C.D A.B.C.D",
5051 "Configure BGP aggregate entries\n"
5052 "Aggregate address\n"
5053 "Aggregate mask\n")
5054 {
5055 int ret;
5056 char prefix_str[BUFSIZ];
5057
5058 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5059
5060 if (! ret)
5061 {
5062 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5063 return CMD_WARNING;
5064 }
5065
5066 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5067 0, 0);
5068 }
5069
5070 DEFUN (aggregate_address_summary_only,
5071 aggregate_address_summary_only_cmd,
5072 "aggregate-address A.B.C.D/M summary-only",
5073 "Configure BGP aggregate entries\n"
5074 "Aggregate prefix\n"
5075 "Filter more specific routes from updates\n")
5076 {
5077 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5078 AGGREGATE_SUMMARY_ONLY, 0);
5079 }
5080
5081 DEFUN (aggregate_address_mask_summary_only,
5082 aggregate_address_mask_summary_only_cmd,
5083 "aggregate-address A.B.C.D A.B.C.D summary-only",
5084 "Configure BGP aggregate entries\n"
5085 "Aggregate address\n"
5086 "Aggregate mask\n"
5087 "Filter more specific routes from updates\n")
5088 {
5089 int ret;
5090 char prefix_str[BUFSIZ];
5091
5092 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5093
5094 if (! ret)
5095 {
5096 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5097 return CMD_WARNING;
5098 }
5099
5100 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5101 AGGREGATE_SUMMARY_ONLY, 0);
5102 }
5103
5104 DEFUN (aggregate_address_as_set,
5105 aggregate_address_as_set_cmd,
5106 "aggregate-address A.B.C.D/M as-set",
5107 "Configure BGP aggregate entries\n"
5108 "Aggregate prefix\n"
5109 "Generate AS set path information\n")
5110 {
5111 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5112 0, AGGREGATE_AS_SET);
5113 }
5114
5115 DEFUN (aggregate_address_mask_as_set,
5116 aggregate_address_mask_as_set_cmd,
5117 "aggregate-address A.B.C.D A.B.C.D as-set",
5118 "Configure BGP aggregate entries\n"
5119 "Aggregate address\n"
5120 "Aggregate mask\n"
5121 "Generate AS set path information\n")
5122 {
5123 int ret;
5124 char prefix_str[BUFSIZ];
5125
5126 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5127
5128 if (! ret)
5129 {
5130 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5131 return CMD_WARNING;
5132 }
5133
5134 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5135 0, AGGREGATE_AS_SET);
5136 }
5137
5138
5139 DEFUN (aggregate_address_as_set_summary,
5140 aggregate_address_as_set_summary_cmd,
5141 "aggregate-address A.B.C.D/M as-set summary-only",
5142 "Configure BGP aggregate entries\n"
5143 "Aggregate prefix\n"
5144 "Generate AS set path information\n"
5145 "Filter more specific routes from updates\n")
5146 {
5147 return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5148 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5149 }
5150
5151 ALIAS (aggregate_address_as_set_summary,
5152 aggregate_address_summary_as_set_cmd,
5153 "aggregate-address A.B.C.D/M summary-only as-set",
5154 "Configure BGP aggregate entries\n"
5155 "Aggregate prefix\n"
5156 "Filter more specific routes from updates\n"
5157 "Generate AS set path information\n")
5158
5159 DEFUN (aggregate_address_mask_as_set_summary,
5160 aggregate_address_mask_as_set_summary_cmd,
5161 "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5162 "Configure BGP aggregate entries\n"
5163 "Aggregate address\n"
5164 "Aggregate mask\n"
5165 "Generate AS set path information\n"
5166 "Filter more specific routes from updates\n")
5167 {
5168 int ret;
5169 char prefix_str[BUFSIZ];
5170
5171 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5172
5173 if (! ret)
5174 {
5175 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5176 return CMD_WARNING;
5177 }
5178
5179 return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5180 AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5181 }
5182
5183 ALIAS (aggregate_address_mask_as_set_summary,
5184 aggregate_address_mask_summary_as_set_cmd,
5185 "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5186 "Configure BGP aggregate entries\n"
5187 "Aggregate address\n"
5188 "Aggregate mask\n"
5189 "Filter more specific routes from updates\n"
5190 "Generate AS set path information\n")
5191
5192 DEFUN (no_aggregate_address,
5193 no_aggregate_address_cmd,
5194 "no aggregate-address A.B.C.D/M",
5195 NO_STR
5196 "Configure BGP aggregate entries\n"
5197 "Aggregate prefix\n")
5198 {
5199 return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5200 }
5201
5202 ALIAS (no_aggregate_address,
5203 no_aggregate_address_summary_only_cmd,
5204 "no aggregate-address A.B.C.D/M summary-only",
5205 NO_STR
5206 "Configure BGP aggregate entries\n"
5207 "Aggregate prefix\n"
5208 "Filter more specific routes from updates\n")
5209
5210 ALIAS (no_aggregate_address,
5211 no_aggregate_address_as_set_cmd,
5212 "no aggregate-address A.B.C.D/M as-set",
5213 NO_STR
5214 "Configure BGP aggregate entries\n"
5215 "Aggregate prefix\n"
5216 "Generate AS set path information\n")
5217
5218 ALIAS (no_aggregate_address,
5219 no_aggregate_address_as_set_summary_cmd,
5220 "no aggregate-address A.B.C.D/M as-set summary-only",
5221 NO_STR
5222 "Configure BGP aggregate entries\n"
5223 "Aggregate prefix\n"
5224 "Generate AS set path information\n"
5225 "Filter more specific routes from updates\n")
5226
5227 ALIAS (no_aggregate_address,
5228 no_aggregate_address_summary_as_set_cmd,
5229 "no aggregate-address A.B.C.D/M summary-only as-set",
5230 NO_STR
5231 "Configure BGP aggregate entries\n"
5232 "Aggregate prefix\n"
5233 "Filter more specific routes from updates\n"
5234 "Generate AS set path information\n")
5235
5236 DEFUN (no_aggregate_address_mask,
5237 no_aggregate_address_mask_cmd,
5238 "no aggregate-address A.B.C.D A.B.C.D",
5239 NO_STR
5240 "Configure BGP aggregate entries\n"
5241 "Aggregate address\n"
5242 "Aggregate mask\n")
5243 {
5244 int ret;
5245 char prefix_str[BUFSIZ];
5246
5247 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5248
5249 if (! ret)
5250 {
5251 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5252 return CMD_WARNING;
5253 }
5254
5255 return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5256 }
5257
5258 ALIAS (no_aggregate_address_mask,
5259 no_aggregate_address_mask_summary_only_cmd,
5260 "no aggregate-address A.B.C.D A.B.C.D summary-only",
5261 NO_STR
5262 "Configure BGP aggregate entries\n"
5263 "Aggregate address\n"
5264 "Aggregate mask\n"
5265 "Filter more specific routes from updates\n")
5266
5267 ALIAS (no_aggregate_address_mask,
5268 no_aggregate_address_mask_as_set_cmd,
5269 "no aggregate-address A.B.C.D A.B.C.D as-set",
5270 NO_STR
5271 "Configure BGP aggregate entries\n"
5272 "Aggregate address\n"
5273 "Aggregate mask\n"
5274 "Generate AS set path information\n")
5275
5276 ALIAS (no_aggregate_address_mask,
5277 no_aggregate_address_mask_as_set_summary_cmd,
5278 "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5279 NO_STR
5280 "Configure BGP aggregate entries\n"
5281 "Aggregate address\n"
5282 "Aggregate mask\n"
5283 "Generate AS set path information\n"
5284 "Filter more specific routes from updates\n")
5285
5286 ALIAS (no_aggregate_address_mask,
5287 no_aggregate_address_mask_summary_as_set_cmd,
5288 "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5289 NO_STR
5290 "Configure BGP aggregate entries\n"
5291 "Aggregate address\n"
5292 "Aggregate mask\n"
5293 "Filter more specific routes from updates\n"
5294 "Generate AS set path information\n")
5295
5296 #ifdef HAVE_IPV6
5297 DEFUN (ipv6_aggregate_address,
5298 ipv6_aggregate_address_cmd,
5299 "aggregate-address X:X::X:X/M",
5300 "Configure BGP aggregate entries\n"
5301 "Aggregate prefix\n")
5302 {
5303 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5304 }
5305
5306 DEFUN (ipv6_aggregate_address_summary_only,
5307 ipv6_aggregate_address_summary_only_cmd,
5308 "aggregate-address X:X::X:X/M summary-only",
5309 "Configure BGP aggregate entries\n"
5310 "Aggregate prefix\n"
5311 "Filter more specific routes from updates\n")
5312 {
5313 return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5314 AGGREGATE_SUMMARY_ONLY, 0);
5315 }
5316
5317 DEFUN (no_ipv6_aggregate_address,
5318 no_ipv6_aggregate_address_cmd,
5319 "no aggregate-address X:X::X:X/M",
5320 NO_STR
5321 "Configure BGP aggregate entries\n"
5322 "Aggregate prefix\n")
5323 {
5324 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5325 }
5326
5327 DEFUN (no_ipv6_aggregate_address_summary_only,
5328 no_ipv6_aggregate_address_summary_only_cmd,
5329 "no aggregate-address X:X::X:X/M summary-only",
5330 NO_STR
5331 "Configure BGP aggregate entries\n"
5332 "Aggregate prefix\n"
5333 "Filter more specific routes from updates\n")
5334 {
5335 return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5336 }
5337
5338 ALIAS (ipv6_aggregate_address,
5339 old_ipv6_aggregate_address_cmd,
5340 "ipv6 bgp aggregate-address X:X::X:X/M",
5341 IPV6_STR
5342 BGP_STR
5343 "Configure BGP aggregate entries\n"
5344 "Aggregate prefix\n")
5345
5346 ALIAS (ipv6_aggregate_address_summary_only,
5347 old_ipv6_aggregate_address_summary_only_cmd,
5348 "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5349 IPV6_STR
5350 BGP_STR
5351 "Configure BGP aggregate entries\n"
5352 "Aggregate prefix\n"
5353 "Filter more specific routes from updates\n")
5354
5355 ALIAS (no_ipv6_aggregate_address,
5356 old_no_ipv6_aggregate_address_cmd,
5357 "no ipv6 bgp aggregate-address X:X::X:X/M",
5358 NO_STR
5359 IPV6_STR
5360 BGP_STR
5361 "Configure BGP aggregate entries\n"
5362 "Aggregate prefix\n")
5363
5364 ALIAS (no_ipv6_aggregate_address_summary_only,
5365 old_no_ipv6_aggregate_address_summary_only_cmd,
5366 "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5367 NO_STR
5368 IPV6_STR
5369 BGP_STR
5370 "Configure BGP aggregate entries\n"
5371 "Aggregate prefix\n"
5372 "Filter more specific routes from updates\n")
5373 #endif /* HAVE_IPV6 */
5374 \f
5375 /* Redistribute route treatment. */
5376 void
5377 bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
5378 u_int32_t metric, u_char type)
5379 {
5380 struct bgp *bgp;
5381 struct listnode *node, *nnode;
5382 struct bgp_info *new;
5383 struct bgp_info *bi;
5384 struct bgp_info info;
5385 struct bgp_node *bn;
5386 struct attr attr = { 0 };
5387 struct attr attr_new = { 0 };
5388 struct attr *new_attr;
5389 afi_t afi;
5390 int ret;
5391
5392 /* Make default attribute. */
5393 bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5394 if (nexthop)
5395 attr.nexthop = *nexthop;
5396
5397 attr.med = metric;
5398 attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5399
5400 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5401 {
5402 afi = family2afi (p->family);
5403
5404 if (bgp->redist[afi][type])
5405 {
5406 /* Copy attribute for modification. */
5407 bgp_attr_dup (&attr_new, &attr);
5408
5409 if (bgp->redist_metric_flag[afi][type])
5410 attr_new.med = bgp->redist_metric[afi][type];
5411
5412 /* Apply route-map. */
5413 if (bgp->rmap[afi][type].map)
5414 {
5415 info.peer = bgp->peer_self;
5416 info.attr = &attr_new;
5417
5418 SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5419
5420 ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5421 &info);
5422
5423 bgp->peer_self->rmap_type = 0;
5424
5425 if (ret == RMAP_DENYMATCH)
5426 {
5427 /* Free uninterned attribute. */
5428 bgp_attr_flush (&attr_new);
5429 bgp_attr_extra_free (&attr_new);
5430
5431 /* Unintern original. */
5432 aspath_unintern (attr.aspath);
5433 bgp_attr_extra_free (&attr);
5434 bgp_redistribute_delete (p, type);
5435 return;
5436 }
5437 }
5438
5439 bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5440 afi, SAFI_UNICAST, p, NULL);
5441
5442 new_attr = bgp_attr_intern (&attr_new);
5443 bgp_attr_extra_free (&attr_new);
5444
5445 for (bi = bn->info; bi; bi = bi->next)
5446 if (bi->peer == bgp->peer_self
5447 && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5448 break;
5449
5450 if (bi)
5451 {
5452 if (attrhash_cmp (bi->attr, new_attr) &&
5453 !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5454 {
5455 bgp_attr_unintern (new_attr);
5456 aspath_unintern (attr.aspath);
5457 bgp_attr_extra_free (&attr);
5458 bgp_unlock_node (bn);
5459 return;
5460 }
5461 else
5462 {
5463 /* The attribute is changed. */
5464 bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
5465
5466 /* Rewrite BGP route information. */
5467 if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5468 bgp_info_restore(bn, bi);
5469 else
5470 bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
5471 bgp_attr_unintern (bi->attr);
5472 bi->attr = new_attr;
5473 bi->uptime = time (NULL);
5474
5475 /* Process change. */
5476 bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5477 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5478 bgp_unlock_node (bn);
5479 aspath_unintern (attr.aspath);
5480 bgp_attr_extra_free (&attr);
5481 return;
5482 }
5483 }
5484
5485 new = bgp_info_new ();
5486 new->type = type;
5487 new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5488 new->peer = bgp->peer_self;
5489 SET_FLAG (new->flags, BGP_INFO_VALID);
5490 new->attr = new_attr;
5491 new->uptime = time (NULL);
5492
5493 bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5494 bgp_info_add (bn, new);
5495 bgp_unlock_node (bn);
5496 bgp_process (bgp, bn, afi, SAFI_UNICAST);
5497 }
5498 }
5499
5500 /* Unintern original. */
5501 aspath_unintern (attr.aspath);
5502 bgp_attr_extra_free (&attr);
5503 }
5504
5505 void
5506 bgp_redistribute_delete (struct prefix *p, u_char type)
5507 {
5508 struct bgp *bgp;
5509 struct listnode *node, *nnode;
5510 afi_t afi;
5511 struct bgp_node *rn;
5512 struct bgp_info *ri;
5513
5514 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5515 {
5516 afi = family2afi (p->family);
5517
5518 if (bgp->redist[afi][type])
5519 {
5520 rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
5521
5522 for (ri = rn->info; ri; ri = ri->next)
5523 if (ri->peer == bgp->peer_self
5524 && ri->type == type)
5525 break;
5526
5527 if (ri)
5528 {
5529 bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
5530 bgp_info_delete (rn, ri);
5531 bgp_process (bgp, rn, afi, SAFI_UNICAST);
5532 }
5533 bgp_unlock_node (rn);
5534 }
5535 }
5536 }
5537
5538 /* Withdraw specified route type's route. */
5539 void
5540 bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5541 {
5542 struct bgp_node *rn;
5543 struct bgp_info *ri;
5544 struct bgp_table *table;
5545
5546 table = bgp->rib[afi][SAFI_UNICAST];
5547
5548 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5549 {
5550 for (ri = rn->info; ri; ri = ri->next)
5551 if (ri->peer == bgp->peer_self
5552 && ri->type == type)
5553 break;
5554
5555 if (ri)
5556 {
5557 bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
5558 bgp_info_delete (rn, ri);
5559 bgp_process (bgp, rn, afi, SAFI_UNICAST);
5560 }
5561 }
5562 }
5563 \f
5564 /* Static function to display route. */
5565 static void
5566 route_vty_out_route (struct prefix *p, struct vty *vty)
5567 {
5568 int len;
5569 u_int32_t destination;
5570 char buf[BUFSIZ];
5571
5572 if (p->family == AF_INET)
5573 {
5574 len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5575 destination = ntohl (p->u.prefix4.s_addr);
5576
5577 if ((IN_CLASSC (destination) && p->prefixlen == 24)
5578 || (IN_CLASSB (destination) && p->prefixlen == 16)
5579 || (IN_CLASSA (destination) && p->prefixlen == 8)
5580 || p->u.prefix4.s_addr == 0)
5581 {
5582 /* When mask is natural, mask is not displayed. */
5583 }
5584 else
5585 len += vty_out (vty, "/%d", p->prefixlen);
5586 }
5587 else
5588 len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5589 p->prefixlen);
5590
5591 len = 17 - len;
5592 if (len < 1)
5593 vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5594 else
5595 vty_out (vty, "%*s", len, " ");
5596 }
5597
5598 enum bgp_display_type
5599 {
5600 normal_list,
5601 };
5602
5603 /* Print the short form route status for a bgp_info */
5604 static void
5605 route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
5606 {
5607 /* Route status display. */
5608 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5609 vty_out (vty, "R");
5610 else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5611 vty_out (vty, "S");
5612 else if (binfo->extra && binfo->extra->suppress)
5613 vty_out (vty, "s");
5614 else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5615 vty_out (vty, "*");
5616 else
5617 vty_out (vty, " ");
5618
5619 /* Selected */
5620 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5621 vty_out (vty, "h");
5622 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5623 vty_out (vty, "d");
5624 else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5625 vty_out (vty, ">");
5626 else
5627 vty_out (vty, " ");
5628
5629 /* Internal route. */
5630 if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5631 vty_out (vty, "i");
5632 else
5633 vty_out (vty, " ");
5634 }
5635
5636 /* called from terminal list command */
5637 void
5638 route_vty_out (struct vty *vty, struct prefix *p,
5639 struct bgp_info *binfo, int display, safi_t safi)
5640 {
5641 struct attr *attr;
5642
5643 /* short status lead text */
5644 route_vty_short_status_out (vty, binfo);
5645
5646 /* print prefix and mask */
5647 if (! display)
5648 route_vty_out_route (p, vty);
5649 else
5650 vty_out (vty, "%*s", 17, " ");
5651
5652 /* Print attribute */
5653 attr = binfo->attr;
5654 if (attr)
5655 {
5656 if (p->family == AF_INET)
5657 {
5658 if (safi == SAFI_MPLS_VPN)
5659 vty_out (vty, "%-16s",
5660 inet_ntoa (attr->extra->mp_nexthop_global_in));
5661 else
5662 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5663 }
5664 #ifdef HAVE_IPV6
5665 else if (p->family == AF_INET6)
5666 {
5667 int len;
5668 char buf[BUFSIZ];
5669
5670 len = vty_out (vty, "%s",
5671 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5672 buf, BUFSIZ));
5673 len = 16 - len;
5674 if (len < 1)
5675 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5676 else
5677 vty_out (vty, "%*s", len, " ");
5678 }
5679 #endif /* HAVE_IPV6 */
5680
5681 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5682 vty_out (vty, "%10d", attr->med);
5683 else
5684 vty_out (vty, " ");
5685
5686 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5687 vty_out (vty, "%7d", attr->local_pref);
5688 else
5689 vty_out (vty, " ");
5690
5691 vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
5692
5693 /* Print aspath */
5694 if (attr->aspath)
5695 aspath_print_vty (vty, "%s", attr->aspath, " ");
5696
5697 /* Print origin */
5698 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5699 }
5700 vty_out (vty, "%s", VTY_NEWLINE);
5701 }
5702
5703 /* called from terminal list command */
5704 void
5705 route_vty_out_tmp (struct vty *vty, struct prefix *p,
5706 struct attr *attr, safi_t safi)
5707 {
5708 /* Route status display. */
5709 vty_out (vty, "*");
5710 vty_out (vty, ">");
5711 vty_out (vty, " ");
5712
5713 /* print prefix and mask */
5714 route_vty_out_route (p, vty);
5715
5716 /* Print attribute */
5717 if (attr)
5718 {
5719 if (p->family == AF_INET)
5720 {
5721 if (safi == SAFI_MPLS_VPN)
5722 vty_out (vty, "%-16s",
5723 inet_ntoa (attr->extra->mp_nexthop_global_in));
5724 else
5725 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5726 }
5727 #ifdef HAVE_IPV6
5728 else if (p->family == AF_INET6)
5729 {
5730 int len;
5731 char buf[BUFSIZ];
5732
5733 assert (attr->extra);
5734
5735 len = vty_out (vty, "%s",
5736 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5737 buf, BUFSIZ));
5738 len = 16 - len;
5739 if (len < 1)
5740 vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5741 else
5742 vty_out (vty, "%*s", len, " ");
5743 }
5744 #endif /* HAVE_IPV6 */
5745
5746 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5747 vty_out (vty, "%10d", attr->med);
5748 else
5749 vty_out (vty, " ");
5750
5751 if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5752 vty_out (vty, "%7d", attr->local_pref);
5753 else
5754 vty_out (vty, " ");
5755
5756 vty_out (vty, "%7d ", (attr->extra ? attr->extra->weight : 0));
5757
5758 /* Print aspath */
5759 if (attr->aspath)
5760 aspath_print_vty (vty, "%s", attr->aspath, " ");
5761
5762 /* Print origin */
5763 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5764 }
5765
5766 vty_out (vty, "%s", VTY_NEWLINE);
5767 }
5768
5769 void
5770 route_vty_out_tag (struct vty *vty, struct prefix *p,
5771 struct bgp_info *binfo, int display, safi_t safi)
5772 {
5773 struct attr *attr;
5774 u_int32_t label = 0;
5775
5776 if (!binfo->extra)
5777 return;
5778
5779 /* short status lead text */
5780 route_vty_short_status_out (vty, binfo);
5781
5782 /* print prefix and mask */
5783 if (! display)
5784 route_vty_out_route (p, vty);
5785 else
5786 vty_out (vty, "%*s", 17, " ");
5787
5788 /* Print attribute */
5789 attr = binfo->attr;
5790 if (attr)
5791 {
5792 if (p->family == AF_INET)
5793 {
5794 if (safi == SAFI_MPLS_VPN)
5795 vty_out (vty, "%-16s",
5796 inet_ntoa (attr->extra->mp_nexthop_global_in));
5797 else
5798 vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5799 }
5800 #ifdef HAVE_IPV6
5801 else if (p->family == AF_INET6)
5802 {
5803 assert (attr->extra);
5804 char buf[BUFSIZ];
5805 char buf1[BUFSIZ];
5806 if (attr->extra->mp_nexthop_len == 16)
5807 vty_out (vty, "%s",
5808 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5809 buf, BUFSIZ));
5810 else if (attr->extra->mp_nexthop_len == 32)
5811 vty_out (vty, "%s(%s)",
5812 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5813 buf, BUFSIZ),
5814 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5815 buf1, BUFSIZ));
5816
5817 }
5818 #endif /* HAVE_IPV6 */
5819 }
5820
5821 label = decode_label (binfo->extra->tag);
5822
5823 vty_out (vty, "notag/%d", label);
5824
5825 vty_out (vty, "%s", VTY_NEWLINE);
5826 }
5827
5828 /* dampening route */
5829 static void
5830 damp_route_vty_out (struct vty *vty, struct prefix *p,
5831 struct bgp_info *binfo, int display, safi_t safi)
5832 {
5833 struct attr *attr;
5834 int len;
5835
5836 /* short status lead text */
5837 route_vty_short_status_out (vty, binfo);
5838
5839 /* print prefix and mask */
5840 if (! display)
5841 route_vty_out_route (p, vty);
5842 else
5843 vty_out (vty, "%*s", 17, " ");
5844
5845 len = vty_out (vty, "%s", binfo->peer->host);
5846 len = 17 - len;
5847 if (len < 1)
5848 vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5849 else
5850 vty_out (vty, "%*s", len, " ");
5851
5852 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo));
5853
5854 /* Print attribute */
5855 attr = binfo->attr;
5856 if (attr)
5857 {
5858 /* Print aspath */
5859 if (attr->aspath)
5860 aspath_print_vty (vty, "%s", attr->aspath, " ");
5861
5862 /* Print origin */
5863 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5864 }
5865 vty_out (vty, "%s", VTY_NEWLINE);
5866 }
5867
5868 #define BGP_UPTIME_LEN 25
5869
5870 /* flap route */
5871 static void
5872 flap_route_vty_out (struct vty *vty, struct prefix *p,
5873 struct bgp_info *binfo, int display, safi_t safi)
5874 {
5875 struct attr *attr;
5876 struct bgp_damp_info *bdi;
5877 char timebuf[BGP_UPTIME_LEN];
5878 int len;
5879
5880 if (!binfo->extra)
5881 return;
5882
5883 bdi = binfo->extra->damp_info;
5884
5885 /* short status lead text */
5886 route_vty_short_status_out (vty, binfo);
5887
5888 /* print prefix and mask */
5889 if (! display)
5890 route_vty_out_route (p, vty);
5891 else
5892 vty_out (vty, "%*s", 17, " ");
5893
5894 len = vty_out (vty, "%s", binfo->peer->host);
5895 len = 16 - len;
5896 if (len < 1)
5897 vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5898 else
5899 vty_out (vty, "%*s", len, " ");
5900
5901 len = vty_out (vty, "%d", bdi->flap);
5902 len = 5 - len;
5903 if (len < 1)
5904 vty_out (vty, " ");
5905 else
5906 vty_out (vty, "%*s ", len, " ");
5907
5908 vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5909 timebuf, BGP_UPTIME_LEN));
5910
5911 if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5912 && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5913 vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo));
5914 else
5915 vty_out (vty, "%*s ", 8, " ");
5916
5917 /* Print attribute */
5918 attr = binfo->attr;
5919 if (attr)
5920 {
5921 /* Print aspath */
5922 if (attr->aspath)
5923 aspath_print_vty (vty, "%s", attr->aspath, " ");
5924
5925 /* Print origin */
5926 vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5927 }
5928 vty_out (vty, "%s", VTY_NEWLINE);
5929 }
5930
5931 static void
5932 route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5933 struct bgp_info *binfo, afi_t afi, safi_t safi)
5934 {
5935 char buf[INET6_ADDRSTRLEN];
5936 char buf1[BUFSIZ];
5937 struct attr *attr;
5938 int sockunion_vty_out (struct vty *, union sockunion *);
5939
5940 attr = binfo->attr;
5941
5942 if (attr)
5943 {
5944 /* Line1 display AS-path, Aggregator */
5945 if (attr->aspath)
5946 {
5947 vty_out (vty, " ");
5948 if (aspath_count_hops (attr->aspath) == 0)
5949 vty_out (vty, "Local");
5950 else
5951 aspath_print_vty (vty, "%s", attr->aspath, "");
5952 }
5953
5954 if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5955 vty_out (vty, ", (removed)");
5956 if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5957 vty_out (vty, ", (stale)");
5958 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
5959 vty_out (vty, ", (aggregated by %d %s)",
5960 attr->extra->aggregator_as,
5961 inet_ntoa (attr->extra->aggregator_addr));
5962 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5963 vty_out (vty, ", (Received from a RR-client)");
5964 if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5965 vty_out (vty, ", (Received from a RS-client)");
5966 if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5967 vty_out (vty, ", (history entry)");
5968 else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5969 vty_out (vty, ", (suppressed due to dampening)");
5970 vty_out (vty, "%s", VTY_NEWLINE);
5971
5972 /* Line2 display Next-hop, Neighbor, Router-id */
5973 if (p->family == AF_INET)
5974 {
5975 vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
5976 inet_ntoa (attr->extra->mp_nexthop_global_in) :
5977 inet_ntoa (attr->nexthop));
5978 }
5979 #ifdef HAVE_IPV6
5980 else
5981 {
5982 assert (attr->extra);
5983 vty_out (vty, " %s",
5984 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5985 buf, INET6_ADDRSTRLEN));
5986 }
5987 #endif /* HAVE_IPV6 */
5988
5989 if (binfo->peer == bgp->peer_self)
5990 {
5991 vty_out (vty, " from %s ",
5992 p->family == AF_INET ? "0.0.0.0" : "::");
5993 vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5994 }
5995 else
5996 {
5997 if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5998 vty_out (vty, " (inaccessible)");
5999 else if (binfo->extra && binfo->extra->igpmetric)
6000 vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
6001 vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
6002 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6003 vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
6004 else
6005 vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
6006 }
6007 vty_out (vty, "%s", VTY_NEWLINE);
6008
6009 #ifdef HAVE_IPV6
6010 /* display nexthop local */
6011 if (attr->extra && attr->extra->mp_nexthop_len == 32)
6012 {
6013 vty_out (vty, " (%s)%s",
6014 inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
6015 buf, INET6_ADDRSTRLEN),
6016 VTY_NEWLINE);
6017 }
6018 #endif /* HAVE_IPV6 */
6019
6020 /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
6021 vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
6022
6023 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
6024 vty_out (vty, ", metric %d", attr->med);
6025
6026 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
6027 vty_out (vty, ", localpref %d", attr->local_pref);
6028 else
6029 vty_out (vty, ", localpref %d", bgp->default_local_pref);
6030
6031 if (attr->extra && attr->extra->weight != 0)
6032 vty_out (vty, ", weight %d", attr->extra->weight);
6033
6034 if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6035 vty_out (vty, ", valid");
6036
6037 if (binfo->peer != bgp->peer_self)
6038 {
6039 if (binfo->peer->as == binfo->peer->local_as)
6040 vty_out (vty, ", internal");
6041 else
6042 vty_out (vty, ", %s",
6043 (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
6044 }
6045 else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
6046 vty_out (vty, ", aggregated, local");
6047 else if (binfo->type != ZEBRA_ROUTE_BGP)
6048 vty_out (vty, ", sourced");
6049 else
6050 vty_out (vty, ", sourced, local");
6051
6052 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
6053 vty_out (vty, ", atomic-aggregate");
6054
6055 if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
6056 vty_out (vty, ", best");
6057
6058 vty_out (vty, "%s", VTY_NEWLINE);
6059
6060 /* Line 4 display Community */
6061 if (attr->community)
6062 vty_out (vty, " Community: %s%s", attr->community->str,
6063 VTY_NEWLINE);
6064
6065 /* Line 5 display Extended-community */
6066 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
6067 vty_out (vty, " Extended Community: %s%s",
6068 attr->extra->ecommunity->str, VTY_NEWLINE);
6069
6070 /* Line 6 display Originator, Cluster-id */
6071 if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
6072 (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
6073 {
6074 assert (attr->extra);
6075 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6076 vty_out (vty, " Originator: %s",
6077 inet_ntoa (attr->extra->originator_id));
6078
6079 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
6080 {
6081 int i;
6082 vty_out (vty, ", Cluster list: ");
6083 for (i = 0; i < attr->extra->cluster->length / 4; i++)
6084 vty_out (vty, "%s ",
6085 inet_ntoa (attr->extra->cluster->list[i]));
6086 }
6087 vty_out (vty, "%s", VTY_NEWLINE);
6088 }
6089
6090 /* 7: AS Pathlimit */
6091 if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_AS_PATHLIMIT))
6092 {
6093
6094 vty_out (vty, " AS-Pathlimit: %u",
6095 attr->pathlimit.ttl);
6096 if (attr->pathlimit.as)
6097 vty_out (vty, " (%u)", attr->pathlimit.as);
6098 vty_out (vty, "%s", VTY_NEWLINE);
6099 }
6100
6101 if (binfo->extra && binfo->extra->damp_info)
6102 bgp_damp_info_vty (vty, binfo);
6103
6104 /* Line 7 display Uptime */
6105 vty_out (vty, " Last update: %s", ctime (&binfo->uptime));
6106 }
6107 vty_out (vty, "%s", VTY_NEWLINE);
6108 }
6109 \f
6110 #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"
6111 #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
6112 #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
6113 #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
6114 #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
6115
6116 enum bgp_show_type
6117 {
6118 bgp_show_type_normal,
6119 bgp_show_type_regexp,
6120 bgp_show_type_prefix_list,
6121 bgp_show_type_filter_list,
6122 bgp_show_type_route_map,
6123 bgp_show_type_neighbor,
6124 bgp_show_type_cidr_only,
6125 bgp_show_type_prefix_longer,
6126 bgp_show_type_community_all,
6127 bgp_show_type_community,
6128 bgp_show_type_community_exact,
6129 bgp_show_type_community_list,
6130 bgp_show_type_community_list_exact,
6131 bgp_show_type_flap_statistics,
6132 bgp_show_type_flap_address,
6133 bgp_show_type_flap_prefix,
6134 bgp_show_type_flap_cidr_only,
6135 bgp_show_type_flap_regexp,
6136 bgp_show_type_flap_filter_list,
6137 bgp_show_type_flap_prefix_list,
6138 bgp_show_type_flap_prefix_longer,
6139 bgp_show_type_flap_route_map,
6140 bgp_show_type_flap_neighbor,
6141 bgp_show_type_dampend_paths,
6142 bgp_show_type_damp_neighbor
6143 };
6144
6145 static int
6146 bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
6147 enum bgp_show_type type, void *output_arg)
6148 {
6149 struct bgp_info *ri;
6150 struct bgp_node *rn;
6151 int header = 1;
6152 int display;
6153 unsigned long output_count;
6154
6155 /* This is first entry point, so reset total line. */
6156 output_count = 0;
6157
6158 /* Start processing of routes. */
6159 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6160 if (rn->info != NULL)
6161 {
6162 display = 0;
6163
6164 for (ri = rn->info; ri; ri = ri->next)
6165 {
6166 if (type == bgp_show_type_flap_statistics
6167 || type == bgp_show_type_flap_address
6168 || type == bgp_show_type_flap_prefix
6169 || type == bgp_show_type_flap_cidr_only
6170 || type == bgp_show_type_flap_regexp
6171 || type == bgp_show_type_flap_filter_list
6172 || type == bgp_show_type_flap_prefix_list
6173 || type == bgp_show_type_flap_prefix_longer
6174 || type == bgp_show_type_flap_route_map
6175 || type == bgp_show_type_flap_neighbor
6176 || type == bgp_show_type_dampend_paths
6177 || type == bgp_show_type_damp_neighbor)
6178 {
6179 if (!(ri->extra && ri->extra->damp_info))
6180 continue;
6181 }
6182 if (type == bgp_show_type_regexp
6183 || type == bgp_show_type_flap_regexp)
6184 {
6185 regex_t *regex = output_arg;
6186
6187 if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6188 continue;
6189 }
6190 if (type == bgp_show_type_prefix_list
6191 || type == bgp_show_type_flap_prefix_list)
6192 {
6193 struct prefix_list *plist = output_arg;
6194
6195 if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6196 continue;
6197 }
6198 if (type == bgp_show_type_filter_list
6199 || type == bgp_show_type_flap_filter_list)
6200 {
6201 struct as_list *as_list = output_arg;
6202
6203 if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6204 continue;
6205 }
6206 if (type == bgp_show_type_route_map
6207 || type == bgp_show_type_flap_route_map)
6208 {
6209 struct route_map *rmap = output_arg;
6210 struct bgp_info binfo;
6211 struct attr dummy_attr = { 0 };
6212 int ret;
6213
6214 bgp_attr_dup (&dummy_attr, ri->attr);
6215 binfo.peer = ri->peer;
6216 binfo.attr = &dummy_attr;
6217
6218 ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
6219
6220 bgp_attr_extra_free (&dummy_attr);
6221
6222 if (ret == RMAP_DENYMATCH)
6223 continue;
6224 }
6225 if (type == bgp_show_type_neighbor
6226 || type == bgp_show_type_flap_neighbor
6227 || type == bgp_show_type_damp_neighbor)
6228 {
6229 union sockunion *su = output_arg;
6230
6231 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6232 continue;
6233 }
6234 if (type == bgp_show_type_cidr_only
6235 || type == bgp_show_type_flap_cidr_only)
6236 {
6237 u_int32_t destination;
6238
6239 destination = ntohl (rn->p.u.prefix4.s_addr);
6240 if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6241 continue;
6242 if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6243 continue;
6244 if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6245 continue;
6246 }
6247 if (type == bgp_show_type_prefix_longer
6248 || type == bgp_show_type_flap_prefix_longer)
6249 {
6250 struct prefix *p = output_arg;
6251
6252 if (! prefix_match (p, &rn->p))
6253 continue;
6254 }
6255 if (type == bgp_show_type_community_all)
6256 {
6257 if (! ri->attr->community)
6258 continue;
6259 }
6260 if (type == bgp_show_type_community)
6261 {
6262 struct community *com = output_arg;
6263
6264 if (! ri->attr->community ||
6265 ! community_match (ri->attr->community, com))
6266 continue;
6267 }
6268 if (type == bgp_show_type_community_exact)
6269 {
6270 struct community *com = output_arg;
6271
6272 if (! ri->attr->community ||
6273 ! community_cmp (ri->attr->community, com))
6274 continue;
6275 }
6276 if (type == bgp_show_type_community_list)
6277 {
6278 struct community_list *list = output_arg;
6279
6280 if (! community_list_match (ri->attr->community, list))
6281 continue;
6282 }
6283 if (type == bgp_show_type_community_list_exact)
6284 {
6285 struct community_list *list = output_arg;
6286
6287 if (! community_list_exact_match (ri->attr->community, list))
6288 continue;
6289 }
6290 if (type == bgp_show_type_flap_address
6291 || type == bgp_show_type_flap_prefix)
6292 {
6293 struct prefix *p = output_arg;
6294
6295 if (! prefix_match (&rn->p, p))
6296 continue;
6297
6298 if (type == bgp_show_type_flap_prefix)
6299 if (p->prefixlen != rn->p.prefixlen)
6300 continue;
6301 }
6302 if (type == bgp_show_type_dampend_paths
6303 || type == bgp_show_type_damp_neighbor)
6304 {
6305 if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6306 || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6307 continue;
6308 }
6309
6310 if (header)
6311 {
6312 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6313 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6314 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6315 if (type == bgp_show_type_dampend_paths
6316 || type == bgp_show_type_damp_neighbor)
6317 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6318 else if (type == bgp_show_type_flap_statistics
6319 || type == bgp_show_type_flap_address
6320 || type == bgp_show_type_flap_prefix
6321 || type == bgp_show_type_flap_cidr_only
6322 || type == bgp_show_type_flap_regexp
6323 || type == bgp_show_type_flap_filter_list
6324 || type == bgp_show_type_flap_prefix_list
6325 || type == bgp_show_type_flap_prefix_longer
6326 || type == bgp_show_type_flap_route_map
6327 || type == bgp_show_type_flap_neighbor)
6328 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6329 else
6330 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
6331 header = 0;
6332 }
6333
6334 if (type == bgp_show_type_dampend_paths
6335 || type == bgp_show_type_damp_neighbor)
6336 damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6337 else if (type == bgp_show_type_flap_statistics
6338 || type == bgp_show_type_flap_address
6339 || type == bgp_show_type_flap_prefix
6340 || type == bgp_show_type_flap_cidr_only
6341 || type == bgp_show_type_flap_regexp
6342 || type == bgp_show_type_flap_filter_list
6343 || type == bgp_show_type_flap_prefix_list
6344 || type == bgp_show_type_flap_prefix_longer
6345 || type == bgp_show_type_flap_route_map
6346 || type == bgp_show_type_flap_neighbor)
6347 flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6348 else
6349 route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6350 display++;
6351 }
6352 if (display)
6353 output_count++;
6354 }
6355
6356 /* No route is displayed */
6357 if (output_count == 0)
6358 {
6359 if (type == bgp_show_type_normal)
6360 vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6361 }
6362 else
6363 vty_out (vty, "%sTotal number of prefixes %ld%s",
6364 VTY_NEWLINE, output_count, VTY_NEWLINE);
6365
6366 return CMD_SUCCESS;
6367 }
6368
6369 static int
6370 bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
6371 enum bgp_show_type type, void *output_arg)
6372 {
6373 struct bgp_table *table;
6374
6375 if (bgp == NULL) {
6376 bgp = bgp_get_default ();
6377 }
6378
6379 if (bgp == NULL)
6380 {
6381 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6382 return CMD_WARNING;
6383 }
6384
6385
6386 table = bgp->rib[afi][safi];
6387
6388 return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
6389 }
6390
6391 /* Header of detailed BGP route information */
6392 static void
6393 route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6394 struct bgp_node *rn,
6395 struct prefix_rd *prd, afi_t afi, safi_t safi)
6396 {
6397 struct bgp_info *ri;
6398 struct prefix *p;
6399 struct peer *peer;
6400 struct listnode *node, *nnode;
6401 char buf1[INET6_ADDRSTRLEN];
6402 char buf2[INET6_ADDRSTRLEN];
6403 int count = 0;
6404 int best = 0;
6405 int suppress = 0;
6406 int no_export = 0;
6407 int no_advertise = 0;
6408 int local_as = 0;
6409 int first = 0;
6410
6411 p = &rn->p;
6412 vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6413 (safi == SAFI_MPLS_VPN ?
6414 prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6415 safi == SAFI_MPLS_VPN ? ":" : "",
6416 inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6417 p->prefixlen, VTY_NEWLINE);
6418
6419 for (ri = rn->info; ri; ri = ri->next)
6420 {
6421 count++;
6422 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6423 {
6424 best = count;
6425 if (ri->extra && ri->extra->suppress)
6426 suppress = 1;
6427 if (ri->attr->community != NULL)
6428 {
6429 if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6430 no_advertise = 1;
6431 if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6432 no_export = 1;
6433 if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6434 local_as = 1;
6435 }
6436 }
6437 }
6438
6439 vty_out (vty, "Paths: (%d available", count);
6440 if (best)
6441 {
6442 vty_out (vty, ", best #%d", best);
6443 if (safi == SAFI_UNICAST)
6444 vty_out (vty, ", table Default-IP-Routing-Table");
6445 }
6446 else
6447 vty_out (vty, ", no best path");
6448 if (no_advertise)
6449 vty_out (vty, ", not advertised to any peer");
6450 else if (no_export)
6451 vty_out (vty, ", not advertised to EBGP peer");
6452 else if (local_as)
6453 vty_out (vty, ", not advertised outside local AS");
6454 if (suppress)
6455 vty_out (vty, ", Advertisements suppressed by an aggregate.");
6456 vty_out (vty, ")%s", VTY_NEWLINE);
6457
6458 /* advertised peer */
6459 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6460 {
6461 if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6462 {
6463 if (! first)
6464 vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6465 vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6466 first = 1;
6467 }
6468 }
6469 if (! first)
6470 vty_out (vty, " Not advertised to any peer");
6471 vty_out (vty, "%s", VTY_NEWLINE);
6472 }
6473
6474 /* Display specified route of BGP table. */
6475 static int
6476 bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
6477 struct bgp_table *rib, const char *ip_str,
6478 afi_t afi, safi_t safi, struct prefix_rd *prd,
6479 int prefix_check)
6480 {
6481 int ret;
6482 int header;
6483 int display = 0;
6484 struct prefix match;
6485 struct bgp_node *rn;
6486 struct bgp_node *rm;
6487 struct bgp_info *ri;
6488 struct bgp_table *table;
6489
6490 /* Check IP address argument. */
6491 ret = str2prefix (ip_str, &match);
6492 if (! ret)
6493 {
6494 vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6495 return CMD_WARNING;
6496 }
6497
6498 match.family = afi2family (afi);
6499
6500 if (safi == SAFI_MPLS_VPN)
6501 {
6502 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
6503 {
6504 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6505 continue;
6506
6507 if ((table = rn->info) != NULL)
6508 {
6509 header = 1;
6510
6511 if ((rm = bgp_node_match (table, &match)) != NULL)
6512 {
6513 if (prefix_check && rm->p.prefixlen != match.prefixlen)
6514 continue;
6515
6516 for (ri = rm->info; ri; ri = ri->next)
6517 {
6518 if (header)
6519 {
6520 route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6521 AFI_IP, SAFI_MPLS_VPN);
6522
6523 header = 0;
6524 }
6525 display++;
6526 route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6527 }
6528 }
6529 }
6530 }
6531 }
6532 else
6533 {
6534 header = 1;
6535
6536 if ((rn = bgp_node_match (rib, &match)) != NULL)
6537 {
6538 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6539 {
6540 for (ri = rn->info; ri; ri = ri->next)
6541 {
6542 if (header)
6543 {
6544 route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6545 header = 0;
6546 }
6547 display++;
6548 route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6549 }
6550 }
6551 }
6552 }
6553
6554 if (! display)
6555 {
6556 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6557 return CMD_WARNING;
6558 }
6559
6560 return CMD_SUCCESS;
6561 }
6562
6563 /* Display specified route of Main RIB */
6564 static int
6565 bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
6566 afi_t afi, safi_t safi, struct prefix_rd *prd,
6567 int prefix_check)
6568 {
6569 struct bgp *bgp;
6570
6571 /* BGP structure lookup. */
6572 if (view_name)
6573 {
6574 bgp = bgp_lookup_by_name (view_name);
6575 if (bgp == NULL)
6576 {
6577 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6578 return CMD_WARNING;
6579 }
6580 }
6581 else
6582 {
6583 bgp = bgp_get_default ();
6584 if (bgp == NULL)
6585 {
6586 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6587 return CMD_WARNING;
6588 }
6589 }
6590
6591 return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6592 afi, safi, prd, prefix_check);
6593 }
6594
6595 /* BGP route print out function. */
6596 DEFUN (show_ip_bgp,
6597 show_ip_bgp_cmd,
6598 "show ip bgp",
6599 SHOW_STR
6600 IP_STR
6601 BGP_STR)
6602 {
6603 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6604 }
6605
6606 DEFUN (show_ip_bgp_ipv4,
6607 show_ip_bgp_ipv4_cmd,
6608 "show ip bgp ipv4 (unicast|multicast)",
6609 SHOW_STR
6610 IP_STR
6611 BGP_STR
6612 "Address family\n"
6613 "Address Family modifier\n"
6614 "Address Family modifier\n")
6615 {
6616 if (strncmp (argv[0], "m", 1) == 0)
6617 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6618 NULL);
6619
6620 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6621 }
6622
6623 DEFUN (show_ip_bgp_route,
6624 show_ip_bgp_route_cmd,
6625 "show ip bgp A.B.C.D",
6626 SHOW_STR
6627 IP_STR
6628 BGP_STR
6629 "Network in the BGP routing table to display\n")
6630 {
6631 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6632 }
6633
6634 DEFUN (show_ip_bgp_ipv4_route,
6635 show_ip_bgp_ipv4_route_cmd,
6636 "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6637 SHOW_STR
6638 IP_STR
6639 BGP_STR
6640 "Address family\n"
6641 "Address Family modifier\n"
6642 "Address Family modifier\n"
6643 "Network in the BGP routing table to display\n")
6644 {
6645 if (strncmp (argv[0], "m", 1) == 0)
6646 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6647
6648 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6649 }
6650
6651 DEFUN (show_ip_bgp_vpnv4_all_route,
6652 show_ip_bgp_vpnv4_all_route_cmd,
6653 "show ip bgp vpnv4 all A.B.C.D",
6654 SHOW_STR
6655 IP_STR
6656 BGP_STR
6657 "Display VPNv4 NLRI specific information\n"
6658 "Display information about all VPNv4 NLRIs\n"
6659 "Network in the BGP routing table to display\n")
6660 {
6661 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6662 }
6663
6664 DEFUN (show_ip_bgp_vpnv4_rd_route,
6665 show_ip_bgp_vpnv4_rd_route_cmd,
6666 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6667 SHOW_STR
6668 IP_STR
6669 BGP_STR
6670 "Display VPNv4 NLRI specific information\n"
6671 "Display information for a route distinguisher\n"
6672 "VPN Route Distinguisher\n"
6673 "Network in the BGP routing table to display\n")
6674 {
6675 int ret;
6676 struct prefix_rd prd;
6677
6678 ret = str2prefix_rd (argv[0], &prd);
6679 if (! ret)
6680 {
6681 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6682 return CMD_WARNING;
6683 }
6684 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6685 }
6686
6687 DEFUN (show_ip_bgp_prefix,
6688 show_ip_bgp_prefix_cmd,
6689 "show ip bgp A.B.C.D/M",
6690 SHOW_STR
6691 IP_STR
6692 BGP_STR
6693 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6694 {
6695 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6696 }
6697
6698 DEFUN (show_ip_bgp_ipv4_prefix,
6699 show_ip_bgp_ipv4_prefix_cmd,
6700 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6701 SHOW_STR
6702 IP_STR
6703 BGP_STR
6704 "Address family\n"
6705 "Address Family modifier\n"
6706 "Address Family modifier\n"
6707 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6708 {
6709 if (strncmp (argv[0], "m", 1) == 0)
6710 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6711
6712 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6713 }
6714
6715 DEFUN (show_ip_bgp_vpnv4_all_prefix,
6716 show_ip_bgp_vpnv4_all_prefix_cmd,
6717 "show ip bgp vpnv4 all A.B.C.D/M",
6718 SHOW_STR
6719 IP_STR
6720 BGP_STR
6721 "Display VPNv4 NLRI specific information\n"
6722 "Display information about all VPNv4 NLRIs\n"
6723 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6724 {
6725 return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6726 }
6727
6728 DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6729 show_ip_bgp_vpnv4_rd_prefix_cmd,
6730 "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6731 SHOW_STR
6732 IP_STR
6733 BGP_STR
6734 "Display VPNv4 NLRI specific information\n"
6735 "Display information for a route distinguisher\n"
6736 "VPN Route Distinguisher\n"
6737 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6738 {
6739 int ret;
6740 struct prefix_rd prd;
6741
6742 ret = str2prefix_rd (argv[0], &prd);
6743 if (! ret)
6744 {
6745 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6746 return CMD_WARNING;
6747 }
6748 return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6749 }
6750
6751 DEFUN (show_ip_bgp_view,
6752 show_ip_bgp_view_cmd,
6753 "show ip bgp view WORD",
6754 SHOW_STR
6755 IP_STR
6756 BGP_STR
6757 "BGP view\n"
6758 "BGP view name\n")
6759 {
6760 struct bgp *bgp;
6761
6762 /* BGP structure lookup. */
6763 bgp = bgp_lookup_by_name (argv[0]);
6764 if (bgp == NULL)
6765 {
6766 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6767 return CMD_WARNING;
6768 }
6769
6770 return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6771 }
6772
6773 DEFUN (show_ip_bgp_view_route,
6774 show_ip_bgp_view_route_cmd,
6775 "show ip bgp view WORD A.B.C.D",
6776 SHOW_STR
6777 IP_STR
6778 BGP_STR
6779 "BGP view\n"
6780 "BGP view name\n"
6781 "Network in the BGP routing table to display\n")
6782 {
6783 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6784 }
6785
6786 DEFUN (show_ip_bgp_view_prefix,
6787 show_ip_bgp_view_prefix_cmd,
6788 "show ip bgp view WORD A.B.C.D/M",
6789 SHOW_STR
6790 IP_STR
6791 BGP_STR
6792 "BGP view\n"
6793 "BGP view name\n"
6794 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6795 {
6796 return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6797 }
6798
6799 #ifdef HAVE_IPV6
6800 DEFUN (show_bgp,
6801 show_bgp_cmd,
6802 "show bgp",
6803 SHOW_STR
6804 BGP_STR)
6805 {
6806 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6807 NULL);
6808 }
6809
6810 ALIAS (show_bgp,
6811 show_bgp_ipv6_cmd,
6812 "show bgp ipv6",
6813 SHOW_STR
6814 BGP_STR
6815 "Address family\n")
6816
6817 /* old command */
6818 DEFUN (show_ipv6_bgp,
6819 show_ipv6_bgp_cmd,
6820 "show ipv6 bgp",
6821 SHOW_STR
6822 IP_STR
6823 BGP_STR)
6824 {
6825 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6826 NULL);
6827 }
6828
6829 DEFUN (show_bgp_route,
6830 show_bgp_route_cmd,
6831 "show bgp X:X::X:X",
6832 SHOW_STR
6833 BGP_STR
6834 "Network in the BGP routing table to display\n")
6835 {
6836 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6837 }
6838
6839 ALIAS (show_bgp_route,
6840 show_bgp_ipv6_route_cmd,
6841 "show bgp ipv6 X:X::X:X",
6842 SHOW_STR
6843 BGP_STR
6844 "Address family\n"
6845 "Network in the BGP routing table to display\n")
6846
6847 /* old command */
6848 DEFUN (show_ipv6_bgp_route,
6849 show_ipv6_bgp_route_cmd,
6850 "show ipv6 bgp X:X::X:X",
6851 SHOW_STR
6852 IP_STR
6853 BGP_STR
6854 "Network in the BGP routing table to display\n")
6855 {
6856 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6857 }
6858
6859 DEFUN (show_bgp_prefix,
6860 show_bgp_prefix_cmd,
6861 "show bgp X:X::X:X/M",
6862 SHOW_STR
6863 BGP_STR
6864 "IPv6 prefix <network>/<length>\n")
6865 {
6866 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6867 }
6868
6869 ALIAS (show_bgp_prefix,
6870 show_bgp_ipv6_prefix_cmd,
6871 "show bgp ipv6 X:X::X:X/M",
6872 SHOW_STR
6873 BGP_STR
6874 "Address family\n"
6875 "IPv6 prefix <network>/<length>\n")
6876
6877 /* old command */
6878 DEFUN (show_ipv6_bgp_prefix,
6879 show_ipv6_bgp_prefix_cmd,
6880 "show ipv6 bgp X:X::X:X/M",
6881 SHOW_STR
6882 IP_STR
6883 BGP_STR
6884 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6885 {
6886 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6887 }
6888
6889 DEFUN (show_bgp_view,
6890 show_bgp_view_cmd,
6891 "show bgp view WORD",
6892 SHOW_STR
6893 BGP_STR
6894 "BGP view\n"
6895 "View name\n")
6896 {
6897 struct bgp *bgp;
6898
6899 /* BGP structure lookup. */
6900 bgp = bgp_lookup_by_name (argv[0]);
6901 if (bgp == NULL)
6902 {
6903 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6904 return CMD_WARNING;
6905 }
6906
6907 return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6908 }
6909
6910 ALIAS (show_bgp_view,
6911 show_bgp_view_ipv6_cmd,
6912 "show bgp view WORD ipv6",
6913 SHOW_STR
6914 BGP_STR
6915 "BGP view\n"
6916 "View name\n"
6917 "Address family\n")
6918
6919 DEFUN (show_bgp_view_route,
6920 show_bgp_view_route_cmd,
6921 "show bgp view WORD X:X::X:X",
6922 SHOW_STR
6923 BGP_STR
6924 "BGP view\n"
6925 "View name\n"
6926 "Network in the BGP routing table to display\n")
6927 {
6928 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6929 }
6930
6931 ALIAS (show_bgp_view_route,
6932 show_bgp_view_ipv6_route_cmd,
6933 "show bgp view WORD ipv6 X:X::X:X",
6934 SHOW_STR
6935 BGP_STR
6936 "BGP view\n"
6937 "View name\n"
6938 "Address family\n"
6939 "Network in the BGP routing table to display\n")
6940
6941 DEFUN (show_bgp_view_prefix,
6942 show_bgp_view_prefix_cmd,
6943 "show bgp view WORD X:X::X:X/M",
6944 SHOW_STR
6945 BGP_STR
6946 "BGP view\n"
6947 "View name\n"
6948 "IPv6 prefix <network>/<length>\n")
6949 {
6950 return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6951 }
6952
6953 ALIAS (show_bgp_view_prefix,
6954 show_bgp_view_ipv6_prefix_cmd,
6955 "show bgp view WORD ipv6 X:X::X:X/M",
6956 SHOW_STR
6957 BGP_STR
6958 "BGP view\n"
6959 "View name\n"
6960 "Address family\n"
6961 "IPv6 prefix <network>/<length>\n")
6962
6963 /* old command */
6964 DEFUN (show_ipv6_mbgp,
6965 show_ipv6_mbgp_cmd,
6966 "show ipv6 mbgp",
6967 SHOW_STR
6968 IP_STR
6969 MBGP_STR)
6970 {
6971 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6972 NULL);
6973 }
6974
6975 /* old command */
6976 DEFUN (show_ipv6_mbgp_route,
6977 show_ipv6_mbgp_route_cmd,
6978 "show ipv6 mbgp X:X::X:X",
6979 SHOW_STR
6980 IP_STR
6981 MBGP_STR
6982 "Network in the MBGP routing table to display\n")
6983 {
6984 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6985 }
6986
6987 /* old command */
6988 DEFUN (show_ipv6_mbgp_prefix,
6989 show_ipv6_mbgp_prefix_cmd,
6990 "show ipv6 mbgp X:X::X:X/M",
6991 SHOW_STR
6992 IP_STR
6993 MBGP_STR
6994 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6995 {
6996 return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6997 }
6998 #endif
6999 \f
7000
7001 static int
7002 bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
7003 safi_t safi, enum bgp_show_type type)
7004 {
7005 int i;
7006 struct buffer *b;
7007 char *regstr;
7008 int first;
7009 regex_t *regex;
7010 int rc;
7011
7012 first = 0;
7013 b = buffer_new (1024);
7014 for (i = 0; i < argc; i++)
7015 {
7016 if (first)
7017 buffer_putc (b, ' ');
7018 else
7019 {
7020 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7021 continue;
7022 first = 1;
7023 }
7024
7025 buffer_putstr (b, argv[i]);
7026 }
7027 buffer_putc (b, '\0');
7028
7029 regstr = buffer_getstr (b);
7030 buffer_free (b);
7031
7032 regex = bgp_regcomp (regstr);
7033 XFREE(MTYPE_TMP, regstr);
7034 if (! regex)
7035 {
7036 vty_out (vty, "Can't compile regexp %s%s", argv[0],
7037 VTY_NEWLINE);
7038 return CMD_WARNING;
7039 }
7040
7041 rc = bgp_show (vty, NULL, afi, safi, type, regex);
7042 bgp_regex_free (regex);
7043 return rc;
7044 }
7045
7046 DEFUN (show_ip_bgp_regexp,
7047 show_ip_bgp_regexp_cmd,
7048 "show ip bgp regexp .LINE",
7049 SHOW_STR
7050 IP_STR
7051 BGP_STR
7052 "Display routes matching the AS path regular expression\n"
7053 "A regular-expression to match the BGP AS paths\n")
7054 {
7055 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7056 bgp_show_type_regexp);
7057 }
7058
7059 DEFUN (show_ip_bgp_flap_regexp,
7060 show_ip_bgp_flap_regexp_cmd,
7061 "show ip bgp flap-statistics regexp .LINE",
7062 SHOW_STR
7063 IP_STR
7064 BGP_STR
7065 "Display flap statistics of routes\n"
7066 "Display routes matching the AS path regular expression\n"
7067 "A regular-expression to match the BGP AS paths\n")
7068 {
7069 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7070 bgp_show_type_flap_regexp);
7071 }
7072
7073 DEFUN (show_ip_bgp_ipv4_regexp,
7074 show_ip_bgp_ipv4_regexp_cmd,
7075 "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7076 SHOW_STR
7077 IP_STR
7078 BGP_STR
7079 "Address family\n"
7080 "Address Family modifier\n"
7081 "Address Family modifier\n"
7082 "Display routes matching the AS path regular expression\n"
7083 "A regular-expression to match the BGP AS paths\n")
7084 {
7085 if (strncmp (argv[0], "m", 1) == 0)
7086 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7087 bgp_show_type_regexp);
7088
7089 return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7090 bgp_show_type_regexp);
7091 }
7092
7093 #ifdef HAVE_IPV6
7094 DEFUN (show_bgp_regexp,
7095 show_bgp_regexp_cmd,
7096 "show bgp regexp .LINE",
7097 SHOW_STR
7098 BGP_STR
7099 "Display routes matching the AS path regular expression\n"
7100 "A regular-expression to match the BGP AS paths\n")
7101 {
7102 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7103 bgp_show_type_regexp);
7104 }
7105
7106 ALIAS (show_bgp_regexp,
7107 show_bgp_ipv6_regexp_cmd,
7108 "show bgp ipv6 regexp .LINE",
7109 SHOW_STR
7110 BGP_STR
7111 "Address family\n"
7112 "Display routes matching the AS path regular expression\n"
7113 "A regular-expression to match the BGP AS paths\n")
7114
7115 /* old command */
7116 DEFUN (show_ipv6_bgp_regexp,
7117 show_ipv6_bgp_regexp_cmd,
7118 "show ipv6 bgp regexp .LINE",
7119 SHOW_STR
7120 IP_STR
7121 BGP_STR
7122 "Display routes matching the AS path regular expression\n"
7123 "A regular-expression to match the BGP AS paths\n")
7124 {
7125 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7126 bgp_show_type_regexp);
7127 }
7128
7129 /* old command */
7130 DEFUN (show_ipv6_mbgp_regexp,
7131 show_ipv6_mbgp_regexp_cmd,
7132 "show ipv6 mbgp regexp .LINE",
7133 SHOW_STR
7134 IP_STR
7135 BGP_STR
7136 "Display routes matching the AS path regular expression\n"
7137 "A regular-expression to match the MBGP AS paths\n")
7138 {
7139 return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7140 bgp_show_type_regexp);
7141 }
7142 #endif /* HAVE_IPV6 */
7143 \f
7144 static int
7145 bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
7146 safi_t safi, enum bgp_show_type type)
7147 {
7148 struct prefix_list *plist;
7149
7150 plist = prefix_list_lookup (afi, prefix_list_str);
7151 if (plist == NULL)
7152 {
7153 vty_out (vty, "%% %s is not a valid prefix-list name%s",
7154 prefix_list_str, VTY_NEWLINE);
7155 return CMD_WARNING;
7156 }
7157
7158 return bgp_show (vty, NULL, afi, safi, type, plist);
7159 }
7160
7161 DEFUN (show_ip_bgp_prefix_list,
7162 show_ip_bgp_prefix_list_cmd,
7163 "show ip bgp prefix-list WORD",
7164 SHOW_STR
7165 IP_STR
7166 BGP_STR
7167 "Display routes conforming to the prefix-list\n"
7168 "IP prefix-list name\n")
7169 {
7170 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7171 bgp_show_type_prefix_list);
7172 }
7173
7174 DEFUN (show_ip_bgp_flap_prefix_list,
7175 show_ip_bgp_flap_prefix_list_cmd,
7176 "show ip bgp flap-statistics prefix-list WORD",
7177 SHOW_STR
7178 IP_STR
7179 BGP_STR
7180 "Display flap statistics of routes\n"
7181 "Display routes conforming to the prefix-list\n"
7182 "IP prefix-list name\n")
7183 {
7184 return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7185 bgp_show_type_flap_prefix_list);
7186 }
7187
7188 DEFUN (show_ip_bgp_ipv4_prefix_list,
7189 show_ip_bgp_ipv4_prefix_list_cmd,
7190 "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7191 SHOW_STR
7192 IP_STR
7193 BGP_STR
7194 "Address family\n"
7195 "Address Family modifier\n"
7196 "Address Family modifier\n"
7197 "Display routes conforming to the prefix-list\n"
7198 "IP prefix-list name\n")
7199 {
7200 if (strncmp (argv[0], "m", 1) == 0)
7201 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7202 bgp_show_type_prefix_list);
7203
7204 return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7205 bgp_show_type_prefix_list);
7206 }
7207
7208 #ifdef HAVE_IPV6
7209 DEFUN (show_bgp_prefix_list,
7210 show_bgp_prefix_list_cmd,
7211 "show bgp prefix-list WORD",
7212 SHOW_STR
7213 BGP_STR
7214 "Display routes conforming to the prefix-list\n"
7215 "IPv6 prefix-list name\n")
7216 {
7217 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7218 bgp_show_type_prefix_list);
7219 }
7220
7221 ALIAS (show_bgp_prefix_list,
7222 show_bgp_ipv6_prefix_list_cmd,
7223 "show bgp ipv6 prefix-list WORD",
7224 SHOW_STR
7225 BGP_STR
7226 "Address family\n"
7227 "Display routes conforming to the prefix-list\n"
7228 "IPv6 prefix-list name\n")
7229
7230 /* old command */
7231 DEFUN (show_ipv6_bgp_prefix_list,
7232 show_ipv6_bgp_prefix_list_cmd,
7233 "show ipv6 bgp prefix-list WORD",
7234 SHOW_STR
7235 IPV6_STR
7236 BGP_STR
7237 "Display routes matching the prefix-list\n"
7238 "IPv6 prefix-list name\n")
7239 {
7240 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7241 bgp_show_type_prefix_list);
7242 }
7243
7244 /* old command */
7245 DEFUN (show_ipv6_mbgp_prefix_list,
7246 show_ipv6_mbgp_prefix_list_cmd,
7247 "show ipv6 mbgp prefix-list WORD",
7248 SHOW_STR
7249 IPV6_STR
7250 MBGP_STR
7251 "Display routes matching the prefix-list\n"
7252 "IPv6 prefix-list name\n")
7253 {
7254 return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7255 bgp_show_type_prefix_list);
7256 }
7257 #endif /* HAVE_IPV6 */
7258 \f
7259 static int
7260 bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
7261 safi_t safi, enum bgp_show_type type)
7262 {
7263 struct as_list *as_list;
7264
7265 as_list = as_list_lookup (filter);
7266 if (as_list == NULL)
7267 {
7268 vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7269 return CMD_WARNING;
7270 }
7271
7272 return bgp_show (vty, NULL, afi, safi, type, as_list);
7273 }
7274
7275 DEFUN (show_ip_bgp_filter_list,
7276 show_ip_bgp_filter_list_cmd,
7277 "show ip bgp filter-list WORD",
7278 SHOW_STR
7279 IP_STR
7280 BGP_STR
7281 "Display routes conforming to the filter-list\n"
7282 "Regular expression access list name\n")
7283 {
7284 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7285 bgp_show_type_filter_list);
7286 }
7287
7288 DEFUN (show_ip_bgp_flap_filter_list,
7289 show_ip_bgp_flap_filter_list_cmd,
7290 "show ip bgp flap-statistics filter-list WORD",
7291 SHOW_STR
7292 IP_STR
7293 BGP_STR
7294 "Display flap statistics of routes\n"
7295 "Display routes conforming to the filter-list\n"
7296 "Regular expression access list name\n")
7297 {
7298 return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7299 bgp_show_type_flap_filter_list);
7300 }
7301
7302 DEFUN (show_ip_bgp_ipv4_filter_list,
7303 show_ip_bgp_ipv4_filter_list_cmd,
7304 "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7305 SHOW_STR
7306 IP_STR
7307 BGP_STR
7308 "Address family\n"
7309 "Address Family modifier\n"
7310 "Address Family modifier\n"
7311 "Display routes conforming to the filter-list\n"
7312 "Regular expression access list name\n")
7313 {
7314 if (strncmp (argv[0], "m", 1) == 0)
7315 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7316 bgp_show_type_filter_list);
7317
7318 return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7319 bgp_show_type_filter_list);
7320 }
7321
7322 #ifdef HAVE_IPV6
7323 DEFUN (show_bgp_filter_list,
7324 show_bgp_filter_list_cmd,
7325 "show bgp filter-list WORD",
7326 SHOW_STR
7327 BGP_STR
7328 "Display routes conforming to the filter-list\n"
7329 "Regular expression access list name\n")
7330 {
7331 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7332 bgp_show_type_filter_list);
7333 }
7334
7335 ALIAS (show_bgp_filter_list,
7336 show_bgp_ipv6_filter_list_cmd,
7337 "show bgp ipv6 filter-list WORD",
7338 SHOW_STR
7339 BGP_STR
7340 "Address family\n"
7341 "Display routes conforming to the filter-list\n"
7342 "Regular expression access list name\n")
7343
7344 /* old command */
7345 DEFUN (show_ipv6_bgp_filter_list,
7346 show_ipv6_bgp_filter_list_cmd,
7347 "show ipv6 bgp filter-list WORD",
7348 SHOW_STR
7349 IPV6_STR
7350 BGP_STR
7351 "Display routes conforming to the filter-list\n"
7352 "Regular expression access list name\n")
7353 {
7354 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7355 bgp_show_type_filter_list);
7356 }
7357
7358 /* old command */
7359 DEFUN (show_ipv6_mbgp_filter_list,
7360 show_ipv6_mbgp_filter_list_cmd,
7361 "show ipv6 mbgp filter-list WORD",
7362 SHOW_STR
7363 IPV6_STR
7364 MBGP_STR
7365 "Display routes conforming to the filter-list\n"
7366 "Regular expression access list name\n")
7367 {
7368 return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7369 bgp_show_type_filter_list);
7370 }
7371 #endif /* HAVE_IPV6 */
7372 \f
7373 static int
7374 bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
7375 safi_t safi, enum bgp_show_type type)
7376 {
7377 struct route_map *rmap;
7378
7379 rmap = route_map_lookup_by_name (rmap_str);
7380 if (! rmap)
7381 {
7382 vty_out (vty, "%% %s is not a valid route-map name%s",
7383 rmap_str, VTY_NEWLINE);
7384 return CMD_WARNING;
7385 }
7386
7387 return bgp_show (vty, NULL, afi, safi, type, rmap);
7388 }
7389
7390 DEFUN (show_ip_bgp_route_map,
7391 show_ip_bgp_route_map_cmd,
7392 "show ip bgp route-map WORD",
7393 SHOW_STR
7394 IP_STR
7395 BGP_STR
7396 "Display routes matching the route-map\n"
7397 "A route-map to match on\n")
7398 {
7399 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7400 bgp_show_type_route_map);
7401 }
7402
7403 DEFUN (show_ip_bgp_flap_route_map,
7404 show_ip_bgp_flap_route_map_cmd,
7405 "show ip bgp flap-statistics route-map WORD",
7406 SHOW_STR
7407 IP_STR
7408 BGP_STR
7409 "Display flap statistics of routes\n"
7410 "Display routes matching the route-map\n"
7411 "A route-map to match on\n")
7412 {
7413 return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7414 bgp_show_type_flap_route_map);
7415 }
7416
7417 DEFUN (show_ip_bgp_ipv4_route_map,
7418 show_ip_bgp_ipv4_route_map_cmd,
7419 "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7420 SHOW_STR
7421 IP_STR
7422 BGP_STR
7423 "Address family\n"
7424 "Address Family modifier\n"
7425 "Address Family modifier\n"
7426 "Display routes matching the route-map\n"
7427 "A route-map to match on\n")
7428 {
7429 if (strncmp (argv[0], "m", 1) == 0)
7430 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7431 bgp_show_type_route_map);
7432
7433 return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7434 bgp_show_type_route_map);
7435 }
7436
7437 DEFUN (show_bgp_route_map,
7438 show_bgp_route_map_cmd,
7439 "show bgp route-map WORD",
7440 SHOW_STR
7441 BGP_STR
7442 "Display routes matching the route-map\n"
7443 "A route-map to match on\n")
7444 {
7445 return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7446 bgp_show_type_route_map);
7447 }
7448
7449 ALIAS (show_bgp_route_map,
7450 show_bgp_ipv6_route_map_cmd,
7451 "show bgp ipv6 route-map WORD",
7452 SHOW_STR
7453 BGP_STR
7454 "Address family\n"
7455 "Display routes matching the route-map\n"
7456 "A route-map to match on\n")
7457 \f
7458 DEFUN (show_ip_bgp_cidr_only,
7459 show_ip_bgp_cidr_only_cmd,
7460 "show ip bgp cidr-only",
7461 SHOW_STR
7462 IP_STR
7463 BGP_STR
7464 "Display only routes with non-natural netmasks\n")
7465 {
7466 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7467 bgp_show_type_cidr_only, NULL);
7468 }
7469
7470 DEFUN (show_ip_bgp_flap_cidr_only,
7471 show_ip_bgp_flap_cidr_only_cmd,
7472 "show ip bgp flap-statistics cidr-only",
7473 SHOW_STR
7474 IP_STR
7475 BGP_STR
7476 "Display flap statistics of routes\n"
7477 "Display only routes with non-natural netmasks\n")
7478 {
7479 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7480 bgp_show_type_flap_cidr_only, NULL);
7481 }
7482
7483 DEFUN (show_ip_bgp_ipv4_cidr_only,
7484 show_ip_bgp_ipv4_cidr_only_cmd,
7485 "show ip bgp ipv4 (unicast|multicast) cidr-only",
7486 SHOW_STR
7487 IP_STR
7488 BGP_STR
7489 "Address family\n"
7490 "Address Family modifier\n"
7491 "Address Family modifier\n"
7492 "Display only routes with non-natural netmasks\n")
7493 {
7494 if (strncmp (argv[0], "m", 1) == 0)
7495 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7496 bgp_show_type_cidr_only, NULL);
7497
7498 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7499 bgp_show_type_cidr_only, NULL);
7500 }
7501 \f
7502 DEFUN (show_ip_bgp_community_all,
7503 show_ip_bgp_community_all_cmd,
7504 "show ip bgp community",
7505 SHOW_STR
7506 IP_STR
7507 BGP_STR
7508 "Display routes matching the communities\n")
7509 {
7510 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7511 bgp_show_type_community_all, NULL);
7512 }
7513
7514 DEFUN (show_ip_bgp_ipv4_community_all,
7515 show_ip_bgp_ipv4_community_all_cmd,
7516 "show ip bgp ipv4 (unicast|multicast) community",
7517 SHOW_STR
7518 IP_STR
7519 BGP_STR
7520 "Address family\n"
7521 "Address Family modifier\n"
7522 "Address Family modifier\n"
7523 "Display routes matching the communities\n")
7524 {
7525 if (strncmp (argv[0], "m", 1) == 0)
7526 return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7527 bgp_show_type_community_all, NULL);
7528
7529 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7530 bgp_show_type_community_all, NULL);
7531 }
7532
7533 #ifdef HAVE_IPV6
7534 DEFUN (show_bgp_community_all,
7535 show_bgp_community_all_cmd,
7536 "show bgp community",
7537 SHOW_STR
7538 BGP_STR
7539 "Display routes matching the communities\n")
7540 {
7541 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7542 bgp_show_type_community_all, NULL);
7543 }
7544
7545 ALIAS (show_bgp_community_all,
7546 show_bgp_ipv6_community_all_cmd,
7547 "show bgp ipv6 community",
7548 SHOW_STR
7549 BGP_STR
7550 "Address family\n"
7551 "Display routes matching the communities\n")
7552
7553 /* old command */
7554 DEFUN (show_ipv6_bgp_community_all,
7555 show_ipv6_bgp_community_all_cmd,
7556 "show ipv6 bgp community",
7557 SHOW_STR
7558 IPV6_STR
7559 BGP_STR
7560 "Display routes matching the communities\n")
7561 {
7562 return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7563 bgp_show_type_community_all, NULL);
7564 }
7565
7566 /* old command */
7567 DEFUN (show_ipv6_mbgp_community_all,
7568 show_ipv6_mbgp_community_all_cmd,
7569 "show ipv6 mbgp community",
7570 SHOW_STR
7571 IPV6_STR
7572 MBGP_STR
7573 "Display routes matching the communities\n")
7574 {
7575 return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
7576 bgp_show_type_community_all, NULL);
7577 }
7578 #endif /* HAVE_IPV6 */
7579 \f
7580 static int
7581 bgp_show_community (struct vty *vty, int argc, const char **argv, int exact,
7582 u_int16_t afi, u_char safi)
7583 {
7584 struct community *com;
7585 struct buffer *b;
7586 int i;
7587 char *str;
7588 int first = 0;
7589
7590 b = buffer_new (1024);
7591 for (i = 0; i < argc; i++)
7592 {
7593 if (first)
7594 buffer_putc (b, ' ');
7595 else
7596 {
7597 if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7598 continue;
7599 first = 1;
7600 }
7601
7602 buffer_putstr (b, argv[i]);
7603 }
7604 buffer_putc (b, '\0');
7605
7606 str = buffer_getstr (b);
7607 buffer_free (b);
7608
7609 com = community_str2com (str);
7610 XFREE (MTYPE_TMP, str);
7611 if (! com)
7612 {
7613 vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7614 return CMD_WARNING;
7615 }
7616
7617 return bgp_show (vty, NULL, afi, safi,
7618 (exact ? bgp_show_type_community_exact :
7619 bgp_show_type_community), com);
7620 }
7621
7622 DEFUN (show_ip_bgp_community,
7623 show_ip_bgp_community_cmd,
7624 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7625 SHOW_STR
7626 IP_STR
7627 BGP_STR
7628 "Display routes matching the communities\n"
7629 "community number\n"
7630 "Do not send outside local AS (well-known community)\n"
7631 "Do not advertise to any peer (well-known community)\n"
7632 "Do not export to next AS (well-known community)\n")
7633 {
7634 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7635 }
7636
7637 ALIAS (show_ip_bgp_community,
7638 show_ip_bgp_community2_cmd,
7639 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7640 SHOW_STR
7641 IP_STR
7642 BGP_STR
7643 "Display routes matching the communities\n"
7644 "community number\n"
7645 "Do not send outside local AS (well-known community)\n"
7646 "Do not advertise to any peer (well-known community)\n"
7647 "Do not export to next AS (well-known community)\n"
7648 "community number\n"
7649 "Do not send outside local AS (well-known community)\n"
7650 "Do not advertise to any peer (well-known community)\n"
7651 "Do not export to next AS (well-known community)\n")
7652
7653 ALIAS (show_ip_bgp_community,
7654 show_ip_bgp_community3_cmd,
7655 "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)",
7656 SHOW_STR
7657 IP_STR
7658 BGP_STR
7659 "Display routes matching the communities\n"
7660 "community number\n"
7661 "Do not send outside local AS (well-known community)\n"
7662 "Do not advertise to any peer (well-known community)\n"
7663 "Do not export to next AS (well-known community)\n"
7664 "community number\n"
7665 "Do not send outside local AS (well-known community)\n"
7666 "Do not advertise to any peer (well-known community)\n"
7667 "Do not export to next AS (well-known community)\n"
7668 "community number\n"
7669 "Do not send outside local AS (well-known community)\n"
7670 "Do not advertise to any peer (well-known community)\n"
7671 "Do not export to next AS (well-known community)\n")
7672
7673 ALIAS (show_ip_bgp_community,
7674 show_ip_bgp_community4_cmd,
7675 "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)",
7676 SHOW_STR
7677 IP_STR
7678 BGP_STR
7679 "Display routes matching the communities\n"
7680 "community number\n"
7681 "Do not send outside local AS (well-known community)\n"
7682 "Do not advertise to any peer (well-known community)\n"
7683 "Do not export to next AS (well-known community)\n"
7684 "community number\n"
7685 "Do not send outside local AS (well-known community)\n"
7686 "Do not advertise to any peer (well-known community)\n"
7687 "Do not export to next AS (well-known community)\n"
7688 "community number\n"
7689 "Do not send outside local AS (well-known community)\n"
7690 "Do not advertise to any peer (well-known community)\n"
7691 "Do not export to next AS (well-known community)\n"
7692 "community number\n"
7693 "Do not send outside local AS (well-known community)\n"
7694 "Do not advertise to any peer (well-known community)\n"
7695 "Do not export to next AS (well-known community)\n")
7696
7697 DEFUN (show_ip_bgp_ipv4_community,
7698 show_ip_bgp_ipv4_community_cmd,
7699 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7700 SHOW_STR
7701 IP_STR
7702 BGP_STR
7703 "Address family\n"
7704 "Address Family modifier\n"
7705 "Address Family modifier\n"
7706 "Display routes matching the communities\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 {
7712 if (strncmp (argv[0], "m", 1) == 0)
7713 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
7714
7715 return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7716 }
7717
7718 ALIAS (show_ip_bgp_ipv4_community,
7719 show_ip_bgp_ipv4_community2_cmd,
7720 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7721 SHOW_STR
7722 IP_STR
7723 BGP_STR
7724 "Address family\n"
7725 "Address Family modifier\n"
7726 "Address Family modifier\n"
7727 "Display routes matching the communities\n"
7728 "community number\n"
7729 "Do not send outside local AS (well-known community)\n"
7730 "Do not advertise to any peer (well-known community)\n"
7731 "Do not export to next AS (well-known community)\n"
7732 "community number\n"
7733 "Do not send outside local AS (well-known community)\n"
7734 "Do not advertise to any peer (well-known community)\n"
7735 "Do not export to next AS (well-known community)\n")
7736
7737 ALIAS (show_ip_bgp_ipv4_community,
7738 show_ip_bgp_ipv4_community3_cmd,
7739 "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)",
7740 SHOW_STR
7741 IP_STR
7742 BGP_STR
7743 "Address family\n"
7744 "Address Family modifier\n"
7745 "Address Family modifier\n"
7746 "Display routes matching the communities\n"
7747 "community number\n"
7748 "Do not send outside local AS (well-known community)\n"
7749 "Do not advertise to any peer (well-known community)\n"
7750 "Do not export to next AS (well-known community)\n"
7751 "community number\n"
7752 "Do not send outside local AS (well-known community)\n"
7753 "Do not advertise to any peer (well-known community)\n"
7754 "Do not export to next AS (well-known community)\n"
7755 "community number\n"
7756 "Do not send outside local AS (well-known community)\n"
7757 "Do not advertise to any peer (well-known community)\n"
7758 "Do not export to next AS (well-known community)\n")
7759
7760 ALIAS (show_ip_bgp_ipv4_community,
7761 show_ip_bgp_ipv4_community4_cmd,
7762 "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)",
7763 SHOW_STR
7764 IP_STR
7765 BGP_STR
7766 "Address family\n"
7767 "Address Family modifier\n"
7768 "Address Family modifier\n"
7769 "Display routes matching the communities\n"
7770 "community number\n"
7771 "Do not send outside local AS (well-known community)\n"
7772 "Do not advertise to any peer (well-known community)\n"
7773 "Do not export to next AS (well-known community)\n"
7774 "community number\n"
7775 "Do not send outside local AS (well-known community)\n"
7776 "Do not advertise to any peer (well-known community)\n"
7777 "Do not export to next AS (well-known community)\n"
7778 "community number\n"
7779 "Do not send outside local AS (well-known community)\n"
7780 "Do not advertise to any peer (well-known community)\n"
7781 "Do not export to next AS (well-known community)\n"
7782 "community number\n"
7783 "Do not send outside local AS (well-known community)\n"
7784 "Do not advertise to any peer (well-known community)\n"
7785 "Do not export to next AS (well-known community)\n")
7786
7787 DEFUN (show_ip_bgp_community_exact,
7788 show_ip_bgp_community_exact_cmd,
7789 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7790 SHOW_STR
7791 IP_STR
7792 BGP_STR
7793 "Display routes matching the communities\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 "Exact match of the communities")
7799 {
7800 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7801 }
7802
7803 ALIAS (show_ip_bgp_community_exact,
7804 show_ip_bgp_community2_exact_cmd,
7805 "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7806 SHOW_STR
7807 IP_STR
7808 BGP_STR
7809 "Display routes matching the communities\n"
7810 "community number\n"
7811 "Do not send outside local AS (well-known community)\n"
7812 "Do not advertise to any peer (well-known community)\n"
7813 "Do not export to next AS (well-known community)\n"
7814 "community number\n"
7815 "Do not send outside local AS (well-known community)\n"
7816 "Do not advertise to any peer (well-known community)\n"
7817 "Do not export to next AS (well-known community)\n"
7818 "Exact match of the communities")
7819
7820 ALIAS (show_ip_bgp_community_exact,
7821 show_ip_bgp_community3_exact_cmd,
7822 "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",
7823 SHOW_STR
7824 IP_STR
7825 BGP_STR
7826 "Display routes matching the communities\n"
7827 "community number\n"
7828 "Do not send outside local AS (well-known community)\n"
7829 "Do not advertise to any peer (well-known community)\n"
7830 "Do not export to next AS (well-known community)\n"
7831 "community number\n"
7832 "Do not send outside local AS (well-known community)\n"
7833 "Do not advertise to any peer (well-known community)\n"
7834 "Do not export to next AS (well-known community)\n"
7835 "community number\n"
7836 "Do not send outside local AS (well-known community)\n"
7837 "Do not advertise to any peer (well-known community)\n"
7838 "Do not export to next AS (well-known community)\n"
7839 "Exact match of the communities")
7840
7841 ALIAS (show_ip_bgp_community_exact,
7842 show_ip_bgp_community4_exact_cmd,
7843 "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",
7844 SHOW_STR
7845 IP_STR
7846 BGP_STR
7847 "Display routes matching the communities\n"
7848 "community number\n"
7849 "Do not send outside local AS (well-known community)\n"
7850 "Do not advertise to any peer (well-known community)\n"
7851 "Do not export to next AS (well-known community)\n"
7852 "community number\n"
7853 "Do not send outside local AS (well-known community)\n"
7854 "Do not advertise to any peer (well-known community)\n"
7855 "Do not export to next AS (well-known community)\n"
7856 "community number\n"
7857 "Do not send outside local AS (well-known community)\n"
7858 "Do not advertise to any peer (well-known community)\n"
7859 "Do not export to next AS (well-known community)\n"
7860 "community number\n"
7861 "Do not send outside local AS (well-known community)\n"
7862 "Do not advertise to any peer (well-known community)\n"
7863 "Do not export to next AS (well-known community)\n"
7864 "Exact match of the communities")
7865
7866 DEFUN (show_ip_bgp_ipv4_community_exact,
7867 show_ip_bgp_ipv4_community_exact_cmd,
7868 "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7869 SHOW_STR
7870 IP_STR
7871 BGP_STR
7872 "Address family\n"
7873 "Address Family modifier\n"
7874 "Address Family modifier\n"
7875 "Display routes matching the communities\n"
7876 "community number\n"
7877 "Do not send outside local AS (well-known community)\n"
7878 "Do not advertise to any peer (well-known community)\n"
7879 "Do not export to next AS (well-known community)\n"
7880 "Exact match of the communities")
7881 {
7882 if (strncmp (argv[0], "m", 1) == 0)
7883 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
7884
7885 return bgp_show_community (vty, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7886 }
7887
7888 ALIAS (show_ip_bgp_ipv4_community_exact,
7889 show_ip_bgp_ipv4_community2_exact_cmd,
7890 "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",
7891 SHOW_STR
7892 IP_STR
7893 BGP_STR
7894 "Address family\n"
7895 "Address Family modifier\n"
7896 "Address Family modifier\n"
7897 "Display routes matching the communities\n"
7898 "community number\n"
7899 "Do not send outside local AS (well-known community)\n"
7900 "Do not advertise to any peer (well-known community)\n"
7901 "Do not export to next AS (well-known community)\n"
7902 "community number\n"
7903 "Do not send outside local AS (well-known community)\n"
7904 "Do not advertise to any peer (well-known community)\n"
7905 "Do not export to next AS (well-known community)\n"
7906 "Exact match of the communities")
7907
7908 ALIAS (show_ip_bgp_ipv4_community_exact,
7909 show_ip_bgp_ipv4_community3_exact_cmd,
7910 "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",
7911 SHOW_STR
7912 IP_STR
7913 BGP_STR
7914 "Address family\n"
7915 "Address Family modifier\n"
7916 "Address Family modifier\n"
7917 "Display routes matching the communities\n"
7918 "community number\n"
7919 "Do not send outside local AS (well-known community)\n"
7920 "Do not advertise to any peer (well-known community)\n"
7921 "Do not export to next AS (well-known community)\n"
7922 "community number\n"
7923 "Do not send outside local AS (well-known community)\n"
7924 "Do not advertise to any peer (well-known community)\n"
7925 "Do not export to next AS (well-known community)\n"
7926 "community number\n"
7927 "Do not send outside local AS (well-known community)\n"
7928 "Do not advertise to any peer (well-known community)\n"
7929 "Do not export to next AS (well-known community)\n"
7930 "Exact match of the communities")
7931
7932 ALIAS (show_ip_bgp_ipv4_community_exact,
7933 show_ip_bgp_ipv4_community4_exact_cmd,
7934 "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",
7935 SHOW_STR
7936 IP_STR
7937 BGP_STR
7938 "Address family\n"
7939 "Address Family modifier\n"
7940 "Address Family modifier\n"
7941 "Display routes matching the communities\n"
7942 "community number\n"
7943 "Do not send outside local AS (well-known community)\n"
7944 "Do not advertise to any peer (well-known community)\n"
7945 "Do not export to next AS (well-known community)\n"
7946 "community number\n"
7947 "Do not send outside local AS (well-known community)\n"
7948 "Do not advertise to any peer (well-known community)\n"
7949 "Do not export to next AS (well-known community)\n"
7950 "community number\n"
7951 "Do not send outside local AS (well-known community)\n"
7952 "Do not advertise to any peer (well-known community)\n"
7953 "Do not export to next AS (well-known community)\n"
7954 "community number\n"
7955 "Do not send outside local AS (well-known community)\n"
7956 "Do not advertise to any peer (well-known community)\n"
7957 "Do not export to next AS (well-known community)\n"
7958 "Exact match of the communities")
7959
7960 #ifdef HAVE_IPV6
7961 DEFUN (show_bgp_community,
7962 show_bgp_community_cmd,
7963 "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
7964 SHOW_STR
7965 BGP_STR
7966 "Display routes matching the communities\n"
7967 "community number\n"
7968 "Do not send outside local AS (well-known community)\n"
7969 "Do not advertise to any peer (well-known community)\n"
7970 "Do not export to next AS (well-known community)\n")
7971 {
7972 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
7973 }
7974
7975 ALIAS (show_bgp_community,
7976 show_bgp_ipv6_community_cmd,
7977 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
7978 SHOW_STR
7979 BGP_STR
7980 "Address family\n"
7981 "Display routes matching the communities\n"
7982 "community number\n"
7983 "Do not send outside local AS (well-known community)\n"
7984 "Do not advertise to any peer (well-known community)\n"
7985 "Do not export to next AS (well-known community)\n")
7986
7987 ALIAS (show_bgp_community,
7988 show_bgp_community2_cmd,
7989 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7990 SHOW_STR
7991 BGP_STR
7992 "Display routes matching the communities\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
8002 ALIAS (show_bgp_community,
8003 show_bgp_ipv6_community2_cmd,
8004 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8005 SHOW_STR
8006 BGP_STR
8007 "Address family\n"
8008 "Display routes matching the communities\n"
8009 "community number\n"
8010 "Do not send outside local AS (well-known community)\n"
8011 "Do not advertise to any peer (well-known community)\n"
8012 "Do not export to next AS (well-known community)\n"
8013 "community number\n"
8014 "Do not send outside local AS (well-known community)\n"
8015 "Do not advertise to any peer (well-known community)\n"
8016 "Do not export to next AS (well-known community)\n")
8017
8018 ALIAS (show_bgp_community,
8019 show_bgp_community3_cmd,
8020 "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)",
8021 SHOW_STR
8022 BGP_STR
8023 "Display routes matching the communities\n"
8024 "community number\n"
8025 "Do not send outside local AS (well-known community)\n"
8026 "Do not advertise to any peer (well-known community)\n"
8027 "Do not export to next AS (well-known community)\n"
8028 "community number\n"
8029 "Do not send outside local AS (well-known community)\n"
8030 "Do not advertise to any peer (well-known community)\n"
8031 "Do not export to next AS (well-known community)\n"
8032 "community number\n"
8033 "Do not send outside local AS (well-known community)\n"
8034 "Do not advertise to any peer (well-known community)\n"
8035 "Do not export to next AS (well-known community)\n")
8036
8037 ALIAS (show_bgp_community,
8038 show_bgp_ipv6_community3_cmd,
8039 "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)",
8040 SHOW_STR
8041 BGP_STR
8042 "Address family\n"
8043 "Display routes matching the communities\n"
8044 "community number\n"
8045 "Do not send outside local AS (well-known community)\n"
8046 "Do not advertise to any peer (well-known community)\n"
8047 "Do not export to next AS (well-known community)\n"
8048 "community number\n"
8049 "Do not send outside local AS (well-known community)\n"
8050 "Do not advertise to any peer (well-known community)\n"
8051 "Do not export to next AS (well-known community)\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
8057 ALIAS (show_bgp_community,
8058 show_bgp_community4_cmd,
8059 "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)",
8060 SHOW_STR
8061 BGP_STR
8062 "Display routes matching the communities\n"
8063 "community number\n"
8064 "Do not send outside local AS (well-known community)\n"
8065 "Do not advertise to any peer (well-known community)\n"
8066 "Do not export to next AS (well-known community)\n"
8067 "community number\n"
8068 "Do not send outside local AS (well-known community)\n"
8069 "Do not advertise to any peer (well-known community)\n"
8070 "Do not export to next AS (well-known community)\n"
8071 "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")
8079
8080 ALIAS (show_bgp_community,
8081 show_bgp_ipv6_community4_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) (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"
8099 "community number\n"
8100 "Do not send outside local AS (well-known community)\n"
8101 "Do not advertise to any peer (well-known community)\n"
8102 "Do not export to next AS (well-known community)\n")
8103
8104 /* old command */
8105 DEFUN (show_ipv6_bgp_community,
8106 show_ipv6_bgp_community_cmd,
8107 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8108 SHOW_STR
8109 IPV6_STR
8110 BGP_STR
8111 "Display routes matching the communities\n"
8112 "community number\n"
8113 "Do not send outside local AS (well-known community)\n"
8114 "Do not advertise to any peer (well-known community)\n"
8115 "Do not export to next AS (well-known community)\n")
8116 {
8117 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
8118 }
8119
8120 /* old command */
8121 ALIAS (show_ipv6_bgp_community,
8122 show_ipv6_bgp_community2_cmd,
8123 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8124 SHOW_STR
8125 IPV6_STR
8126 BGP_STR
8127 "Display routes matching the communities\n"
8128 "community number\n"
8129 "Do not send outside local AS (well-known community)\n"
8130 "Do not advertise to any peer (well-known community)\n"
8131 "Do not export to next AS (well-known community)\n"
8132 "community number\n"
8133 "Do not send outside local AS (well-known community)\n"
8134 "Do not advertise to any peer (well-known community)\n"
8135 "Do not export to next AS (well-known community)\n")
8136
8137 /* old command */
8138 ALIAS (show_ipv6_bgp_community,
8139 show_ipv6_bgp_community3_cmd,
8140 "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)",
8141 SHOW_STR
8142 IPV6_STR
8143 BGP_STR
8144 "Display routes matching the communities\n"
8145 "community number\n"
8146 "Do not send outside local AS (well-known community)\n"
8147 "Do not advertise to any peer (well-known community)\n"
8148 "Do not export to next AS (well-known community)\n"
8149 "community number\n"
8150 "Do not send outside local AS (well-known community)\n"
8151 "Do not advertise to any peer (well-known community)\n"
8152 "Do not export to next AS (well-known community)\n"
8153 "community number\n"
8154 "Do not send outside local AS (well-known community)\n"
8155 "Do not advertise to any peer (well-known community)\n"
8156 "Do not export to next AS (well-known community)\n")
8157
8158 /* old command */
8159 ALIAS (show_ipv6_bgp_community,
8160 show_ipv6_bgp_community4_cmd,
8161 "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)",
8162 SHOW_STR
8163 IPV6_STR
8164 BGP_STR
8165 "Display routes matching the communities\n"
8166 "community number\n"
8167 "Do not send outside local AS (well-known community)\n"
8168 "Do not advertise to any peer (well-known community)\n"
8169 "Do not export to next AS (well-known community)\n"
8170 "community number\n"
8171 "Do not send outside local AS (well-known community)\n"
8172 "Do not advertise to any peer (well-known community)\n"
8173 "Do not export to next AS (well-known community)\n"
8174 "community number\n"
8175 "Do not send outside local AS (well-known community)\n"
8176 "Do not advertise to any peer (well-known community)\n"
8177 "Do not export to next AS (well-known community)\n"
8178 "community number\n"
8179 "Do not send outside local AS (well-known community)\n"
8180 "Do not advertise to any peer (well-known community)\n"
8181 "Do not export to next AS (well-known community)\n")
8182
8183 DEFUN (show_bgp_community_exact,
8184 show_bgp_community_exact_cmd,
8185 "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8186 SHOW_STR
8187 BGP_STR
8188 "Display routes matching the communities\n"
8189 "community number\n"
8190 "Do not send outside local AS (well-known community)\n"
8191 "Do not advertise to any peer (well-known community)\n"
8192 "Do not export to next AS (well-known community)\n"
8193 "Exact match of the communities")
8194 {
8195 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8196 }
8197
8198 ALIAS (show_bgp_community_exact,
8199 show_bgp_ipv6_community_exact_cmd,
8200 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8201 SHOW_STR
8202 BGP_STR
8203 "Address family\n"
8204 "Display routes matching the communities\n"
8205 "community number\n"
8206 "Do not send outside local AS (well-known community)\n"
8207 "Do not advertise to any peer (well-known community)\n"
8208 "Do not export to next AS (well-known community)\n"
8209 "Exact match of the communities")
8210
8211 ALIAS (show_bgp_community_exact,
8212 show_bgp_community2_exact_cmd,
8213 "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8214 SHOW_STR
8215 BGP_STR
8216 "Display routes matching the communities\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"
8225 "Exact match of the communities")
8226
8227 ALIAS (show_bgp_community_exact,
8228 show_bgp_ipv6_community2_exact_cmd,
8229 "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8230 SHOW_STR
8231 BGP_STR
8232 "Address family\n"
8233 "Display routes matching the communities\n"
8234 "community number\n"
8235 "Do not send outside local AS (well-known community)\n"
8236 "Do not advertise to any peer (well-known community)\n"
8237 "Do not export to next AS (well-known community)\n"
8238 "community number\n"
8239 "Do not send outside local AS (well-known community)\n"
8240 "Do not advertise to any peer (well-known community)\n"
8241 "Do not export to next AS (well-known community)\n"
8242 "Exact match of the communities")
8243
8244 ALIAS (show_bgp_community_exact,
8245 show_bgp_community3_exact_cmd,
8246 "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",
8247 SHOW_STR
8248 BGP_STR
8249 "Display routes matching the communities\n"
8250 "community number\n"
8251 "Do not send outside local AS (well-known community)\n"
8252 "Do not advertise to any peer (well-known community)\n"
8253 "Do not export to next AS (well-known community)\n"
8254 "community number\n"
8255 "Do not send outside local AS (well-known community)\n"
8256 "Do not advertise to any peer (well-known community)\n"
8257 "Do not export to next AS (well-known community)\n"
8258 "community number\n"
8259 "Do not send outside local AS (well-known community)\n"
8260 "Do not advertise to any peer (well-known community)\n"
8261 "Do not export to next AS (well-known community)\n"
8262 "Exact match of the communities")
8263
8264 ALIAS (show_bgp_community_exact,
8265 show_bgp_ipv6_community3_exact_cmd,
8266 "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",
8267 SHOW_STR
8268 BGP_STR
8269 "Address family\n"
8270 "Display routes matching the communities\n"
8271 "community number\n"
8272 "Do not send outside local AS (well-known community)\n"
8273 "Do not advertise to any peer (well-known community)\n"
8274 "Do not export to next AS (well-known community)\n"
8275 "community number\n"
8276 "Do not send outside local AS (well-known community)\n"
8277 "Do not advertise to any peer (well-known community)\n"
8278 "Do not export to next AS (well-known community)\n"
8279 "community number\n"
8280 "Do not send outside local AS (well-known community)\n"
8281 "Do not advertise to any peer (well-known community)\n"
8282 "Do not export to next AS (well-known community)\n"
8283 "Exact match of the communities")
8284
8285 ALIAS (show_bgp_community_exact,
8286 show_bgp_community4_exact_cmd,
8287 "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",
8288 SHOW_STR
8289 BGP_STR
8290 "Display routes matching the communities\n"
8291 "community number\n"
8292 "Do not send outside local AS (well-known community)\n"
8293 "Do not advertise to any peer (well-known community)\n"
8294 "Do not export to next AS (well-known community)\n"
8295 "community number\n"
8296 "Do not send outside local AS (well-known community)\n"
8297 "Do not advertise to any peer (well-known community)\n"
8298 "Do not export to next AS (well-known community)\n"
8299 "community number\n"
8300 "Do not send outside local AS (well-known community)\n"
8301 "Do not advertise to any peer (well-known community)\n"
8302 "Do not export to next AS (well-known community)\n"
8303 "community number\n"
8304 "Do not send outside local AS (well-known community)\n"
8305 "Do not advertise to any peer (well-known community)\n"
8306 "Do not export to next AS (well-known community)\n"
8307 "Exact match of the communities")
8308
8309 ALIAS (show_bgp_community_exact,
8310 show_bgp_ipv6_community4_exact_cmd,
8311 "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",
8312 SHOW_STR
8313 BGP_STR
8314 "Address family\n"
8315 "Display routes matching the communities\n"
8316 "community number\n"
8317 "Do not send outside local AS (well-known community)\n"
8318 "Do not advertise to any peer (well-known community)\n"
8319 "Do not export to next AS (well-known community)\n"
8320 "community number\n"
8321 "Do not send outside local AS (well-known community)\n"
8322 "Do not advertise to any peer (well-known community)\n"
8323 "Do not export to next AS (well-known community)\n"
8324 "community number\n"
8325 "Do not send outside local AS (well-known community)\n"
8326 "Do not advertise to any peer (well-known community)\n"
8327 "Do not export to next AS (well-known community)\n"
8328 "community number\n"
8329 "Do not send outside local AS (well-known community)\n"
8330 "Do not advertise to any peer (well-known community)\n"
8331 "Do not export to next AS (well-known community)\n"
8332 "Exact match of the communities")
8333
8334 /* old command */
8335 DEFUN (show_ipv6_bgp_community_exact,
8336 show_ipv6_bgp_community_exact_cmd,
8337 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8338 SHOW_STR
8339 IPV6_STR
8340 BGP_STR
8341 "Display routes matching the communities\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 "Exact match of the communities")
8347 {
8348 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8349 }
8350
8351 /* old command */
8352 ALIAS (show_ipv6_bgp_community_exact,
8353 show_ipv6_bgp_community2_exact_cmd,
8354 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8355 SHOW_STR
8356 IPV6_STR
8357 BGP_STR
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 "Exact match of the communities")
8368
8369 /* old command */
8370 ALIAS (show_ipv6_bgp_community_exact,
8371 show_ipv6_bgp_community3_exact_cmd,
8372 "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8373 SHOW_STR
8374 IPV6_STR
8375 BGP_STR
8376 "Display routes matching the communities\n"
8377 "community number\n"
8378 "Do not send outside local AS (well-known community)\n"
8379 "Do not advertise to any peer (well-known community)\n"
8380 "Do not export to next AS (well-known community)\n"
8381 "community number\n"
8382 "Do not send outside local AS (well-known community)\n"
8383 "Do not advertise to any peer (well-known community)\n"
8384 "Do not export to next AS (well-known community)\n"
8385 "community number\n"
8386 "Do not send outside local AS (well-known community)\n"
8387 "Do not advertise to any peer (well-known community)\n"
8388 "Do not export to next AS (well-known community)\n"
8389 "Exact match of the communities")
8390
8391 /* old command */
8392 ALIAS (show_ipv6_bgp_community_exact,
8393 show_ipv6_bgp_community4_exact_cmd,
8394 "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",
8395 SHOW_STR
8396 IPV6_STR
8397 BGP_STR
8398 "Display routes matching the communities\n"
8399 "community number\n"
8400 "Do not send outside local AS (well-known community)\n"
8401 "Do not advertise to any peer (well-known community)\n"
8402 "Do not export to next AS (well-known community)\n"
8403 "community number\n"
8404 "Do not send outside local AS (well-known community)\n"
8405 "Do not advertise to any peer (well-known community)\n"
8406 "Do not export to next AS (well-known community)\n"
8407 "community number\n"
8408 "Do not send outside local AS (well-known community)\n"
8409 "Do not advertise to any peer (well-known community)\n"
8410 "Do not export to next AS (well-known community)\n"
8411 "community number\n"
8412 "Do not send outside local AS (well-known community)\n"
8413 "Do not advertise to any peer (well-known community)\n"
8414 "Do not export to next AS (well-known community)\n"
8415 "Exact match of the communities")
8416
8417 /* old command */
8418 DEFUN (show_ipv6_mbgp_community,
8419 show_ipv6_mbgp_community_cmd,
8420 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8421 SHOW_STR
8422 IPV6_STR
8423 MBGP_STR
8424 "Display routes matching the communities\n"
8425 "community number\n"
8426 "Do not send outside local AS (well-known community)\n"
8427 "Do not advertise to any peer (well-known community)\n"
8428 "Do not export to next AS (well-known community)\n")
8429 {
8430 return bgp_show_community (vty, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
8431 }
8432
8433 /* old command */
8434 ALIAS (show_ipv6_mbgp_community,
8435 show_ipv6_mbgp_community2_cmd,
8436 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8437 SHOW_STR
8438 IPV6_STR
8439 MBGP_STR
8440 "Display routes matching the communities\n"
8441 "community number\n"
8442 "Do not send outside local AS (well-known community)\n"
8443 "Do not advertise to any peer (well-known community)\n"
8444 "Do not export to next AS (well-known community)\n"
8445 "community number\n"
8446 "Do not send outside local AS (well-known community)\n"
8447 "Do not advertise to any peer (well-known community)\n"
8448 "Do not export to next AS (well-known community)\n")
8449
8450 /* old command */
8451 ALIAS (show_ipv6_mbgp_community,
8452 show_ipv6_mbgp_community3_cmd,
8453 "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)",
8454 SHOW_STR
8455 IPV6_STR
8456 MBGP_STR
8457 "Display routes matching the communities\n"
8458 "community number\n"
8459 "Do not send outside local AS (well-known community)\n"
8460 "Do not advertise to any peer (well-known community)\n"
8461 "Do not export to next AS (well-known community)\n"
8462 "community number\n"
8463 "Do not send outside local AS (well-known community)\n"
8464 "Do not advertise to any peer (well-known community)\n"
8465 "Do not export to next AS (well-known community)\n"
8466 "community number\n"
8467 "Do not send outside local AS (well-known community)\n"
8468 "Do not advertise to any peer (well-known community)\n"
8469 "Do not export to next AS (well-known community)\n")
8470
8471 /* old command */
8472 ALIAS (show_ipv6_mbgp_community,
8473 show_ipv6_mbgp_community4_cmd,
8474 "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)",
8475 SHOW_STR
8476 IPV6_STR
8477 MBGP_STR
8478 "Display routes matching the communities\n"
8479 "community number\n"
8480 "Do not send outside local AS (well-known community)\n"
8481 "Do not advertise to any peer (well-known community)\n"
8482 "Do not export to next AS (well-known community)\n"
8483 "community number\n"
8484 "Do not send outside local AS (well-known community)\n"
8485 "Do not advertise to any peer (well-known community)\n"
8486 "Do not export to next AS (well-known community)\n"
8487 "community number\n"
8488 "Do not send outside local AS (well-known community)\n"
8489 "Do not advertise to any peer (well-known community)\n"
8490 "Do not export to next AS (well-known community)\n"
8491 "community number\n"
8492 "Do not send outside local AS (well-known community)\n"
8493 "Do not advertise to any peer (well-known community)\n"
8494 "Do not export to next AS (well-known community)\n")
8495
8496 /* old command */
8497 DEFUN (show_ipv6_mbgp_community_exact,
8498 show_ipv6_mbgp_community_exact_cmd,
8499 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8500 SHOW_STR
8501 IPV6_STR
8502 MBGP_STR
8503 "Display routes matching the communities\n"
8504 "community number\n"
8505 "Do not send outside local AS (well-known community)\n"
8506 "Do not advertise to any peer (well-known community)\n"
8507 "Do not export to next AS (well-known community)\n"
8508 "Exact match of the communities")
8509 {
8510 return bgp_show_community (vty, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
8511 }
8512
8513 /* old command */
8514 ALIAS (show_ipv6_mbgp_community_exact,
8515 show_ipv6_mbgp_community2_exact_cmd,
8516 "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8517 SHOW_STR
8518 IPV6_STR
8519 MBGP_STR
8520 "Display routes matching the communities\n"
8521 "community number\n"
8522 "Do not send outside local AS (well-known community)\n"
8523 "Do not advertise to any peer (well-known community)\n"
8524 "Do not export to next AS (well-known community)\n"
8525 "community number\n"
8526 "Do not send outside local AS (well-known community)\n"
8527 "Do not advertise to any peer (well-known community)\n"
8528 "Do not export to next AS (well-known community)\n"
8529 "Exact match of the communities")
8530
8531 /* old command */
8532 ALIAS (show_ipv6_mbgp_community_exact,
8533 show_ipv6_mbgp_community3_exact_cmd,
8534 "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",
8535 SHOW_STR
8536 IPV6_STR
8537 MBGP_STR
8538 "Display routes matching the communities\n"
8539 "community number\n"
8540 "Do not send outside local AS (well-known community)\n"
8541 "Do not advertise to any peer (well-known community)\n"
8542 "Do not export to next AS (well-known community)\n"
8543 "community number\n"
8544 "Do not send outside local AS (well-known community)\n"
8545 "Do not advertise to any peer (well-known community)\n"
8546 "Do not export to next AS (well-known community)\n"
8547 "community number\n"
8548 "Do not send outside local AS (well-known community)\n"
8549 "Do not advertise to any peer (well-known community)\n"
8550 "Do not export to next AS (well-known community)\n"
8551 "Exact match of the communities")
8552
8553 /* old command */
8554 ALIAS (show_ipv6_mbgp_community_exact,
8555 show_ipv6_mbgp_community4_exact_cmd,
8556 "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",
8557 SHOW_STR
8558 IPV6_STR
8559 MBGP_STR
8560 "Display routes matching the communities\n"
8561 "community number\n"
8562 "Do not send outside local AS (well-known community)\n"
8563 "Do not advertise to any peer (well-known community)\n"
8564 "Do not export to next AS (well-known community)\n"
8565 "community number\n"
8566 "Do not send outside local AS (well-known community)\n"
8567 "Do not advertise to any peer (well-known community)\n"
8568 "Do not export to next AS (well-known community)\n"
8569 "community number\n"
8570 "Do not send outside local AS (well-known community)\n"
8571 "Do not advertise to any peer (well-known community)\n"
8572 "Do not export to next AS (well-known community)\n"
8573 "community number\n"
8574 "Do not send outside local AS (well-known community)\n"
8575 "Do not advertise to any peer (well-known community)\n"
8576 "Do not export to next AS (well-known community)\n"
8577 "Exact match of the communities")
8578 #endif /* HAVE_IPV6 */
8579 \f
8580 static int
8581 bgp_show_community_list (struct vty *vty, const char *com, int exact,
8582 u_int16_t afi, u_char safi)
8583 {
8584 struct community_list *list;
8585
8586 list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
8587 if (list == NULL)
8588 {
8589 vty_out (vty, "%% %s is not a valid community-list name%s", com,
8590 VTY_NEWLINE);
8591 return CMD_WARNING;
8592 }
8593
8594 return bgp_show (vty, NULL, afi, safi,
8595 (exact ? bgp_show_type_community_list_exact :
8596 bgp_show_type_community_list), list);
8597 }
8598
8599 DEFUN (show_ip_bgp_community_list,
8600 show_ip_bgp_community_list_cmd,
8601 "show ip bgp community-list (<1-500>|WORD)",
8602 SHOW_STR
8603 IP_STR
8604 BGP_STR
8605 "Display routes matching the community-list\n"
8606 "community-list number\n"
8607 "community-list name\n")
8608 {
8609 return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8610 }
8611
8612 DEFUN (show_ip_bgp_ipv4_community_list,
8613 show_ip_bgp_ipv4_community_list_cmd,
8614 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
8615 SHOW_STR
8616 IP_STR
8617 BGP_STR
8618 "Address family\n"
8619 "Address Family modifier\n"
8620 "Address Family modifier\n"
8621 "Display routes matching the community-list\n"
8622 "community-list number\n"
8623 "community-list name\n")
8624 {
8625 if (strncmp (argv[0], "m", 1) == 0)
8626 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8627
8628 return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8629 }
8630
8631 DEFUN (show_ip_bgp_community_list_exact,
8632 show_ip_bgp_community_list_exact_cmd,
8633 "show ip bgp community-list (<1-500>|WORD) exact-match",
8634 SHOW_STR
8635 IP_STR
8636 BGP_STR
8637 "Display routes matching the community-list\n"
8638 "community-list number\n"
8639 "community-list name\n"
8640 "Exact match of the communities\n")
8641 {
8642 return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8643 }
8644
8645 DEFUN (show_ip_bgp_ipv4_community_list_exact,
8646 show_ip_bgp_ipv4_community_list_exact_cmd,
8647 "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
8648 SHOW_STR
8649 IP_STR
8650 BGP_STR
8651 "Address family\n"
8652 "Address Family modifier\n"
8653 "Address Family modifier\n"
8654 "Display routes matching the community-list\n"
8655 "community-list number\n"
8656 "community-list name\n"
8657 "Exact match of the communities\n")
8658 {
8659 if (strncmp (argv[0], "m", 1) == 0)
8660 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8661
8662 return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8663 }
8664
8665 #ifdef HAVE_IPV6
8666 DEFUN (show_bgp_community_list,
8667 show_bgp_community_list_cmd,
8668 "show bgp community-list (<1-500>|WORD)",
8669 SHOW_STR
8670 BGP_STR
8671 "Display routes matching the community-list\n"
8672 "community-list number\n"
8673 "community-list name\n")
8674 {
8675 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8676 }
8677
8678 ALIAS (show_bgp_community_list,
8679 show_bgp_ipv6_community_list_cmd,
8680 "show bgp ipv6 community-list (<1-500>|WORD)",
8681 SHOW_STR
8682 BGP_STR
8683 "Address family\n"
8684 "Display routes matching the community-list\n"
8685 "community-list number\n"
8686 "community-list name\n")
8687
8688 /* old command */
8689 DEFUN (show_ipv6_bgp_community_list,
8690 show_ipv6_bgp_community_list_cmd,
8691 "show ipv6 bgp community-list WORD",
8692 SHOW_STR
8693 IPV6_STR
8694 BGP_STR
8695 "Display routes matching the community-list\n"
8696 "community-list name\n")
8697 {
8698 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8699 }
8700
8701 /* old command */
8702 DEFUN (show_ipv6_mbgp_community_list,
8703 show_ipv6_mbgp_community_list_cmd,
8704 "show ipv6 mbgp community-list WORD",
8705 SHOW_STR
8706 IPV6_STR
8707 MBGP_STR
8708 "Display routes matching the community-list\n"
8709 "community-list name\n")
8710 {
8711 return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8712 }
8713
8714 DEFUN (show_bgp_community_list_exact,
8715 show_bgp_community_list_exact_cmd,
8716 "show bgp community-list (<1-500>|WORD) exact-match",
8717 SHOW_STR
8718 BGP_STR
8719 "Display routes matching the community-list\n"
8720 "community-list number\n"
8721 "community-list name\n"
8722 "Exact match of the communities\n")
8723 {
8724 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8725 }
8726
8727 ALIAS (show_bgp_community_list_exact,
8728 show_bgp_ipv6_community_list_exact_cmd,
8729 "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
8730 SHOW_STR
8731 BGP_STR
8732 "Address family\n"
8733 "Display routes matching the community-list\n"
8734 "community-list number\n"
8735 "community-list name\n"
8736 "Exact match of the communities\n")
8737
8738 /* old command */
8739 DEFUN (show_ipv6_bgp_community_list_exact,
8740 show_ipv6_bgp_community_list_exact_cmd,
8741 "show ipv6 bgp community-list WORD exact-match",
8742 SHOW_STR
8743 IPV6_STR
8744 BGP_STR
8745 "Display routes matching the community-list\n"
8746 "community-list name\n"
8747 "Exact match of the communities\n")
8748 {
8749 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8750 }
8751
8752 /* old command */
8753 DEFUN (show_ipv6_mbgp_community_list_exact,
8754 show_ipv6_mbgp_community_list_exact_cmd,
8755 "show ipv6 mbgp community-list WORD exact-match",
8756 SHOW_STR
8757 IPV6_STR
8758 MBGP_STR
8759 "Display routes matching the community-list\n"
8760 "community-list name\n"
8761 "Exact match of the communities\n")
8762 {
8763 return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8764 }
8765 #endif /* HAVE_IPV6 */
8766 \f
8767 static int
8768 bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
8769 safi_t safi, enum bgp_show_type type)
8770 {
8771 int ret;
8772 struct prefix *p;
8773
8774 p = prefix_new();
8775
8776 ret = str2prefix (prefix, p);
8777 if (! ret)
8778 {
8779 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
8780 return CMD_WARNING;
8781 }
8782
8783 ret = bgp_show (vty, NULL, afi, safi, type, p);
8784 prefix_free(p);
8785 return ret;
8786 }
8787
8788 DEFUN (show_ip_bgp_prefix_longer,
8789 show_ip_bgp_prefix_longer_cmd,
8790 "show ip bgp A.B.C.D/M longer-prefixes",
8791 SHOW_STR
8792 IP_STR
8793 BGP_STR
8794 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8795 "Display route and more specific routes\n")
8796 {
8797 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8798 bgp_show_type_prefix_longer);
8799 }
8800
8801 DEFUN (show_ip_bgp_flap_prefix_longer,
8802 show_ip_bgp_flap_prefix_longer_cmd,
8803 "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
8804 SHOW_STR
8805 IP_STR
8806 BGP_STR
8807 "Display flap statistics of routes\n"
8808 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8809 "Display route and more specific routes\n")
8810 {
8811 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8812 bgp_show_type_flap_prefix_longer);
8813 }
8814
8815 DEFUN (show_ip_bgp_ipv4_prefix_longer,
8816 show_ip_bgp_ipv4_prefix_longer_cmd,
8817 "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
8818 SHOW_STR
8819 IP_STR
8820 BGP_STR
8821 "Address family\n"
8822 "Address Family modifier\n"
8823 "Address Family modifier\n"
8824 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8825 "Display route and more specific routes\n")
8826 {
8827 if (strncmp (argv[0], "m", 1) == 0)
8828 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8829 bgp_show_type_prefix_longer);
8830
8831 return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
8832 bgp_show_type_prefix_longer);
8833 }
8834
8835 DEFUN (show_ip_bgp_flap_address,
8836 show_ip_bgp_flap_address_cmd,
8837 "show ip bgp flap-statistics A.B.C.D",
8838 SHOW_STR
8839 IP_STR
8840 BGP_STR
8841 "Display flap statistics of routes\n"
8842 "Network in the BGP routing table to display\n")
8843 {
8844 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8845 bgp_show_type_flap_address);
8846 }
8847
8848 DEFUN (show_ip_bgp_flap_prefix,
8849 show_ip_bgp_flap_prefix_cmd,
8850 "show ip bgp flap-statistics A.B.C.D/M",
8851 SHOW_STR
8852 IP_STR
8853 BGP_STR
8854 "Display flap statistics of routes\n"
8855 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
8856 {
8857 return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8858 bgp_show_type_flap_prefix);
8859 }
8860 #ifdef HAVE_IPV6
8861 DEFUN (show_bgp_prefix_longer,
8862 show_bgp_prefix_longer_cmd,
8863 "show bgp X:X::X:X/M longer-prefixes",
8864 SHOW_STR
8865 BGP_STR
8866 "IPv6 prefix <network>/<length>\n"
8867 "Display route and more specific routes\n")
8868 {
8869 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8870 bgp_show_type_prefix_longer);
8871 }
8872
8873 ALIAS (show_bgp_prefix_longer,
8874 show_bgp_ipv6_prefix_longer_cmd,
8875 "show bgp ipv6 X:X::X:X/M longer-prefixes",
8876 SHOW_STR
8877 BGP_STR
8878 "Address family\n"
8879 "IPv6 prefix <network>/<length>\n"
8880 "Display route and more specific routes\n")
8881
8882 /* old command */
8883 DEFUN (show_ipv6_bgp_prefix_longer,
8884 show_ipv6_bgp_prefix_longer_cmd,
8885 "show ipv6 bgp X:X::X:X/M longer-prefixes",
8886 SHOW_STR
8887 IPV6_STR
8888 BGP_STR
8889 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8890 "Display route and more specific routes\n")
8891 {
8892 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8893 bgp_show_type_prefix_longer);
8894 }
8895
8896 /* old command */
8897 DEFUN (show_ipv6_mbgp_prefix_longer,
8898 show_ipv6_mbgp_prefix_longer_cmd,
8899 "show ipv6 mbgp X:X::X:X/M longer-prefixes",
8900 SHOW_STR
8901 IPV6_STR
8902 MBGP_STR
8903 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
8904 "Display route and more specific routes\n")
8905 {
8906 return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
8907 bgp_show_type_prefix_longer);
8908 }
8909 #endif /* HAVE_IPV6 */
8910
8911 static struct peer *
8912 peer_lookup_in_view (struct vty *vty, const char *view_name,
8913 const char *ip_str)
8914 {
8915 int ret;
8916 struct bgp *bgp;
8917 struct peer *peer;
8918 union sockunion su;
8919
8920 /* BGP structure lookup. */
8921 if (view_name)
8922 {
8923 bgp = bgp_lookup_by_name (view_name);
8924 if (! bgp)
8925 {
8926 vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
8927 return NULL;
8928 }
8929 }
8930 else
8931 {
8932 bgp = bgp_get_default ();
8933 if (! bgp)
8934 {
8935 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
8936 return NULL;
8937 }
8938 }
8939
8940 /* Get peer sockunion. */
8941 ret = str2sockunion (ip_str, &su);
8942 if (ret < 0)
8943 {
8944 vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
8945 return NULL;
8946 }
8947
8948 /* Peer structure lookup. */
8949 peer = peer_lookup (bgp, &su);
8950 if (! peer)
8951 {
8952 vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
8953 return NULL;
8954 }
8955
8956 return peer;
8957 }
8958 \f
8959 enum bgp_stats
8960 {
8961 BGP_STATS_MAXBITLEN = 0,
8962 BGP_STATS_RIB,
8963 BGP_STATS_PREFIXES,
8964 BGP_STATS_TOTPLEN,
8965 BGP_STATS_UNAGGREGATEABLE,
8966 BGP_STATS_MAX_AGGREGATEABLE,
8967 BGP_STATS_AGGREGATES,
8968 BGP_STATS_SPACE,
8969 BGP_STATS_ASPATH_COUNT,
8970 BGP_STATS_ASPATH_MAXHOPS,
8971 BGP_STATS_ASPATH_TOTHOPS,
8972 BGP_STATS_ASPATH_MAXSIZE,
8973 BGP_STATS_ASPATH_TOTSIZE,
8974 BGP_STATS_ASN_HIGHEST,
8975 BGP_STATS_MAX,
8976 };
8977
8978 static const char *table_stats_strs[] =
8979 {
8980 [BGP_STATS_PREFIXES] = "Total Prefixes",
8981 [BGP_STATS_TOTPLEN] = "Average prefix length",
8982 [BGP_STATS_RIB] = "Total Advertisements",
8983 [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
8984 [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
8985 [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
8986 [BGP_STATS_SPACE] = "Address space advertised",
8987 [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
8988 [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
8989 [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
8990 [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
8991 [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
8992 [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
8993 [BGP_STATS_MAX] = NULL,
8994 };
8995
8996 struct bgp_table_stats
8997 {
8998 struct bgp_table *table;
8999 unsigned long long counts[BGP_STATS_MAX];
9000 };
9001
9002 #if 0
9003 #define TALLY_SIGFIG 100000
9004 static unsigned long
9005 ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9006 {
9007 unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9008 unsigned long res = (newtot * TALLY_SIGFIG) / count;
9009 unsigned long ret = newtot / count;
9010
9011 if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9012 return ret + 1;
9013 else
9014 return ret;
9015 }
9016 #endif
9017
9018 static int
9019 bgp_table_stats_walker (struct thread *t)
9020 {
9021 struct bgp_node *rn;
9022 struct bgp_node *top;
9023 struct bgp_table_stats *ts = THREAD_ARG (t);
9024 unsigned int space = 0;
9025
9026 if (!(top = bgp_table_top (ts->table)))
9027 return 0;
9028
9029 switch (top->p.family)
9030 {
9031 case AF_INET:
9032 space = IPV4_MAX_BITLEN;
9033 break;
9034 case AF_INET6:
9035 space = IPV6_MAX_BITLEN;
9036 break;
9037 }
9038
9039 ts->counts[BGP_STATS_MAXBITLEN] = space;
9040
9041 for (rn = top; rn; rn = bgp_route_next (rn))
9042 {
9043 struct bgp_info *ri;
9044 struct bgp_node *prn = rn->parent;
9045 unsigned int rinum = 0;
9046
9047 if (rn == top)
9048 continue;
9049
9050 if (!rn->info)
9051 continue;
9052
9053 ts->counts[BGP_STATS_PREFIXES]++;
9054 ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9055
9056 #if 0
9057 ts->counts[BGP_STATS_AVGPLEN]
9058 = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9059 ts->counts[BGP_STATS_AVGPLEN],
9060 rn->p.prefixlen);
9061 #endif
9062
9063 /* check if the prefix is included by any other announcements */
9064 while (prn && !prn->info)
9065 prn = prn->parent;
9066
9067 if (prn == NULL || prn == top)
9068 {
9069 ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9070 /* announced address space */
9071 if (space)
9072 ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9073 }
9074 else if (prn->info)
9075 ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9076
9077 for (ri = rn->info; ri; ri = ri->next)
9078 {
9079 rinum++;
9080 ts->counts[BGP_STATS_RIB]++;
9081
9082 if (ri->attr &&
9083 (CHECK_FLAG (ri->attr->flag,
9084 ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9085 ts->counts[BGP_STATS_AGGREGATES]++;
9086
9087 /* as-path stats */
9088 if (ri->attr && ri->attr->aspath)
9089 {
9090 unsigned int hops = aspath_count_hops (ri->attr->aspath);
9091 unsigned int size = aspath_size (ri->attr->aspath);
9092 as_t highest = aspath_highest (ri->attr->aspath);
9093
9094 ts->counts[BGP_STATS_ASPATH_COUNT]++;
9095
9096 if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9097 ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9098
9099 if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9100 ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9101
9102 ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9103 ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9104 #if 0
9105 ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9106 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9107 ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9108 hops);
9109 ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9110 = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9111 ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9112 size);
9113 #endif
9114 if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9115 ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9116 }
9117 }
9118 }
9119 return 0;
9120 }
9121
9122 static int
9123 bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9124 {
9125 struct bgp_table_stats ts;
9126 unsigned int i;
9127
9128 if (!bgp->rib[afi][safi])
9129 {
9130 vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9131 return CMD_WARNING;
9132 }
9133
9134 memset (&ts, 0, sizeof (ts));
9135 ts.table = bgp->rib[afi][safi];
9136 thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9137
9138 vty_out (vty, "BGP %s RIB statistics%s%s",
9139 afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9140
9141 for (i = 0; i < BGP_STATS_MAX; i++)
9142 {
9143 if (!table_stats_strs[i])
9144 continue;
9145
9146 switch (i)
9147 {
9148 #if 0
9149 case BGP_STATS_ASPATH_AVGHOPS:
9150 case BGP_STATS_ASPATH_AVGSIZE:
9151 case BGP_STATS_AVGPLEN:
9152 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9153 vty_out (vty, "%12.2f",
9154 (float)ts.counts[i] / (float)TALLY_SIGFIG);
9155 break;
9156 #endif
9157 case BGP_STATS_ASPATH_TOTHOPS:
9158 case BGP_STATS_ASPATH_TOTSIZE:
9159 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9160 vty_out (vty, "%12.2f",
9161 ts.counts[i] ?
9162 (float)ts.counts[i] /
9163 (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9164 : 0);
9165 break;
9166 case BGP_STATS_TOTPLEN:
9167 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9168 vty_out (vty, "%12.2f",
9169 ts.counts[i] ?
9170 (float)ts.counts[i] /
9171 (float)ts.counts[BGP_STATS_PREFIXES]
9172 : 0);
9173 break;
9174 case BGP_STATS_SPACE:
9175 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9176 vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9177 if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9178 break;
9179 vty_out (vty, "%30s: ", "\% announced ");
9180 vty_out (vty, "%12.2f%s",
9181 100 * (float)ts.counts[BGP_STATS_SPACE] /
9182 (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
9183 VTY_NEWLINE);
9184 vty_out (vty, "%30s: ", "/8 equivalent ");
9185 vty_out (vty, "%12.2f%s",
9186 (float)ts.counts[BGP_STATS_SPACE] /
9187 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9188 VTY_NEWLINE);
9189 if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9190 break;
9191 vty_out (vty, "%30s: ", "/24 equivalent ");
9192 vty_out (vty, "%12.2f",
9193 (float)ts.counts[BGP_STATS_SPACE] /
9194 (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9195 break;
9196 default:
9197 vty_out (vty, "%-30s: ", table_stats_strs[i]);
9198 vty_out (vty, "%12llu", ts.counts[i]);
9199 }
9200
9201 vty_out (vty, "%s", VTY_NEWLINE);
9202 }
9203 return CMD_SUCCESS;
9204 }
9205
9206 static int
9207 bgp_table_stats_vty (struct vty *vty, const char *name,
9208 const char *afi_str, const char *safi_str)
9209 {
9210 struct bgp *bgp;
9211 afi_t afi;
9212 safi_t safi;
9213
9214 if (name)
9215 bgp = bgp_lookup_by_name (name);
9216 else
9217 bgp = bgp_get_default ();
9218
9219 if (!bgp)
9220 {
9221 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9222 return CMD_WARNING;
9223 }
9224 if (strncmp (afi_str, "ipv", 3) == 0)
9225 {
9226 if (strncmp (afi_str, "ipv4", 4) == 0)
9227 afi = AFI_IP;
9228 else if (strncmp (afi_str, "ipv6", 4) == 0)
9229 afi = AFI_IP6;
9230 else
9231 {
9232 vty_out (vty, "%% Invalid address family %s%s",
9233 afi_str, VTY_NEWLINE);
9234 return CMD_WARNING;
9235 }
9236 if (strncmp (safi_str, "m", 1) == 0)
9237 safi = SAFI_MULTICAST;
9238 else if (strncmp (safi_str, "u", 1) == 0)
9239 safi = SAFI_UNICAST;
9240 else if (strncmp (safi_str, "vpnv4", 5) == 0)
9241 safi = BGP_SAFI_VPNV4;
9242 else if (strncmp (safi_str, "vpnv6", 6) == 0)
9243 safi = BGP_SAFI_VPNV6;
9244 else
9245 {
9246 vty_out (vty, "%% Invalid subsequent address family %s%s",
9247 safi_str, VTY_NEWLINE);
9248 return CMD_WARNING;
9249 }
9250 }
9251 else
9252 {
9253 vty_out (vty, "%% Invalid address family %s%s",
9254 afi_str, VTY_NEWLINE);
9255 return CMD_WARNING;
9256 }
9257
9258 if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
9259 || (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
9260 {
9261 vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
9262 afi_str, safi_str, VTY_NEWLINE);
9263 return CMD_WARNING;
9264 }
9265 return bgp_table_stats (vty, bgp, afi, safi);
9266 }
9267
9268 DEFUN (show_bgp_statistics,
9269 show_bgp_statistics_cmd,
9270 "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9271 SHOW_STR
9272 BGP_STR
9273 "Address family\n"
9274 "Address family\n"
9275 "Address Family modifier\n"
9276 "Address Family modifier\n"
9277 "BGP RIB advertisement statistics\n")
9278 {
9279 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9280 }
9281
9282 ALIAS (show_bgp_statistics,
9283 show_bgp_statistics_vpnv4_cmd,
9284 "show bgp (ipv4) (vpnv4) statistics",
9285 SHOW_STR
9286 BGP_STR
9287 "Address family\n"
9288 "Address Family modifier\n"
9289 "BGP RIB advertisement statistics\n")
9290
9291 DEFUN (show_bgp_statistics_view,
9292 show_bgp_statistics_view_cmd,
9293 "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9294 SHOW_STR
9295 BGP_STR
9296 "BGP view\n"
9297 "Address family\n"
9298 "Address family\n"
9299 "Address Family modifier\n"
9300 "Address Family modifier\n"
9301 "BGP RIB advertisement statistics\n")
9302 {
9303 return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9304 }
9305
9306 ALIAS (show_bgp_statistics_view,
9307 show_bgp_statistics_view_vpnv4_cmd,
9308 "show bgp view WORD (ipv4) (vpnv4) statistics",
9309 SHOW_STR
9310 BGP_STR
9311 "BGP view\n"
9312 "Address family\n"
9313 "Address Family modifier\n"
9314 "BGP RIB advertisement statistics\n")
9315 \f
9316 enum bgp_pcounts
9317 {
9318 PCOUNT_ADJ_IN = 0,
9319 PCOUNT_DAMPED,
9320 PCOUNT_REMOVED,
9321 PCOUNT_HISTORY,
9322 PCOUNT_STALE,
9323 PCOUNT_VALID,
9324 PCOUNT_ALL,
9325 PCOUNT_COUNTED,
9326 PCOUNT_PFCNT, /* the figure we display to users */
9327 PCOUNT_MAX,
9328 };
9329
9330 static const char *pcount_strs[] =
9331 {
9332 [PCOUNT_ADJ_IN] = "Adj-in",
9333 [PCOUNT_DAMPED] = "Damped",
9334 [PCOUNT_REMOVED] = "Removed",
9335 [PCOUNT_HISTORY] = "History",
9336 [PCOUNT_STALE] = "Stale",
9337 [PCOUNT_VALID] = "Valid",
9338 [PCOUNT_ALL] = "All RIB",
9339 [PCOUNT_COUNTED] = "PfxCt counted",
9340 [PCOUNT_PFCNT] = "Useable",
9341 [PCOUNT_MAX] = NULL,
9342 };
9343
9344 struct peer_pcounts
9345 {
9346 unsigned int count[PCOUNT_MAX];
9347 const struct peer *peer;
9348 const struct bgp_table *table;
9349 };
9350
9351 static int
9352 bgp_peer_count_walker (struct thread *t)
9353 {
9354 struct bgp_node *rn;
9355 struct peer_pcounts *pc = THREAD_ARG (t);
9356 const struct peer *peer = pc->peer;
9357
9358 for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
9359 {
9360 struct bgp_adj_in *ain;
9361 struct bgp_info *ri;
9362
9363 for (ain = rn->adj_in; ain; ain = ain->next)
9364 if (ain->peer == peer)
9365 pc->count[PCOUNT_ADJ_IN]++;
9366
9367 for (ri = rn->info; ri; ri = ri->next)
9368 {
9369 char buf[SU_ADDRSTRLEN];
9370
9371 if (ri->peer != peer)
9372 continue;
9373
9374 pc->count[PCOUNT_ALL]++;
9375
9376 if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
9377 pc->count[PCOUNT_DAMPED]++;
9378 if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
9379 pc->count[PCOUNT_HISTORY]++;
9380 if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
9381 pc->count[PCOUNT_REMOVED]++;
9382 if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
9383 pc->count[PCOUNT_STALE]++;
9384 if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
9385 pc->count[PCOUNT_VALID]++;
9386 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9387 pc->count[PCOUNT_PFCNT]++;
9388
9389 if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9390 {
9391 pc->count[PCOUNT_COUNTED]++;
9392 if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9393 plog_warn (peer->log,
9394 "%s [pcount] %s/%d is counted but flags 0x%x",
9395 peer->host,
9396 inet_ntop(rn->p.family, &rn->p.u.prefix,
9397 buf, SU_ADDRSTRLEN),
9398 rn->p.prefixlen,
9399 ri->flags);
9400 }
9401 else
9402 {
9403 if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9404 plog_warn (peer->log,
9405 "%s [pcount] %s/%d not counted but flags 0x%x",
9406 peer->host,
9407 inet_ntop(rn->p.family, &rn->p.u.prefix,
9408 buf, SU_ADDRSTRLEN),
9409 rn->p.prefixlen,
9410 ri->flags);
9411 }
9412 }
9413 }
9414 return 0;
9415 }
9416
9417 static int
9418 bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9419 {
9420 struct peer_pcounts pcounts = { .peer = peer };
9421 unsigned int i;
9422
9423 if (!peer || !peer->bgp || !peer->afc[afi][safi]
9424 || !peer->bgp->rib[afi][safi])
9425 {
9426 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9427 return CMD_WARNING;
9428 }
9429
9430 memset (&pcounts, 0, sizeof(pcounts));
9431 pcounts.peer = peer;
9432 pcounts.table = peer->bgp->rib[afi][safi];
9433
9434 /* in-place call via thread subsystem so as to record execution time
9435 * stats for the thread-walk (i.e. ensure this can't be blamed on
9436 * on just vty_read()).
9437 */
9438 thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9439
9440 vty_out (vty, "Prefix counts for %s, %s%s",
9441 peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9442 vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9443 vty_out (vty, "%sCounts from RIB table walk:%s%s",
9444 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9445
9446 for (i = 0; i < PCOUNT_MAX; i++)
9447 vty_out (vty, "%20s: %-10d%s",
9448 pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
9449
9450 if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
9451 {
9452 vty_out (vty, "%s [pcount] PfxCt drift!%s",
9453 peer->host, VTY_NEWLINE);
9454 vty_out (vty, "Please report this bug, with the above command output%s",
9455 VTY_NEWLINE);
9456 }
9457
9458 return CMD_SUCCESS;
9459 }
9460
9461 DEFUN (show_ip_bgp_neighbor_prefix_counts,
9462 show_ip_bgp_neighbor_prefix_counts_cmd,
9463 "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9464 SHOW_STR
9465 IP_STR
9466 BGP_STR
9467 "Detailed information on TCP and BGP neighbor connections\n"
9468 "Neighbor to display information about\n"
9469 "Neighbor to display information about\n"
9470 "Display detailed prefix count information\n")
9471 {
9472 struct peer *peer;
9473
9474 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9475 if (! peer)
9476 return CMD_WARNING;
9477
9478 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9479 }
9480
9481 DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9482 show_bgp_ipv6_neighbor_prefix_counts_cmd,
9483 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9484 SHOW_STR
9485 BGP_STR
9486 "Address family\n"
9487 "Detailed information on TCP and BGP neighbor connections\n"
9488 "Neighbor to display information about\n"
9489 "Neighbor to display information about\n"
9490 "Display detailed prefix count information\n")
9491 {
9492 struct peer *peer;
9493
9494 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9495 if (! peer)
9496 return CMD_WARNING;
9497
9498 return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9499 }
9500
9501 DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9502 show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9503 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9504 SHOW_STR
9505 IP_STR
9506 BGP_STR
9507 "Address family\n"
9508 "Address Family modifier\n"
9509 "Address Family modifier\n"
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")
9514 {
9515 struct peer *peer;
9516
9517 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9518 if (! peer)
9519 return CMD_WARNING;
9520
9521 if (strncmp (argv[0], "m", 1) == 0)
9522 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9523
9524 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9525 }
9526
9527 DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9528 show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9529 "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9530 SHOW_STR
9531 IP_STR
9532 BGP_STR
9533 "Address family\n"
9534 "Address Family modifier\n"
9535 "Address Family modifier\n"
9536 "Detailed information on TCP and BGP neighbor connections\n"
9537 "Neighbor to display information about\n"
9538 "Neighbor to display information about\n"
9539 "Display detailed prefix count information\n")
9540 {
9541 struct peer *peer;
9542
9543 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9544 if (! peer)
9545 return CMD_WARNING;
9546
9547 return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9548 }
9549
9550
9551 static void
9552 show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9553 int in)
9554 {
9555 struct bgp_table *table;
9556 struct bgp_adj_in *ain;
9557 struct bgp_adj_out *adj;
9558 unsigned long output_count;
9559 struct bgp_node *rn;
9560 int header1 = 1;
9561 struct bgp *bgp;
9562 int header2 = 1;
9563
9564 bgp = peer->bgp;
9565
9566 if (! bgp)
9567 return;
9568
9569 table = bgp->rib[afi][safi];
9570
9571 output_count = 0;
9572
9573 if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9574 PEER_STATUS_DEFAULT_ORIGINATE))
9575 {
9576 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9577 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9578 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9579
9580 vty_out (vty, "Originating default network 0.0.0.0%s%s",
9581 VTY_NEWLINE, VTY_NEWLINE);
9582 header1 = 0;
9583 }
9584
9585 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9586 if (in)
9587 {
9588 for (ain = rn->adj_in; ain; ain = ain->next)
9589 if (ain->peer == peer)
9590 {
9591 if (header1)
9592 {
9593 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9594 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9595 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9596 header1 = 0;
9597 }
9598 if (header2)
9599 {
9600 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9601 header2 = 0;
9602 }
9603 if (ain->attr)
9604 {
9605 route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9606 output_count++;
9607 }
9608 }
9609 }
9610 else
9611 {
9612 for (adj = rn->adj_out; adj; adj = adj->next)
9613 if (adj->peer == peer)
9614 {
9615 if (header1)
9616 {
9617 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9618 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9619 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9620 header1 = 0;
9621 }
9622 if (header2)
9623 {
9624 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9625 header2 = 0;
9626 }
9627 if (adj->attr)
9628 {
9629 route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9630 output_count++;
9631 }
9632 }
9633 }
9634
9635 if (output_count != 0)
9636 vty_out (vty, "%sTotal number of prefixes %ld%s",
9637 VTY_NEWLINE, output_count, VTY_NEWLINE);
9638 }
9639
9640 static int
9641 peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9642 {
9643 if (! peer || ! peer->afc[afi][safi])
9644 {
9645 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9646 return CMD_WARNING;
9647 }
9648
9649 if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9650 {
9651 vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9652 VTY_NEWLINE);
9653 return CMD_WARNING;
9654 }
9655
9656 show_adj_route (vty, peer, afi, safi, in);
9657
9658 return CMD_SUCCESS;
9659 }
9660
9661 DEFUN (show_ip_bgp_neighbor_advertised_route,
9662 show_ip_bgp_neighbor_advertised_route_cmd,
9663 "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9664 SHOW_STR
9665 IP_STR
9666 BGP_STR
9667 "Detailed information on TCP and BGP neighbor connections\n"
9668 "Neighbor to display information about\n"
9669 "Neighbor to display information about\n"
9670 "Display the routes advertised to a BGP neighbor\n")
9671 {
9672 struct peer *peer;
9673
9674 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9675 if (! peer)
9676 return CMD_WARNING;
9677
9678 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9679 }
9680
9681 DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9682 show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9683 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9684 SHOW_STR
9685 IP_STR
9686 BGP_STR
9687 "Address family\n"
9688 "Address Family modifier\n"
9689 "Address Family modifier\n"
9690 "Detailed information on TCP and BGP neighbor connections\n"
9691 "Neighbor to display information about\n"
9692 "Neighbor to display information about\n"
9693 "Display the routes advertised to a BGP neighbor\n")
9694 {
9695 struct peer *peer;
9696
9697 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9698 if (! peer)
9699 return CMD_WARNING;
9700
9701 if (strncmp (argv[0], "m", 1) == 0)
9702 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9703
9704 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9705 }
9706
9707 #ifdef HAVE_IPV6
9708 DEFUN (show_bgp_view_neighbor_advertised_route,
9709 show_bgp_view_neighbor_advertised_route_cmd,
9710 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9711 SHOW_STR
9712 BGP_STR
9713 "BGP view\n"
9714 "View name\n"
9715 "Detailed information on TCP and BGP neighbor connections\n"
9716 "Neighbor to display information about\n"
9717 "Neighbor to display information about\n"
9718 "Display the routes advertised to a BGP neighbor\n")
9719 {
9720 struct peer *peer;
9721
9722 if (argc == 2)
9723 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9724 else
9725 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9726
9727 if (! peer)
9728 return CMD_WARNING;
9729
9730 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9731 }
9732
9733 ALIAS (show_bgp_view_neighbor_advertised_route,
9734 show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9735 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9736 SHOW_STR
9737 BGP_STR
9738 "BGP view\n"
9739 "View name\n"
9740 "Address family\n"
9741 "Detailed information on TCP and BGP neighbor connections\n"
9742 "Neighbor to display information about\n"
9743 "Neighbor to display information about\n"
9744 "Display the routes advertised to a BGP neighbor\n")
9745
9746 DEFUN (show_bgp_view_neighbor_received_routes,
9747 show_bgp_view_neighbor_received_routes_cmd,
9748 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9749 SHOW_STR
9750 BGP_STR
9751 "BGP view\n"
9752 "View name\n"
9753 "Detailed information on TCP and BGP neighbor connections\n"
9754 "Neighbor to display information about\n"
9755 "Neighbor to display information about\n"
9756 "Display the received routes from neighbor\n")
9757 {
9758 struct peer *peer;
9759
9760 if (argc == 2)
9761 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9762 else
9763 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9764
9765 if (! peer)
9766 return CMD_WARNING;
9767
9768 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
9769 }
9770
9771 ALIAS (show_bgp_view_neighbor_received_routes,
9772 show_bgp_view_ipv6_neighbor_received_routes_cmd,
9773 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9774 SHOW_STR
9775 BGP_STR
9776 "BGP view\n"
9777 "View name\n"
9778 "Address family\n"
9779 "Detailed information on TCP and BGP neighbor connections\n"
9780 "Neighbor to display information about\n"
9781 "Neighbor to display information about\n"
9782 "Display the received routes from neighbor\n")
9783
9784 ALIAS (show_bgp_view_neighbor_advertised_route,
9785 show_bgp_neighbor_advertised_route_cmd,
9786 "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9787 SHOW_STR
9788 BGP_STR
9789 "Detailed information on TCP and BGP neighbor connections\n"
9790 "Neighbor to display information about\n"
9791 "Neighbor to display information about\n"
9792 "Display the routes advertised to a BGP neighbor\n")
9793
9794 ALIAS (show_bgp_view_neighbor_advertised_route,
9795 show_bgp_ipv6_neighbor_advertised_route_cmd,
9796 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9797 SHOW_STR
9798 BGP_STR
9799 "Address family\n"
9800 "Detailed information on TCP and BGP neighbor connections\n"
9801 "Neighbor to display information about\n"
9802 "Neighbor to display information about\n"
9803 "Display the routes advertised to a BGP neighbor\n")
9804
9805 /* old command */
9806 ALIAS (show_bgp_view_neighbor_advertised_route,
9807 ipv6_bgp_neighbor_advertised_route_cmd,
9808 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9809 SHOW_STR
9810 IPV6_STR
9811 BGP_STR
9812 "Detailed information on TCP and BGP neighbor connections\n"
9813 "Neighbor to display information about\n"
9814 "Neighbor to display information about\n"
9815 "Display the routes advertised to a BGP neighbor\n")
9816
9817 /* old command */
9818 DEFUN (ipv6_mbgp_neighbor_advertised_route,
9819 ipv6_mbgp_neighbor_advertised_route_cmd,
9820 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9821 SHOW_STR
9822 IPV6_STR
9823 MBGP_STR
9824 "Detailed information on TCP and BGP neighbor connections\n"
9825 "Neighbor to display information about\n"
9826 "Neighbor to display information about\n"
9827 "Display the routes advertised to a BGP neighbor\n")
9828 {
9829 struct peer *peer;
9830
9831 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9832 if (! peer)
9833 return CMD_WARNING;
9834
9835 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
9836 }
9837 #endif /* HAVE_IPV6 */
9838 \f
9839 DEFUN (show_ip_bgp_neighbor_received_routes,
9840 show_ip_bgp_neighbor_received_routes_cmd,
9841 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9842 SHOW_STR
9843 IP_STR
9844 BGP_STR
9845 "Detailed information on TCP and BGP neighbor connections\n"
9846 "Neighbor to display information about\n"
9847 "Neighbor to display information about\n"
9848 "Display the received routes from neighbor\n")
9849 {
9850 struct peer *peer;
9851
9852 peer = peer_lookup_in_view (vty, NULL, argv[0]);
9853 if (! peer)
9854 return CMD_WARNING;
9855
9856 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
9857 }
9858
9859 DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
9860 show_ip_bgp_ipv4_neighbor_received_routes_cmd,
9861 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
9862 SHOW_STR
9863 IP_STR
9864 BGP_STR
9865 "Address family\n"
9866 "Address Family modifier\n"
9867 "Address Family modifier\n"
9868 "Detailed information on TCP and BGP neighbor connections\n"
9869 "Neighbor to display information about\n"
9870 "Neighbor to display information about\n"
9871 "Display the received routes from neighbor\n")
9872 {
9873 struct peer *peer;
9874
9875 peer = peer_lookup_in_view (vty, NULL, argv[1]);
9876 if (! peer)
9877 return CMD_WARNING;
9878
9879 if (strncmp (argv[0], "m", 1) == 0)
9880 return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
9881
9882 return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
9883 }
9884
9885 DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
9886 show_ip_bgp_neighbor_received_prefix_filter_cmd,
9887 "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9888 SHOW_STR
9889 IP_STR
9890 BGP_STR
9891 "Detailed information on TCP and BGP neighbor connections\n"
9892 "Neighbor to display information about\n"
9893 "Neighbor to display information about\n"
9894 "Display information received from a BGP neighbor\n"
9895 "Display the prefixlist filter\n")
9896 {
9897 char name[BUFSIZ];
9898 union sockunion *su;
9899 struct peer *peer;
9900 int count;
9901
9902 su = sockunion_str2su (argv[0]);
9903 if (su == NULL)
9904 return CMD_WARNING;
9905
9906 peer = peer_lookup (NULL, su);
9907 if (! peer)
9908 return CMD_WARNING;
9909
9910 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
9911 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9912 if (count)
9913 {
9914 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
9915 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9916 }
9917
9918 return CMD_SUCCESS;
9919 }
9920
9921 DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
9922 show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
9923 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9924 SHOW_STR
9925 IP_STR
9926 BGP_STR
9927 "Address family\n"
9928 "Address Family modifier\n"
9929 "Address Family modifier\n"
9930 "Detailed information on TCP and BGP neighbor connections\n"
9931 "Neighbor to display information about\n"
9932 "Neighbor to display information about\n"
9933 "Display information received from a BGP neighbor\n"
9934 "Display the prefixlist filter\n")
9935 {
9936 char name[BUFSIZ];
9937 union sockunion *su;
9938 struct peer *peer;
9939 int count;
9940
9941 su = sockunion_str2su (argv[1]);
9942 if (su == NULL)
9943 return CMD_WARNING;
9944
9945 peer = peer_lookup (NULL, su);
9946 if (! peer)
9947 return CMD_WARNING;
9948
9949 if (strncmp (argv[0], "m", 1) == 0)
9950 {
9951 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
9952 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9953 if (count)
9954 {
9955 vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
9956 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9957 }
9958 }
9959 else
9960 {
9961 sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
9962 count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
9963 if (count)
9964 {
9965 vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
9966 prefix_bgp_show_prefix_list (vty, AFI_IP, name);
9967 }
9968 }
9969
9970 return CMD_SUCCESS;
9971 }
9972
9973
9974 #ifdef HAVE_IPV6
9975 ALIAS (show_bgp_view_neighbor_received_routes,
9976 show_bgp_neighbor_received_routes_cmd,
9977 "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
9978 SHOW_STR
9979 BGP_STR
9980 "Detailed information on TCP and BGP neighbor connections\n"
9981 "Neighbor to display information about\n"
9982 "Neighbor to display information about\n"
9983 "Display the received routes from neighbor\n")
9984
9985 ALIAS (show_bgp_view_neighbor_received_routes,
9986 show_bgp_ipv6_neighbor_received_routes_cmd,
9987 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9988 SHOW_STR
9989 BGP_STR
9990 "Address family\n"
9991 "Detailed information on TCP and BGP neighbor connections\n"
9992 "Neighbor to display information about\n"
9993 "Neighbor to display information about\n"
9994 "Display the received routes from neighbor\n")
9995
9996 DEFUN (show_bgp_neighbor_received_prefix_filter,
9997 show_bgp_neighbor_received_prefix_filter_cmd,
9998 "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
9999 SHOW_STR
10000 BGP_STR
10001 "Detailed information on TCP and BGP neighbor connections\n"
10002 "Neighbor to display information about\n"
10003 "Neighbor to display information about\n"
10004 "Display information received from a BGP neighbor\n"
10005 "Display the prefixlist filter\n")
10006 {
10007 char name[BUFSIZ];
10008 union sockunion *su;
10009 struct peer *peer;
10010 int count;
10011
10012 su = sockunion_str2su (argv[0]);
10013 if (su == NULL)
10014 return CMD_WARNING;
10015
10016 peer = peer_lookup (NULL, su);
10017 if (! peer)
10018 return CMD_WARNING;
10019
10020 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10021 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10022 if (count)
10023 {
10024 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10025 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10026 }
10027
10028 return CMD_SUCCESS;
10029 }
10030
10031 ALIAS (show_bgp_neighbor_received_prefix_filter,
10032 show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10033 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10034 SHOW_STR
10035 BGP_STR
10036 "Address family\n"
10037 "Detailed information on TCP and BGP neighbor connections\n"
10038 "Neighbor to display information about\n"
10039 "Neighbor to display information about\n"
10040 "Display information received from a BGP neighbor\n"
10041 "Display the prefixlist filter\n")
10042
10043 /* old command */
10044 ALIAS (show_bgp_view_neighbor_received_routes,
10045 ipv6_bgp_neighbor_received_routes_cmd,
10046 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10047 SHOW_STR
10048 IPV6_STR
10049 BGP_STR
10050 "Detailed information on TCP and BGP neighbor connections\n"
10051 "Neighbor to display information about\n"
10052 "Neighbor to display information about\n"
10053 "Display the received routes from neighbor\n")
10054
10055 /* old command */
10056 DEFUN (ipv6_mbgp_neighbor_received_routes,
10057 ipv6_mbgp_neighbor_received_routes_cmd,
10058 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10059 SHOW_STR
10060 IPV6_STR
10061 MBGP_STR
10062 "Detailed information on TCP and BGP neighbor connections\n"
10063 "Neighbor to display information about\n"
10064 "Neighbor to display information about\n"
10065 "Display the received routes from neighbor\n")
10066 {
10067 struct peer *peer;
10068
10069 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10070 if (! peer)
10071 return CMD_WARNING;
10072
10073 return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
10074 }
10075
10076 DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10077 show_bgp_view_neighbor_received_prefix_filter_cmd,
10078 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10079 SHOW_STR
10080 BGP_STR
10081 "BGP view\n"
10082 "View name\n"
10083 "Detailed information on TCP and BGP neighbor connections\n"
10084 "Neighbor to display information about\n"
10085 "Neighbor to display information about\n"
10086 "Display information received from a BGP neighbor\n"
10087 "Display the prefixlist filter\n")
10088 {
10089 char name[BUFSIZ];
10090 union sockunion *su;
10091 struct peer *peer;
10092 struct bgp *bgp;
10093 int count;
10094
10095 /* BGP structure lookup. */
10096 bgp = bgp_lookup_by_name (argv[0]);
10097 if (bgp == NULL)
10098 {
10099 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10100 return CMD_WARNING;
10101 }
10102
10103 su = sockunion_str2su (argv[1]);
10104 if (su == NULL)
10105 return CMD_WARNING;
10106
10107 peer = peer_lookup (bgp, su);
10108 if (! peer)
10109 return CMD_WARNING;
10110
10111 sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10112 count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10113 if (count)
10114 {
10115 vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10116 prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10117 }
10118
10119 return CMD_SUCCESS;
10120 }
10121
10122 ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10123 show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10124 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10125 SHOW_STR
10126 BGP_STR
10127 "BGP view\n"
10128 "View name\n"
10129 "Address family\n"
10130 "Detailed information on TCP and BGP neighbor connections\n"
10131 "Neighbor to display information about\n"
10132 "Neighbor to display information about\n"
10133 "Display information received from a BGP neighbor\n"
10134 "Display the prefixlist filter\n")
10135 #endif /* HAVE_IPV6 */
10136 \f
10137 static int
10138 bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
10139 safi_t safi, enum bgp_show_type type)
10140 {
10141 if (! peer || ! peer->afc[afi][safi])
10142 {
10143 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
10144 return CMD_WARNING;
10145 }
10146
10147 return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
10148 }
10149
10150 DEFUN (show_ip_bgp_neighbor_routes,
10151 show_ip_bgp_neighbor_routes_cmd,
10152 "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10153 SHOW_STR
10154 IP_STR
10155 BGP_STR
10156 "Detailed information on TCP and BGP neighbor connections\n"
10157 "Neighbor to display information about\n"
10158 "Neighbor to display information about\n"
10159 "Display routes learned from neighbor\n")
10160 {
10161 struct peer *peer;
10162
10163 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10164 if (! peer)
10165 return CMD_WARNING;
10166
10167 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10168 bgp_show_type_neighbor);
10169 }
10170
10171 DEFUN (show_ip_bgp_neighbor_flap,
10172 show_ip_bgp_neighbor_flap_cmd,
10173 "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10174 SHOW_STR
10175 IP_STR
10176 BGP_STR
10177 "Detailed information on TCP and BGP neighbor connections\n"
10178 "Neighbor to display information about\n"
10179 "Neighbor to display information about\n"
10180 "Display flap statistics of the routes learned from neighbor\n")
10181 {
10182 struct peer *peer;
10183
10184 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10185 if (! peer)
10186 return CMD_WARNING;
10187
10188 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10189 bgp_show_type_flap_neighbor);
10190 }
10191
10192 DEFUN (show_ip_bgp_neighbor_damp,
10193 show_ip_bgp_neighbor_damp_cmd,
10194 "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10195 SHOW_STR
10196 IP_STR
10197 BGP_STR
10198 "Detailed information on TCP and BGP neighbor connections\n"
10199 "Neighbor to display information about\n"
10200 "Neighbor to display information about\n"
10201 "Display the dampened routes received from neighbor\n")
10202 {
10203 struct peer *peer;
10204
10205 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10206 if (! peer)
10207 return CMD_WARNING;
10208
10209 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10210 bgp_show_type_damp_neighbor);
10211 }
10212
10213 DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10214 show_ip_bgp_ipv4_neighbor_routes_cmd,
10215 "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10216 SHOW_STR
10217 IP_STR
10218 BGP_STR
10219 "Address family\n"
10220 "Address Family modifier\n"
10221 "Address Family modifier\n"
10222 "Detailed information on TCP and BGP neighbor connections\n"
10223 "Neighbor to display information about\n"
10224 "Neighbor to display information about\n"
10225 "Display routes learned from neighbor\n")
10226 {
10227 struct peer *peer;
10228
10229 peer = peer_lookup_in_view (vty, NULL, argv[1]);
10230 if (! peer)
10231 return CMD_WARNING;
10232
10233 if (strncmp (argv[0], "m", 1) == 0)
10234 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
10235 bgp_show_type_neighbor);
10236
10237 return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10238 bgp_show_type_neighbor);
10239 }
10240
10241 DEFUN (show_ip_bgp_view_rsclient,
10242 show_ip_bgp_view_rsclient_cmd,
10243 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10244 SHOW_STR
10245 IP_STR
10246 BGP_STR
10247 "BGP view\n"
10248 "BGP view name\n"
10249 "Information about Route Server Client\n"
10250 NEIGHBOR_ADDR_STR)
10251 {
10252 struct bgp_table *table;
10253 struct peer *peer;
10254
10255 if (argc == 2)
10256 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10257 else
10258 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10259
10260 if (! peer)
10261 return CMD_WARNING;
10262
10263 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10264 {
10265 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10266 VTY_NEWLINE);
10267 return CMD_WARNING;
10268 }
10269
10270 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10271 PEER_FLAG_RSERVER_CLIENT))
10272 {
10273 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10274 VTY_NEWLINE);
10275 return CMD_WARNING;
10276 }
10277
10278 table = peer->rib[AFI_IP][SAFI_UNICAST];
10279
10280 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10281 }
10282
10283 ALIAS (show_ip_bgp_view_rsclient,
10284 show_ip_bgp_rsclient_cmd,
10285 "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10286 SHOW_STR
10287 IP_STR
10288 BGP_STR
10289 "Information about Route Server Client\n"
10290 NEIGHBOR_ADDR_STR)
10291
10292 DEFUN (show_ip_bgp_view_rsclient_route,
10293 show_ip_bgp_view_rsclient_route_cmd,
10294 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10295 SHOW_STR
10296 IP_STR
10297 BGP_STR
10298 "BGP view\n"
10299 "BGP view name\n"
10300 "Information about Route Server Client\n"
10301 NEIGHBOR_ADDR_STR
10302 "Network in the BGP routing table to display\n")
10303 {
10304 struct bgp *bgp;
10305 struct peer *peer;
10306
10307 /* BGP structure lookup. */
10308 if (argc == 3)
10309 {
10310 bgp = bgp_lookup_by_name (argv[0]);
10311 if (bgp == NULL)
10312 {
10313 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10314 return CMD_WARNING;
10315 }
10316 }
10317 else
10318 {
10319 bgp = bgp_get_default ();
10320 if (bgp == NULL)
10321 {
10322 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10323 return CMD_WARNING;
10324 }
10325 }
10326
10327 if (argc == 3)
10328 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10329 else
10330 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10331
10332 if (! peer)
10333 return CMD_WARNING;
10334
10335 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10336 {
10337 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10338 VTY_NEWLINE);
10339 return CMD_WARNING;
10340 }
10341
10342 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10343 PEER_FLAG_RSERVER_CLIENT))
10344 {
10345 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10346 VTY_NEWLINE);
10347 return CMD_WARNING;
10348 }
10349
10350 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10351 (argc == 3) ? argv[2] : argv[1],
10352 AFI_IP, SAFI_UNICAST, NULL, 0);
10353 }
10354
10355 ALIAS (show_ip_bgp_view_rsclient_route,
10356 show_ip_bgp_rsclient_route_cmd,
10357 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10358 SHOW_STR
10359 IP_STR
10360 BGP_STR
10361 "Information about Route Server Client\n"
10362 NEIGHBOR_ADDR_STR
10363 "Network in the BGP routing table to display\n")
10364
10365 DEFUN (show_ip_bgp_view_rsclient_prefix,
10366 show_ip_bgp_view_rsclient_prefix_cmd,
10367 "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10368 SHOW_STR
10369 IP_STR
10370 BGP_STR
10371 "BGP view\n"
10372 "BGP view name\n"
10373 "Information about Route Server Client\n"
10374 NEIGHBOR_ADDR_STR
10375 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10376 {
10377 struct bgp *bgp;
10378 struct peer *peer;
10379
10380 /* BGP structure lookup. */
10381 if (argc == 3)
10382 {
10383 bgp = bgp_lookup_by_name (argv[0]);
10384 if (bgp == NULL)
10385 {
10386 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10387 return CMD_WARNING;
10388 }
10389 }
10390 else
10391 {
10392 bgp = bgp_get_default ();
10393 if (bgp == NULL)
10394 {
10395 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10396 return CMD_WARNING;
10397 }
10398 }
10399
10400 if (argc == 3)
10401 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10402 else
10403 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10404
10405 if (! peer)
10406 return CMD_WARNING;
10407
10408 if (! peer->afc[AFI_IP][SAFI_UNICAST])
10409 {
10410 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10411 VTY_NEWLINE);
10412 return CMD_WARNING;
10413 }
10414
10415 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10416 PEER_FLAG_RSERVER_CLIENT))
10417 {
10418 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10419 VTY_NEWLINE);
10420 return CMD_WARNING;
10421 }
10422
10423 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10424 (argc == 3) ? argv[2] : argv[1],
10425 AFI_IP, SAFI_UNICAST, NULL, 1);
10426 }
10427
10428 ALIAS (show_ip_bgp_view_rsclient_prefix,
10429 show_ip_bgp_rsclient_prefix_cmd,
10430 "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10431 SHOW_STR
10432 IP_STR
10433 BGP_STR
10434 "Information about Route Server Client\n"
10435 NEIGHBOR_ADDR_STR
10436 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10437
10438
10439 #ifdef HAVE_IPV6
10440 DEFUN (show_bgp_view_neighbor_routes,
10441 show_bgp_view_neighbor_routes_cmd,
10442 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10443 SHOW_STR
10444 BGP_STR
10445 "BGP view\n"
10446 "BGP view name\n"
10447 "Detailed information on TCP and BGP neighbor connections\n"
10448 "Neighbor to display information about\n"
10449 "Neighbor to display information about\n"
10450 "Display routes learned from neighbor\n")
10451 {
10452 struct peer *peer;
10453
10454 if (argc == 2)
10455 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10456 else
10457 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10458
10459 if (! peer)
10460 return CMD_WARNING;
10461
10462 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10463 bgp_show_type_neighbor);
10464 }
10465
10466 ALIAS (show_bgp_view_neighbor_routes,
10467 show_bgp_view_ipv6_neighbor_routes_cmd,
10468 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10469 SHOW_STR
10470 BGP_STR
10471 "BGP view\n"
10472 "BGP view name\n"
10473 "Address family\n"
10474 "Detailed information on TCP and BGP neighbor connections\n"
10475 "Neighbor to display information about\n"
10476 "Neighbor to display information about\n"
10477 "Display routes learned from neighbor\n")
10478
10479 DEFUN (show_bgp_view_neighbor_damp,
10480 show_bgp_view_neighbor_damp_cmd,
10481 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10482 SHOW_STR
10483 BGP_STR
10484 "BGP view\n"
10485 "BGP view name\n"
10486 "Detailed information on TCP and BGP neighbor connections\n"
10487 "Neighbor to display information about\n"
10488 "Neighbor to display information about\n"
10489 "Display the dampened routes received from neighbor\n")
10490 {
10491 struct peer *peer;
10492
10493 if (argc == 2)
10494 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10495 else
10496 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10497
10498 if (! peer)
10499 return CMD_WARNING;
10500
10501 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10502 bgp_show_type_damp_neighbor);
10503 }
10504
10505 ALIAS (show_bgp_view_neighbor_damp,
10506 show_bgp_view_ipv6_neighbor_damp_cmd,
10507 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10508 SHOW_STR
10509 BGP_STR
10510 "BGP view\n"
10511 "BGP view name\n"
10512 "Address family\n"
10513 "Detailed information on TCP and BGP neighbor connections\n"
10514 "Neighbor to display information about\n"
10515 "Neighbor to display information about\n"
10516 "Display the dampened routes received from neighbor\n")
10517
10518 DEFUN (show_bgp_view_neighbor_flap,
10519 show_bgp_view_neighbor_flap_cmd,
10520 "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10521 SHOW_STR
10522 BGP_STR
10523 "BGP view\n"
10524 "BGP view name\n"
10525 "Detailed information on TCP and BGP neighbor connections\n"
10526 "Neighbor to display information about\n"
10527 "Neighbor to display information about\n"
10528 "Display flap statistics of the routes learned from neighbor\n")
10529 {
10530 struct peer *peer;
10531
10532 if (argc == 2)
10533 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10534 else
10535 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10536
10537 if (! peer)
10538 return CMD_WARNING;
10539
10540 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10541 bgp_show_type_flap_neighbor);
10542 }
10543
10544 ALIAS (show_bgp_view_neighbor_flap,
10545 show_bgp_view_ipv6_neighbor_flap_cmd,
10546 "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10547 SHOW_STR
10548 BGP_STR
10549 "BGP view\n"
10550 "BGP view name\n"
10551 "Address family\n"
10552 "Detailed information on TCP and BGP neighbor connections\n"
10553 "Neighbor to display information about\n"
10554 "Neighbor to display information about\n"
10555 "Display flap statistics of the routes learned from neighbor\n")
10556
10557 ALIAS (show_bgp_view_neighbor_routes,
10558 show_bgp_neighbor_routes_cmd,
10559 "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
10560 SHOW_STR
10561 BGP_STR
10562 "Detailed information on TCP and BGP neighbor connections\n"
10563 "Neighbor to display information about\n"
10564 "Neighbor to display information about\n"
10565 "Display routes learned from neighbor\n")
10566
10567
10568 ALIAS (show_bgp_view_neighbor_routes,
10569 show_bgp_ipv6_neighbor_routes_cmd,
10570 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10571 SHOW_STR
10572 BGP_STR
10573 "Address family\n"
10574 "Detailed information on TCP and BGP neighbor connections\n"
10575 "Neighbor to display information about\n"
10576 "Neighbor to display information about\n"
10577 "Display routes learned from neighbor\n")
10578
10579 /* old command */
10580 ALIAS (show_bgp_view_neighbor_routes,
10581 ipv6_bgp_neighbor_routes_cmd,
10582 "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
10583 SHOW_STR
10584 IPV6_STR
10585 BGP_STR
10586 "Detailed information on TCP and BGP neighbor connections\n"
10587 "Neighbor to display information about\n"
10588 "Neighbor to display information about\n"
10589 "Display routes learned from neighbor\n")
10590
10591 /* old command */
10592 DEFUN (ipv6_mbgp_neighbor_routes,
10593 ipv6_mbgp_neighbor_routes_cmd,
10594 "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
10595 SHOW_STR
10596 IPV6_STR
10597 MBGP_STR
10598 "Detailed information on TCP and BGP neighbor connections\n"
10599 "Neighbor to display information about\n"
10600 "Neighbor to display information about\n"
10601 "Display routes learned from neighbor\n")
10602 {
10603 struct peer *peer;
10604
10605 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10606 if (! peer)
10607 return CMD_WARNING;
10608
10609 return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
10610 bgp_show_type_neighbor);
10611 }
10612
10613 ALIAS (show_bgp_view_neighbor_flap,
10614 show_bgp_neighbor_flap_cmd,
10615 "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10616 SHOW_STR
10617 BGP_STR
10618 "Detailed information on TCP and BGP neighbor connections\n"
10619 "Neighbor to display information about\n"
10620 "Neighbor to display information about\n"
10621 "Display flap statistics of the routes learned from neighbor\n")
10622
10623 ALIAS (show_bgp_view_neighbor_flap,
10624 show_bgp_ipv6_neighbor_flap_cmd,
10625 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10626 SHOW_STR
10627 BGP_STR
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")
10633
10634 ALIAS (show_bgp_view_neighbor_damp,
10635 show_bgp_neighbor_damp_cmd,
10636 "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-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 the dampened routes received from neighbor\n")
10643
10644 ALIAS (show_bgp_view_neighbor_damp,
10645 show_bgp_ipv6_neighbor_damp_cmd,
10646 "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10647 SHOW_STR
10648 BGP_STR
10649 "Address family\n"
10650 "Detailed information on TCP and BGP neighbor connections\n"
10651 "Neighbor to display information about\n"
10652 "Neighbor to display information about\n"
10653 "Display the dampened routes received from neighbor\n")
10654
10655 DEFUN (show_bgp_view_rsclient,
10656 show_bgp_view_rsclient_cmd,
10657 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10658 SHOW_STR
10659 BGP_STR
10660 "BGP view\n"
10661 "BGP view name\n"
10662 "Information about Route Server Client\n"
10663 NEIGHBOR_ADDR_STR)
10664 {
10665 struct bgp_table *table;
10666 struct peer *peer;
10667
10668 if (argc == 2)
10669 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10670 else
10671 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10672
10673 if (! peer)
10674 return CMD_WARNING;
10675
10676 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10677 {
10678 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10679 VTY_NEWLINE);
10680 return CMD_WARNING;
10681 }
10682
10683 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10684 PEER_FLAG_RSERVER_CLIENT))
10685 {
10686 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10687 VTY_NEWLINE);
10688 return CMD_WARNING;
10689 }
10690
10691 table = peer->rib[AFI_IP6][SAFI_UNICAST];
10692
10693 return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10694 }
10695
10696 ALIAS (show_bgp_view_rsclient,
10697 show_bgp_rsclient_cmd,
10698 "show bgp rsclient (A.B.C.D|X:X::X:X)",
10699 SHOW_STR
10700 BGP_STR
10701 "Information about Route Server Client\n"
10702 NEIGHBOR_ADDR_STR)
10703
10704 DEFUN (show_bgp_view_rsclient_route,
10705 show_bgp_view_rsclient_route_cmd,
10706 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10707 SHOW_STR
10708 BGP_STR
10709 "BGP view\n"
10710 "BGP view name\n"
10711 "Information about Route Server Client\n"
10712 NEIGHBOR_ADDR_STR
10713 "Network in the BGP routing table to display\n")
10714 {
10715 struct bgp *bgp;
10716 struct peer *peer;
10717
10718 /* BGP structure lookup. */
10719 if (argc == 3)
10720 {
10721 bgp = bgp_lookup_by_name (argv[0]);
10722 if (bgp == NULL)
10723 {
10724 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10725 return CMD_WARNING;
10726 }
10727 }
10728 else
10729 {
10730 bgp = bgp_get_default ();
10731 if (bgp == NULL)
10732 {
10733 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10734 return CMD_WARNING;
10735 }
10736 }
10737
10738 if (argc == 3)
10739 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10740 else
10741 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10742
10743 if (! peer)
10744 return CMD_WARNING;
10745
10746 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10747 {
10748 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10749 VTY_NEWLINE);
10750 return CMD_WARNING;
10751 }
10752
10753 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10754 PEER_FLAG_RSERVER_CLIENT))
10755 {
10756 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10757 VTY_NEWLINE);
10758 return CMD_WARNING;
10759 }
10760
10761 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10762 (argc == 3) ? argv[2] : argv[1],
10763 AFI_IP6, SAFI_UNICAST, NULL, 0);
10764 }
10765
10766 ALIAS (show_bgp_view_rsclient_route,
10767 show_bgp_rsclient_route_cmd,
10768 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
10769 SHOW_STR
10770 BGP_STR
10771 "Information about Route Server Client\n"
10772 NEIGHBOR_ADDR_STR
10773 "Network in the BGP routing table to display\n")
10774
10775 DEFUN (show_bgp_view_rsclient_prefix,
10776 show_bgp_view_rsclient_prefix_cmd,
10777 "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10778 SHOW_STR
10779 BGP_STR
10780 "BGP view\n"
10781 "BGP view name\n"
10782 "Information about Route Server Client\n"
10783 NEIGHBOR_ADDR_STR
10784 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10785 {
10786 struct bgp *bgp;
10787 struct peer *peer;
10788
10789 /* BGP structure lookup. */
10790 if (argc == 3)
10791 {
10792 bgp = bgp_lookup_by_name (argv[0]);
10793 if (bgp == NULL)
10794 {
10795 vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10796 return CMD_WARNING;
10797 }
10798 }
10799 else
10800 {
10801 bgp = bgp_get_default ();
10802 if (bgp == NULL)
10803 {
10804 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10805 return CMD_WARNING;
10806 }
10807 }
10808
10809 if (argc == 3)
10810 peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10811 else
10812 peer = peer_lookup_in_view (vty, NULL, argv[0]);
10813
10814 if (! peer)
10815 return CMD_WARNING;
10816
10817 if (! peer->afc[AFI_IP6][SAFI_UNICAST])
10818 {
10819 vty_out (vty, "%% Activate the neighbor for the address family first%s",
10820 VTY_NEWLINE);
10821 return CMD_WARNING;
10822 }
10823
10824 if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
10825 PEER_FLAG_RSERVER_CLIENT))
10826 {
10827 vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10828 VTY_NEWLINE);
10829 return CMD_WARNING;
10830 }
10831
10832 return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
10833 (argc == 3) ? argv[2] : argv[1],
10834 AFI_IP6, SAFI_UNICAST, NULL, 1);
10835 }
10836
10837 ALIAS (show_bgp_view_rsclient_prefix,
10838 show_bgp_rsclient_prefix_cmd,
10839 "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
10840 SHOW_STR
10841 BGP_STR
10842 "Information about Route Server Client\n"
10843 NEIGHBOR_ADDR_STR
10844 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
10845
10846 #endif /* HAVE_IPV6 */
10847 \f
10848 struct bgp_table *bgp_distance_table;
10849
10850 struct bgp_distance
10851 {
10852 /* Distance value for the IP source prefix. */
10853 u_char distance;
10854
10855 /* Name of the access-list to be matched. */
10856 char *access_list;
10857 };
10858
10859 static struct bgp_distance *
10860 bgp_distance_new ()
10861 {
10862 struct bgp_distance *new;
10863 new = XMALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
10864 memset (new, 0, sizeof (struct bgp_distance));
10865 return new;
10866 }
10867
10868 static void
10869 bgp_distance_free (struct bgp_distance *bdistance)
10870 {
10871 XFREE (MTYPE_BGP_DISTANCE, bdistance);
10872 }
10873
10874 static int
10875 bgp_distance_set (struct vty *vty, const char *distance_str,
10876 const char *ip_str, const char *access_list_str)
10877 {
10878 int ret;
10879 struct prefix_ipv4 p;
10880 u_char distance;
10881 struct bgp_node *rn;
10882 struct bgp_distance *bdistance;
10883
10884 ret = str2prefix_ipv4 (ip_str, &p);
10885 if (ret == 0)
10886 {
10887 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
10888 return CMD_WARNING;
10889 }
10890
10891 distance = atoi (distance_str);
10892
10893 /* Get BGP distance node. */
10894 rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
10895 if (rn->info)
10896 {
10897 bdistance = rn->info;
10898 bgp_unlock_node (rn);
10899 }
10900 else
10901 {
10902 bdistance = bgp_distance_new ();
10903 rn->info = bdistance;
10904 }
10905
10906 /* Set distance value. */
10907 bdistance->distance = distance;
10908
10909 /* Reset access-list configuration. */
10910 if (bdistance->access_list)
10911 {
10912 free (bdistance->access_list);
10913 bdistance->access_list = NULL;
10914 }
10915 if (access_list_str)
10916 bdistance->access_list = strdup (access_list_str);
10917
10918 return CMD_SUCCESS;
10919 }
10920
10921 static int
10922 bgp_distance_unset (struct vty *vty, const char *distance_str,
10923 const char *ip_str, const char *access_list_str)
10924 {
10925 int ret;
10926 struct prefix_ipv4 p;
10927 u_char distance;
10928 struct bgp_node *rn;
10929 struct bgp_distance *bdistance;
10930
10931 ret = str2prefix_ipv4 (ip_str, &p);
10932 if (ret == 0)
10933 {
10934 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
10935 return CMD_WARNING;
10936 }
10937
10938 distance = atoi (distance_str);
10939
10940 rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
10941 if (! rn)
10942 {
10943 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
10944 return CMD_WARNING;
10945 }
10946
10947 bdistance = rn->info;
10948
10949 if (bdistance->access_list)
10950 free (bdistance->access_list);
10951 bgp_distance_free (bdistance);
10952
10953 rn->info = NULL;
10954 bgp_unlock_node (rn);
10955 bgp_unlock_node (rn);
10956
10957 return CMD_SUCCESS;
10958 }
10959
10960 static void
10961 bgp_distance_reset ()
10962 {
10963 struct bgp_node *rn;
10964 struct bgp_distance *bdistance;
10965
10966 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
10967 if ((bdistance = rn->info) != NULL)
10968 {
10969 if (bdistance->access_list)
10970 free (bdistance->access_list);
10971 bgp_distance_free (bdistance);
10972 rn->info = NULL;
10973 bgp_unlock_node (rn);
10974 }
10975 }
10976
10977 /* Apply BGP information to distance method. */
10978 u_char
10979 bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
10980 {
10981 struct bgp_node *rn;
10982 struct prefix_ipv4 q;
10983 struct peer *peer;
10984 struct bgp_distance *bdistance;
10985 struct access_list *alist;
10986 struct bgp_static *bgp_static;
10987
10988 if (! bgp)
10989 return 0;
10990
10991 if (p->family != AF_INET)
10992 return 0;
10993
10994 peer = rinfo->peer;
10995
10996 if (peer->su.sa.sa_family != AF_INET)
10997 return 0;
10998
10999 memset (&q, 0, sizeof (struct prefix_ipv4));
11000 q.family = AF_INET;
11001 q.prefix = peer->su.sin.sin_addr;
11002 q.prefixlen = IPV4_MAX_BITLEN;
11003
11004 /* Check source address. */
11005 rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11006 if (rn)
11007 {
11008 bdistance = rn->info;
11009 bgp_unlock_node (rn);
11010
11011 if (bdistance->access_list)
11012 {
11013 alist = access_list_lookup (AFI_IP, bdistance->access_list);
11014 if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11015 return bdistance->distance;
11016 }
11017 else
11018 return bdistance->distance;
11019 }
11020
11021 /* Backdoor check. */
11022 rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11023 if (rn)
11024 {
11025 bgp_static = rn->info;
11026 bgp_unlock_node (rn);
11027
11028 if (bgp_static->backdoor)
11029 {
11030 if (bgp->distance_local)
11031 return bgp->distance_local;
11032 else
11033 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11034 }
11035 }
11036
11037 if (peer_sort (peer) == BGP_PEER_EBGP)
11038 {
11039 if (bgp->distance_ebgp)
11040 return bgp->distance_ebgp;
11041 return ZEBRA_EBGP_DISTANCE_DEFAULT;
11042 }
11043 else
11044 {
11045 if (bgp->distance_ibgp)
11046 return bgp->distance_ibgp;
11047 return ZEBRA_IBGP_DISTANCE_DEFAULT;
11048 }
11049 }
11050
11051 DEFUN (bgp_distance,
11052 bgp_distance_cmd,
11053 "distance bgp <1-255> <1-255> <1-255>",
11054 "Define an administrative distance\n"
11055 "BGP distance\n"
11056 "Distance for routes external to the AS\n"
11057 "Distance for routes internal to the AS\n"
11058 "Distance for local routes\n")
11059 {
11060 struct bgp *bgp;
11061
11062 bgp = vty->index;
11063
11064 bgp->distance_ebgp = atoi (argv[0]);
11065 bgp->distance_ibgp = atoi (argv[1]);
11066 bgp->distance_local = atoi (argv[2]);
11067 return CMD_SUCCESS;
11068 }
11069
11070 DEFUN (no_bgp_distance,
11071 no_bgp_distance_cmd,
11072 "no distance bgp <1-255> <1-255> <1-255>",
11073 NO_STR
11074 "Define an administrative distance\n"
11075 "BGP distance\n"
11076 "Distance for routes external to the AS\n"
11077 "Distance for routes internal to the AS\n"
11078 "Distance for local routes\n")
11079 {
11080 struct bgp *bgp;
11081
11082 bgp = vty->index;
11083
11084 bgp->distance_ebgp= 0;
11085 bgp->distance_ibgp = 0;
11086 bgp->distance_local = 0;
11087 return CMD_SUCCESS;
11088 }
11089
11090 ALIAS (no_bgp_distance,
11091 no_bgp_distance2_cmd,
11092 "no distance bgp",
11093 NO_STR
11094 "Define an administrative distance\n"
11095 "BGP distance\n")
11096
11097 DEFUN (bgp_distance_source,
11098 bgp_distance_source_cmd,
11099 "distance <1-255> A.B.C.D/M",
11100 "Define an administrative distance\n"
11101 "Administrative distance\n"
11102 "IP source prefix\n")
11103 {
11104 bgp_distance_set (vty, argv[0], argv[1], NULL);
11105 return CMD_SUCCESS;
11106 }
11107
11108 DEFUN (no_bgp_distance_source,
11109 no_bgp_distance_source_cmd,
11110 "no distance <1-255> A.B.C.D/M",
11111 NO_STR
11112 "Define an administrative distance\n"
11113 "Administrative distance\n"
11114 "IP source prefix\n")
11115 {
11116 bgp_distance_unset (vty, argv[0], argv[1], NULL);
11117 return CMD_SUCCESS;
11118 }
11119
11120 DEFUN (bgp_distance_source_access_list,
11121 bgp_distance_source_access_list_cmd,
11122 "distance <1-255> A.B.C.D/M WORD",
11123 "Define an administrative distance\n"
11124 "Administrative distance\n"
11125 "IP source prefix\n"
11126 "Access list name\n")
11127 {
11128 bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11129 return CMD_SUCCESS;
11130 }
11131
11132 DEFUN (no_bgp_distance_source_access_list,
11133 no_bgp_distance_source_access_list_cmd,
11134 "no distance <1-255> A.B.C.D/M WORD",
11135 NO_STR
11136 "Define an administrative distance\n"
11137 "Administrative distance\n"
11138 "IP source prefix\n"
11139 "Access list name\n")
11140 {
11141 bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11142 return CMD_SUCCESS;
11143 }
11144 \f
11145 DEFUN (bgp_damp_set,
11146 bgp_damp_set_cmd,
11147 "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11148 "BGP Specific commands\n"
11149 "Enable route-flap dampening\n"
11150 "Half-life time for the penalty\n"
11151 "Value to start reusing a route\n"
11152 "Value to start suppressing a route\n"
11153 "Maximum duration to suppress a stable route\n")
11154 {
11155 struct bgp *bgp;
11156 int half = DEFAULT_HALF_LIFE * 60;
11157 int reuse = DEFAULT_REUSE;
11158 int suppress = DEFAULT_SUPPRESS;
11159 int max = 4 * half;
11160
11161 if (argc == 4)
11162 {
11163 half = atoi (argv[0]) * 60;
11164 reuse = atoi (argv[1]);
11165 suppress = atoi (argv[2]);
11166 max = atoi (argv[3]) * 60;
11167 }
11168 else if (argc == 1)
11169 {
11170 half = atoi (argv[0]) * 60;
11171 max = 4 * half;
11172 }
11173
11174 bgp = vty->index;
11175 return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11176 half, reuse, suppress, max);
11177 }
11178
11179 ALIAS (bgp_damp_set,
11180 bgp_damp_set2_cmd,
11181 "bgp dampening <1-45>",
11182 "BGP Specific commands\n"
11183 "Enable route-flap dampening\n"
11184 "Half-life time for the penalty\n")
11185
11186 ALIAS (bgp_damp_set,
11187 bgp_damp_set3_cmd,
11188 "bgp dampening",
11189 "BGP Specific commands\n"
11190 "Enable route-flap dampening\n")
11191
11192 DEFUN (bgp_damp_unset,
11193 bgp_damp_unset_cmd,
11194 "no bgp dampening",
11195 NO_STR
11196 "BGP Specific commands\n"
11197 "Enable route-flap dampening\n")
11198 {
11199 struct bgp *bgp;
11200
11201 bgp = vty->index;
11202 return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11203 }
11204
11205 ALIAS (bgp_damp_unset,
11206 bgp_damp_unset2_cmd,
11207 "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11208 NO_STR
11209 "BGP Specific commands\n"
11210 "Enable route-flap dampening\n"
11211 "Half-life time for the penalty\n"
11212 "Value to start reusing a route\n"
11213 "Value to start suppressing a route\n"
11214 "Maximum duration to suppress a stable route\n")
11215
11216 DEFUN (show_ip_bgp_dampened_paths,
11217 show_ip_bgp_dampened_paths_cmd,
11218 "show ip bgp dampened-paths",
11219 SHOW_STR
11220 IP_STR
11221 BGP_STR
11222 "Display paths suppressed due to dampening\n")
11223 {
11224 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11225 NULL);
11226 }
11227
11228 DEFUN (show_ip_bgp_flap_statistics,
11229 show_ip_bgp_flap_statistics_cmd,
11230 "show ip bgp flap-statistics",
11231 SHOW_STR
11232 IP_STR
11233 BGP_STR
11234 "Display flap statistics of routes\n")
11235 {
11236 return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11237 bgp_show_type_flap_statistics, NULL);
11238 }
11239 \f
11240 /* Display specified route of BGP table. */
11241 static int
11242 bgp_clear_damp_route (struct vty *vty, const char *view_name,
11243 const char *ip_str, afi_t afi, safi_t safi,
11244 struct prefix_rd *prd, int prefix_check)
11245 {
11246 int ret;
11247 struct prefix match;
11248 struct bgp_node *rn;
11249 struct bgp_node *rm;
11250 struct bgp_info *ri;
11251 struct bgp_info *ri_temp;
11252 struct bgp *bgp;
11253 struct bgp_table *table;
11254
11255 /* BGP structure lookup. */
11256 if (view_name)
11257 {
11258 bgp = bgp_lookup_by_name (view_name);
11259 if (bgp == NULL)
11260 {
11261 vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11262 return CMD_WARNING;
11263 }
11264 }
11265 else
11266 {
11267 bgp = bgp_get_default ();
11268 if (bgp == NULL)
11269 {
11270 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11271 return CMD_WARNING;
11272 }
11273 }
11274
11275 /* Check IP address argument. */
11276 ret = str2prefix (ip_str, &match);
11277 if (! ret)
11278 {
11279 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
11280 return CMD_WARNING;
11281 }
11282
11283 match.family = afi2family (afi);
11284
11285 if (safi == SAFI_MPLS_VPN)
11286 {
11287 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
11288 {
11289 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
11290 continue;
11291
11292 if ((table = rn->info) != NULL)
11293 if ((rm = bgp_node_match (table, &match)) != NULL)
11294 if (! prefix_check || rm->p.prefixlen == match.prefixlen)
11295 {
11296 ri = rm->info;
11297 while (ri)
11298 {
11299 if (ri->extra && ri->extra->damp_info)
11300 {
11301 ri_temp = ri->next;
11302 bgp_damp_info_free (ri->extra->damp_info, 1);
11303 ri = ri_temp;
11304 }
11305 else
11306 ri = ri->next;
11307 }
11308 }
11309 }
11310 }
11311 else
11312 {
11313 if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
11314 if (! prefix_check || rn->p.prefixlen == match.prefixlen)
11315 {
11316 ri = rn->info;
11317 while (ri)
11318 {
11319 if (ri->extra && ri->extra->damp_info)
11320 {
11321 ri_temp = ri->next;
11322 bgp_damp_info_free (ri->extra->damp_info, 1);
11323 ri = ri_temp;
11324 }
11325 else
11326 ri = ri->next;
11327 }
11328 }
11329 }
11330
11331 return CMD_SUCCESS;
11332 }
11333
11334 DEFUN (clear_ip_bgp_dampening,
11335 clear_ip_bgp_dampening_cmd,
11336 "clear ip bgp dampening",
11337 CLEAR_STR
11338 IP_STR
11339 BGP_STR
11340 "Clear route flap dampening information\n")
11341 {
11342 bgp_damp_info_clean ();
11343 return CMD_SUCCESS;
11344 }
11345
11346 DEFUN (clear_ip_bgp_dampening_prefix,
11347 clear_ip_bgp_dampening_prefix_cmd,
11348 "clear ip bgp dampening A.B.C.D/M",
11349 CLEAR_STR
11350 IP_STR
11351 BGP_STR
11352 "Clear route flap dampening information\n"
11353 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11354 {
11355 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11356 SAFI_UNICAST, NULL, 1);
11357 }
11358
11359 DEFUN (clear_ip_bgp_dampening_address,
11360 clear_ip_bgp_dampening_address_cmd,
11361 "clear ip bgp dampening A.B.C.D",
11362 CLEAR_STR
11363 IP_STR
11364 BGP_STR
11365 "Clear route flap dampening information\n"
11366 "Network to clear damping information\n")
11367 {
11368 return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
11369 SAFI_UNICAST, NULL, 0);
11370 }
11371
11372 DEFUN (clear_ip_bgp_dampening_address_mask,
11373 clear_ip_bgp_dampening_address_mask_cmd,
11374 "clear ip bgp dampening A.B.C.D A.B.C.D",
11375 CLEAR_STR
11376 IP_STR
11377 BGP_STR
11378 "Clear route flap dampening information\n"
11379 "Network to clear damping information\n"
11380 "Network mask\n")
11381 {
11382 int ret;
11383 char prefix_str[BUFSIZ];
11384
11385 ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
11386 if (! ret)
11387 {
11388 vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
11389 return CMD_WARNING;
11390 }
11391
11392 return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
11393 SAFI_UNICAST, NULL, 0);
11394 }
11395 \f
11396 static int
11397 bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
11398 afi_t afi, safi_t safi, int *write)
11399 {
11400 struct bgp_node *prn;
11401 struct bgp_node *rn;
11402 struct bgp_table *table;
11403 struct prefix *p;
11404 struct prefix_rd *prd;
11405 struct bgp_static *bgp_static;
11406 u_int32_t label;
11407 char buf[SU_ADDRSTRLEN];
11408 char rdbuf[RD_ADDRSTRLEN];
11409
11410 /* Network configuration. */
11411 for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
11412 if ((table = prn->info) != NULL)
11413 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
11414 if ((bgp_static = rn->info) != NULL)
11415 {
11416 p = &rn->p;
11417 prd = (struct prefix_rd *) &prn->p;
11418
11419 /* "address-family" display. */
11420 bgp_config_write_family_header (vty, afi, safi, write);
11421
11422 /* "network" configuration display. */
11423 prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
11424 label = decode_label (bgp_static->tag);
11425
11426 vty_out (vty, " network %s/%d rd %s tag %d",
11427 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11428 p->prefixlen,
11429 rdbuf, label);
11430 vty_out (vty, "%s", VTY_NEWLINE);
11431 }
11432 return 0;
11433 }
11434
11435 /* Configuration of static route announcement and aggregate
11436 information. */
11437 int
11438 bgp_config_write_network (struct vty *vty, struct bgp *bgp,
11439 afi_t afi, safi_t safi, int *write)
11440 {
11441 struct bgp_node *rn;
11442 struct prefix *p;
11443 struct bgp_static *bgp_static;
11444 struct bgp_aggregate *bgp_aggregate;
11445 char buf[SU_ADDRSTRLEN];
11446
11447 if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
11448 return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
11449
11450 /* Network configuration. */
11451 for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
11452 if ((bgp_static = rn->info) != NULL)
11453 {
11454 p = &rn->p;
11455
11456 /* "address-family" display. */
11457 bgp_config_write_family_header (vty, afi, safi, write);
11458
11459 /* "network" configuration display. */
11460 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11461 {
11462 u_int32_t destination;
11463 struct in_addr netmask;
11464
11465 destination = ntohl (p->u.prefix4.s_addr);
11466 masklen2ip (p->prefixlen, &netmask);
11467 vty_out (vty, " network %s",
11468 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
11469
11470 if ((IN_CLASSC (destination) && p->prefixlen == 24)
11471 || (IN_CLASSB (destination) && p->prefixlen == 16)
11472 || (IN_CLASSA (destination) && p->prefixlen == 8)
11473 || p->u.prefix4.s_addr == 0)
11474 {
11475 /* Natural mask is not display. */
11476 }
11477 else
11478 vty_out (vty, " mask %s", inet_ntoa (netmask));
11479 }
11480 else
11481 {
11482 vty_out (vty, " network %s/%d",
11483 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11484 p->prefixlen);
11485 }
11486
11487 if (bgp_static->rmap.name)
11488 vty_out (vty, " route-map %s", bgp_static->rmap.name);
11489 else
11490 {
11491 if (bgp_static->backdoor)
11492 vty_out (vty, " backdoor");
11493 if (bgp_static->ttl)
11494 vty_out (vty, " pathlimit %u", bgp_static->ttl);
11495 }
11496
11497 vty_out (vty, "%s", VTY_NEWLINE);
11498 }
11499
11500 /* Aggregate-address configuration. */
11501 for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
11502 if ((bgp_aggregate = rn->info) != NULL)
11503 {
11504 p = &rn->p;
11505
11506 /* "address-family" display. */
11507 bgp_config_write_family_header (vty, afi, safi, write);
11508
11509 if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
11510 {
11511 struct in_addr netmask;
11512
11513 masklen2ip (p->prefixlen, &netmask);
11514 vty_out (vty, " aggregate-address %s %s",
11515 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11516 inet_ntoa (netmask));
11517 }
11518 else
11519 {
11520 vty_out (vty, " aggregate-address %s/%d",
11521 inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
11522 p->prefixlen);
11523 }
11524
11525 if (bgp_aggregate->as_set)
11526 vty_out (vty, " as-set");
11527
11528 if (bgp_aggregate->summary_only)
11529 vty_out (vty, " summary-only");
11530
11531 vty_out (vty, "%s", VTY_NEWLINE);
11532 }
11533
11534 return 0;
11535 }
11536
11537 int
11538 bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
11539 {
11540 struct bgp_node *rn;
11541 struct bgp_distance *bdistance;
11542
11543 /* Distance configuration. */
11544 if (bgp->distance_ebgp
11545 && bgp->distance_ibgp
11546 && bgp->distance_local
11547 && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
11548 || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
11549 || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
11550 vty_out (vty, " distance bgp %d %d %d%s",
11551 bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
11552 VTY_NEWLINE);
11553
11554 for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
11555 if ((bdistance = rn->info) != NULL)
11556 {
11557 vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
11558 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
11559 bdistance->access_list ? bdistance->access_list : "",
11560 VTY_NEWLINE);
11561 }
11562
11563 return 0;
11564 }
11565
11566 /* Allocate routing table structure and install commands. */
11567 void
11568 bgp_route_init ()
11569 {
11570 /* Init BGP distance table. */
11571 bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
11572
11573 /* IPv4 BGP commands. */
11574 install_element (BGP_NODE, &bgp_network_cmd);
11575 install_element (BGP_NODE, &bgp_network_mask_cmd);
11576 install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
11577 install_element (BGP_NODE, &bgp_network_route_map_cmd);
11578 install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
11579 install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
11580 install_element (BGP_NODE, &bgp_network_backdoor_cmd);
11581 install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
11582 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
11583 install_element (BGP_NODE, &bgp_network_ttl_cmd);
11584 install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
11585 install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
11586 install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
11587 install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11588 install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
11589 install_element (BGP_NODE, &no_bgp_network_cmd);
11590 install_element (BGP_NODE, &no_bgp_network_mask_cmd);
11591 install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
11592 install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
11593 install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
11594 install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11595 install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
11596 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
11597 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
11598 install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
11599 install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
11600 install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11601 install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
11602 install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11603 install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
11604
11605 install_element (BGP_NODE, &aggregate_address_cmd);
11606 install_element (BGP_NODE, &aggregate_address_mask_cmd);
11607 install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
11608 install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
11609 install_element (BGP_NODE, &aggregate_address_as_set_cmd);
11610 install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
11611 install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
11612 install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
11613 install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
11614 install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
11615 install_element (BGP_NODE, &no_aggregate_address_cmd);
11616 install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
11617 install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
11618 install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
11619 install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
11620 install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
11621 install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
11622 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
11623 install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11624 install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11625
11626 /* IPv4 unicast configuration. */
11627 install_element (BGP_IPV4_NODE, &bgp_network_cmd);
11628 install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
11629 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
11630 install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
11631 install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
11632 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
11633 install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
11634 install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
11635 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
11636 install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
11637 install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11638 install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11639 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
11640 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
11641 install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
11642 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
11643 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11644 install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
11645 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
11646 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11647 install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
11648 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11649 install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11650 install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
11651 install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
11652 install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
11653 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
11654 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
11655 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
11656 install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
11657 install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
11658 install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
11659 install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
11660 install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
11661 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
11662 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
11663 install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
11664 install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
11665 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
11666 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
11667 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
11668 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11669 install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11670
11671 /* IPv4 multicast configuration. */
11672 install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
11673 install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
11674 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
11675 install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
11676 install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
11677 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
11678 install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
11679 install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
11680 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
11681 install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
11682 install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
11683 install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11684 install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
11685 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
11686 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
11687 install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
11688 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
11689 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
11690 install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
11691 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
11692 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
11693 install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
11694 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
11695 install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
11696 install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
11697 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
11698 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
11699 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
11700 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
11701 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
11702 install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
11703 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
11704 install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
11705 install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
11706 install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
11707 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
11708 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
11709 install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
11710 install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
11711 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
11712 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
11713 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
11714 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
11715 install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
11716
11717 install_element (VIEW_NODE, &show_ip_bgp_cmd);
11718 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
11719 install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
11720 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
11721 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11722 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11723 install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
11724 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11725 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11726 install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11727 install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
11728 install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
11729 install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
11730 install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
11731 install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11732 install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
11733 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11734 install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
11735 install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11736 install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
11737 install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11738 install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
11739 install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11740 install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
11741 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11742 install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
11743 install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
11744 install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
11745 install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
11746 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
11747 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
11748 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
11749 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
11750 install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
11751 install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
11752 install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
11753 install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
11754 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11755 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11756 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11757 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11758 install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
11759 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11760 install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
11761 install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11762 install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
11763 install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11764 install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11765 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11766 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11767 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11768 install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
11769 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11770 install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11771 install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11772 install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
11773 install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
11774 install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
11775 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
11776 install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11777 install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
11778 install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
11779 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11780 install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11781 install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
11782 install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
11783 install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
11784 install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
11785 install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
11786 install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11787 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
11788 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11789 install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
11790
11791 install_element (ENABLE_NODE, &show_ip_bgp_cmd);
11792 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
11793 install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
11794 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
11795 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
11796 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
11797 install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
11798 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
11799 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
11800 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
11801 install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
11802 install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
11803 install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
11804 install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
11805 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
11806 install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
11807 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
11808 install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
11809 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
11810 install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
11811 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
11812 install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
11813 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
11814 install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
11815 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
11816 install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
11817 install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
11818 install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
11819 install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
11820 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
11821 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
11822 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
11823 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
11824 install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
11825 install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
11826 install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
11827 install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
11828 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
11829 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
11830 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
11831 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
11832 install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
11833 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
11834 install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
11835 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
11836 install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
11837 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
11838 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
11839 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
11840 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
11841 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
11842 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
11843 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
11844 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
11845 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
11846 install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
11847 install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
11848 install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
11849 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
11850 install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
11851 install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
11852 install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
11853 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
11854 install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
11855 install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
11856 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
11857 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
11858 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
11859 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
11860 install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
11861 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
11862 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
11863 install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
11864
11865 /* BGP dampening clear commands */
11866 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
11867 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
11868 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
11869 install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
11870
11871 /* prefix count */
11872 install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
11873 install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
11874 install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
11875 #ifdef HAVE_IPV6
11876 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
11877
11878 /* New config IPv6 BGP commands. */
11879 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
11880 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
11881 install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
11882 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
11883 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
11884 install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
11885
11886 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
11887 install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
11888 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
11889 install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
11890
11891 /* Old config IPv6 BGP commands. */
11892 install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
11893 install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
11894
11895 install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
11896 install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
11897 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
11898 install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
11899
11900 install_element (VIEW_NODE, &show_bgp_cmd);
11901 install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
11902 install_element (VIEW_NODE, &show_bgp_route_cmd);
11903 install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
11904 install_element (VIEW_NODE, &show_bgp_prefix_cmd);
11905 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
11906 install_element (VIEW_NODE, &show_bgp_regexp_cmd);
11907 install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
11908 install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
11909 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
11910 install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
11911 install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
11912 install_element (VIEW_NODE, &show_bgp_route_map_cmd);
11913 install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
11914 install_element (VIEW_NODE, &show_bgp_community_all_cmd);
11915 install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
11916 install_element (VIEW_NODE, &show_bgp_community_cmd);
11917 install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
11918 install_element (VIEW_NODE, &show_bgp_community2_cmd);
11919 install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
11920 install_element (VIEW_NODE, &show_bgp_community3_cmd);
11921 install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
11922 install_element (VIEW_NODE, &show_bgp_community4_cmd);
11923 install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
11924 install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
11925 install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
11926 install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
11927 install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
11928 install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
11929 install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
11930 install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
11931 install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
11932 install_element (VIEW_NODE, &show_bgp_community_list_cmd);
11933 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
11934 install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
11935 install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
11936 install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
11937 install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
11938 install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
11939 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
11940 install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
11941 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
11942 install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
11943 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
11944 install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
11945 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
11946 install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
11947 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
11948 install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
11949 install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
11950 install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
11951 install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
11952 install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
11953 install_element (VIEW_NODE, &show_bgp_view_cmd);
11954 install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
11955 install_element (VIEW_NODE, &show_bgp_view_route_cmd);
11956 install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
11957 install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
11958 install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
11959 install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
11960 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
11961 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
11962 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
11963 install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
11964 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
11965 install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
11966 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
11967 install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
11968 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
11969 install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
11970 install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
11971 install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
11972 install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
11973 install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
11974
11975 install_element (ENABLE_NODE, &show_bgp_cmd);
11976 install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
11977 install_element (ENABLE_NODE, &show_bgp_route_cmd);
11978 install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
11979 install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
11980 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
11981 install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
11982 install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
11983 install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
11984 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
11985 install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
11986 install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
11987 install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
11988 install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
11989 install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
11990 install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
11991 install_element (ENABLE_NODE, &show_bgp_community_cmd);
11992 install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
11993 install_element (ENABLE_NODE, &show_bgp_community2_cmd);
11994 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
11995 install_element (ENABLE_NODE, &show_bgp_community3_cmd);
11996 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
11997 install_element (ENABLE_NODE, &show_bgp_community4_cmd);
11998 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
11999 install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12000 install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12001 install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12002 install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12003 install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12004 install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12005 install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12006 install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12007 install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12008 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12009 install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12010 install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12011 install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12012 install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12013 install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12014 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12015 install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12016 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12017 install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12018 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12019 install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12020 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
12021 install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12022 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12023 install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12024 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
12025 install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
12026 install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
12027 install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
12028 install_element (ENABLE_NODE, &show_bgp_view_cmd);
12029 install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12030 install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12031 install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12032 install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12033 install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12034 install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12035 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12036 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12037 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12038 install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12039 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12040 install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12041 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12042 install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12043 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12044 install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12045 install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
12046 install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
12047 install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
12048 install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
12049
12050 /* Statistics */
12051 install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12052 install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12053 install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12054 install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12055
12056 /* old command */
12057 install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12058 install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12059 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12060 install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12061 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12062 install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12063 install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12064 install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12065 install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12066 install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12067 install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12068 install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12069 install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12070 install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12071 install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12072 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12073 install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12074 install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12075 install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12076 install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12077 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12078 install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12079 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12080 install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12081 install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12082 install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12083 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12084 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12085 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12086 install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12087 install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12088 install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12089 install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12090 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12091 install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12092 install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12093
12094 /* old command */
12095 install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12096 install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12097 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12098 install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12099 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12100 install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12101 install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12102 install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12103 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12104 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12105 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12106 install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12107 install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12108 install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12109 install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12110 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12111 install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12112 install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12113 install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12114 install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12115 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12116 install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12117 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12118 install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12119 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12120 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12121 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12122 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12123 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12124 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12125 install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12126 install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12127 install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12128 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12129 install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12130 install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12131
12132 /* old command */
12133 install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12134 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12135 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12136 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12137
12138 /* old command */
12139 install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12140 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12141 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12142 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12143
12144 /* old command */
12145 install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12146 install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12147 install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12148 install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12149 #endif /* HAVE_IPV6 */
12150
12151 install_element (BGP_NODE, &bgp_distance_cmd);
12152 install_element (BGP_NODE, &no_bgp_distance_cmd);
12153 install_element (BGP_NODE, &no_bgp_distance2_cmd);
12154 install_element (BGP_NODE, &bgp_distance_source_cmd);
12155 install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12156 install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12157 install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12158
12159 install_element (BGP_NODE, &bgp_damp_set_cmd);
12160 install_element (BGP_NODE, &bgp_damp_set2_cmd);
12161 install_element (BGP_NODE, &bgp_damp_set3_cmd);
12162 install_element (BGP_NODE, &bgp_damp_unset_cmd);
12163 install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12164 install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
12165 install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
12166 install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
12167 install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
12168 install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
12169 }