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: #include "bgpd/bgp_mpath.h"
58:
59: /* Extern from bgp_dump.c */
60: extern const char *bgp_origin_str[];
61: extern const char *bgp_origin_long_str[];
62:
63: static struct bgp_node *
64: bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
65: struct prefix_rd *prd)
66: {
67: struct bgp_node *rn;
68: struct bgp_node *prn = NULL;
69:
70: assert (table);
71: if (!table)
72: return NULL;
73:
74: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
75: {
76: prn = bgp_node_get (table, (struct prefix *) prd);
77:
78: if (prn->info == NULL)
79: prn->info = bgp_table_init (afi, safi);
80: else
81: bgp_unlock_node (prn);
82: table = prn->info;
83: }
84:
85: rn = bgp_node_get (table, p);
86:
87: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
88: rn->prn = prn;
89:
90: return rn;
91: }
92:
93: /* Allocate bgp_info_extra */
94: static struct bgp_info_extra *
95: bgp_info_extra_new (void)
96: {
97: struct bgp_info_extra *new;
98: new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
99: return new;
100: }
101:
102: static void
103: bgp_info_extra_free (struct bgp_info_extra **extra)
104: {
105: if (extra && *extra)
106: {
107: if ((*extra)->damp_info)
108: bgp_damp_info_free ((*extra)->damp_info, 0);
109:
110: (*extra)->damp_info = NULL;
111:
112: XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
113:
114: *extra = NULL;
115: }
116: }
117:
118: /* Get bgp_info extra information for the given bgp_info, lazy allocated
119: * if required.
120: */
121: struct bgp_info_extra *
122: bgp_info_extra_get (struct bgp_info *ri)
123: {
124: if (!ri->extra)
125: ri->extra = bgp_info_extra_new();
126: return ri->extra;
127: }
128:
129: /* Allocate new bgp info structure. */
130: static struct bgp_info *
131: bgp_info_new (void)
132: {
133: return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
134: }
135:
136: /* Free bgp route information. */
137: static void
138: bgp_info_free (struct bgp_info *binfo)
139: {
140: if (binfo->attr)
141: bgp_attr_unintern (&binfo->attr);
142:
143: bgp_info_extra_free (&binfo->extra);
144: bgp_info_mpath_free (&binfo->mpath);
145:
146: peer_unlock (binfo->peer); /* bgp_info peer reference */
147:
148: XFREE (MTYPE_BGP_ROUTE, binfo);
149: }
150:
151: struct bgp_info *
152: bgp_info_lock (struct bgp_info *binfo)
153: {
154: binfo->lock++;
155: return binfo;
156: }
157:
158: struct bgp_info *
159: bgp_info_unlock (struct bgp_info *binfo)
160: {
161: assert (binfo && binfo->lock > 0);
162: binfo->lock--;
163:
164: if (binfo->lock == 0)
165: {
166: #if 0
167: zlog_debug ("%s: unlocked and freeing", __func__);
168: zlog_backtrace (LOG_DEBUG);
169: #endif
170: bgp_info_free (binfo);
171: return NULL;
172: }
173:
174: #if 0
175: if (binfo->lock == 1)
176: {
177: zlog_debug ("%s: unlocked to 1", __func__);
178: zlog_backtrace (LOG_DEBUG);
179: }
180: #endif
181:
182: return binfo;
183: }
184:
185: void
186: bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
187: {
188: struct bgp_info *top;
189:
190: top = rn->info;
191:
192: ri->next = rn->info;
193: ri->prev = NULL;
194: if (top)
195: top->prev = ri;
196: rn->info = ri;
197:
198: bgp_info_lock (ri);
199: bgp_lock_node (rn);
200: peer_lock (ri->peer); /* bgp_info peer reference */
201: }
202:
203: /* Do the actual removal of info from RIB, for use by bgp_process
204: completion callback *only* */
205: static void
206: bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
207: {
208: if (ri->next)
209: ri->next->prev = ri->prev;
210: if (ri->prev)
211: ri->prev->next = ri->next;
212: else
213: rn->info = ri->next;
214:
215: bgp_info_mpath_dequeue (ri);
216: bgp_info_unlock (ri);
217: bgp_unlock_node (rn);
218: }
219:
220: void
221: bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
222: {
223: bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
224: /* set of previous already took care of pcount */
225: UNSET_FLAG (ri->flags, BGP_INFO_VALID);
226: }
227:
228: /* undo the effects of a previous call to bgp_info_delete; typically
229: called when a route is deleted and then quickly re-added before the
230: deletion has been processed */
231: static void
232: bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
233: {
234: bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
235: /* unset of previous already took care of pcount */
236: SET_FLAG (ri->flags, BGP_INFO_VALID);
237: }
238:
239: /* Adjust pcount as required */
240: static void
241: bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
242: {
243: struct bgp_table *table;
244:
245: assert (rn && bgp_node_table (rn));
246: assert (ri && ri->peer && ri->peer->bgp);
247:
248: table = bgp_node_table (rn);
249:
250: /* Ignore 'pcount' for RS-client tables */
251: if (table->type != BGP_TABLE_MAIN
252: || ri->peer == ri->peer->bgp->peer_self)
253: return;
254:
255: if (BGP_INFO_HOLDDOWN (ri)
256: && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
257: {
258:
259: UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
260:
261: /* slight hack, but more robust against errors. */
262: if (ri->peer->pcount[table->afi][table->safi])
263: ri->peer->pcount[table->afi][table->safi]--;
264: else
265: {
266: zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
267: __func__, ri->peer->host);
268: zlog_backtrace (LOG_WARNING);
269: zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
270: }
271: }
272: else if (!BGP_INFO_HOLDDOWN (ri)
273: && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
274: {
275: SET_FLAG (ri->flags, BGP_INFO_COUNTED);
276: ri->peer->pcount[table->afi][table->safi]++;
277: }
278: }
279:
280:
281: /* Set/unset bgp_info flags, adjusting any other state as needed.
282: * This is here primarily to keep prefix-count in check.
283: */
284: void
285: bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
286: {
287: SET_FLAG (ri->flags, flag);
288:
289: /* early bath if we know it's not a flag that changes useability state */
290: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
291: return;
292:
293: bgp_pcount_adjust (rn, ri);
294: }
295:
296: void
297: bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
298: {
299: UNSET_FLAG (ri->flags, flag);
300:
301: /* early bath if we know it's not a flag that changes useability state */
302: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
303: return;
304:
305: bgp_pcount_adjust (rn, ri);
306: }
307:
308: /* Get MED value. If MED value is missing and "bgp bestpath
309: missing-as-worst" is specified, treat it as the worst value. */
310: static u_int32_t
311: bgp_med_value (struct attr *attr, struct bgp *bgp)
312: {
313: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
314: return attr->med;
315: else
316: {
317: if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
318: return BGP_MED_MAX;
319: else
320: return 0;
321: }
322: }
323:
324: /* Compare two bgp route entity. Return -1 if new is preferred, 1 if exist
325: * is preferred, or 0 if they are the same (usually will only occur if
326: * multipath is enabled */
327: static int
328: bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist,
329: afi_t afi, safi_t safi)
330: {
331: struct attr *newattr, *existattr;
332: struct attr_extra *newattre, *existattre;
333: bgp_peer_sort_t new_sort;
334: bgp_peer_sort_t exist_sort;
335: u_int32_t new_pref;
336: u_int32_t exist_pref;
337: u_int32_t new_med;
338: u_int32_t exist_med;
339: u_int32_t new_weight;
340: u_int32_t exist_weight;
341: uint32_t newm, existm;
342: struct in_addr new_id;
343: struct in_addr exist_id;
344: int new_cluster;
345: int exist_cluster;
346: int internal_as_route;
347: int confed_as_route;
348: int ret;
349:
350: /* 0. Null check. */
351: if (new == NULL)
352: return 1;
353: if (exist == NULL)
354: return -1;
355:
356: newattr = new->attr;
357: existattr = exist->attr;
358: newattre = newattr->extra;
359: existattre = existattr->extra;
360:
361: /* 1. Weight check. */
362: new_weight = exist_weight = 0;
363:
364: if (newattre)
365: new_weight = newattre->weight;
366: if (existattre)
367: exist_weight = existattre->weight;
368:
369: if (new_weight > exist_weight)
370: return -1;
371: if (new_weight < exist_weight)
372: return 1;
373:
374: /* 2. Local preference check. */
375: new_pref = exist_pref = bgp->default_local_pref;
376:
377: if (newattr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
378: new_pref = newattr->local_pref;
379: if (existattr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
380: exist_pref = existattr->local_pref;
381:
382: if (new_pref > exist_pref)
383: return -1;
384: if (new_pref < exist_pref)
385: return 1;
386:
387: /* 3. Local route check. We prefer:
388: * - BGP_ROUTE_STATIC
389: * - BGP_ROUTE_AGGREGATE
390: * - BGP_ROUTE_REDISTRIBUTE
391: */
392: if (! (new->sub_type == BGP_ROUTE_NORMAL))
393: return -1;
394: if (! (exist->sub_type == BGP_ROUTE_NORMAL))
395: return 1;
396:
397: /* 4. AS path length check. */
398: if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
399: {
400: int exist_hops = aspath_count_hops (existattr->aspath);
401: int exist_confeds = aspath_count_confeds (existattr->aspath);
402:
403: if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
404: {
405: int aspath_hops;
406:
407: aspath_hops = aspath_count_hops (newattr->aspath);
408: aspath_hops += aspath_count_confeds (newattr->aspath);
409:
410: if ( aspath_hops < (exist_hops + exist_confeds))
411: return -1;
412: if ( aspath_hops > (exist_hops + exist_confeds))
413: return 1;
414: }
415: else
416: {
417: int newhops = aspath_count_hops (newattr->aspath);
418:
419: if (newhops < exist_hops)
420: return -1;
421: if (newhops > exist_hops)
422: return 1;
423: }
424: }
425:
426: /* 5. Origin check. */
427: if (newattr->origin < existattr->origin)
428: return -1;
429: if (newattr->origin > existattr->origin)
430: return 1;
431:
432: /* 6. MED check. */
433: internal_as_route = (aspath_count_hops (newattr->aspath) == 0
434: && aspath_count_hops (existattr->aspath) == 0);
435: confed_as_route = (aspath_count_confeds (newattr->aspath) > 0
436: && aspath_count_confeds (existattr->aspath) > 0
437: && aspath_count_hops (newattr->aspath) == 0
438: && aspath_count_hops (existattr->aspath) == 0);
439:
440: if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
441: || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
442: && confed_as_route)
443: || aspath_cmp_left (newattr->aspath, existattr->aspath)
444: || aspath_cmp_left_confed (newattr->aspath, existattr->aspath)
445: || internal_as_route)
446: {
447: new_med = bgp_med_value (new->attr, bgp);
448: exist_med = bgp_med_value (exist->attr, bgp);
449:
450: if (new_med < exist_med)
451: return -1;
452: if (new_med > exist_med)
453: return 1;
454: }
455:
456: /* 7. Peer type check. */
457: new_sort = new->peer->sort;
458: exist_sort = exist->peer->sort;
459:
460: if (new_sort == BGP_PEER_EBGP
461: && (exist_sort == BGP_PEER_IBGP || exist_sort == BGP_PEER_CONFED))
462: return -1;
463: if (exist_sort == BGP_PEER_EBGP
464: && (new_sort == BGP_PEER_IBGP || new_sort == BGP_PEER_CONFED))
465: return 1;
466:
467: /* 8. IGP metric check. */
468: newm = existm = 0;
469:
470: if (new->extra)
471: newm = new->extra->igpmetric;
472: if (exist->extra)
473: existm = exist->extra->igpmetric;
474:
475: if (newm < existm)
476: return -1;
477: if (newm > existm)
478: return 1;
479:
480: /* 9. Maximum path check. */
481: if (bgp_mpath_is_configured (bgp, afi, safi))
482: {
483: if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX))
484: {
485: /*
486: * For the two paths, all comparison steps till IGP metric
487: * have succeeded - including AS_PATH hop count. Since 'bgp
488: * bestpath as-path multipath-relax' knob is on, we don't need
489: * an exact match of AS_PATH. Thus, mark the paths are equal.
490: * That will trigger both these paths to get into the multipath
491: * array.
492: */
493: return 0;
494: }
495: else if (new->peer->sort == BGP_PEER_IBGP)
496: {
497: if (aspath_cmp (new->attr->aspath, exist->attr->aspath))
498: return 0;
499: }
500: else if (new->peer->as == exist->peer->as)
501: return 0;
502: }
503:
504: /* 10. If both paths are external, prefer the path that was received
505: first (the oldest one). This step minimizes route-flap, since a
506: newer path won't displace an older one, even if it was the
507: preferred route based on the additional decision criteria below. */
508: if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
509: && new_sort == BGP_PEER_EBGP
510: && exist_sort == BGP_PEER_EBGP)
511: {
512: if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
513: return -1;
514: if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
515: return 1;
516: }
517:
518: /* 11. Router-ID comparision. */
519: /* If one of the paths is "stale", the corresponding peer router-id will
520: * be 0 and would always win over the other path. If originator id is
521: * used for the comparision, it will decide which path is better.
522: */
523: if (newattr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
524: new_id.s_addr = newattre->originator_id.s_addr;
525: else
526: new_id.s_addr = new->peer->remote_id.s_addr;
527: if (existattr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
528: exist_id.s_addr = existattre->originator_id.s_addr;
529: else
530: exist_id.s_addr = exist->peer->remote_id.s_addr;
531:
532: if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
533: return -1;
534: if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
535: return 1;
536:
537: /* 12. Cluster length comparision. */
538: new_cluster = exist_cluster = 0;
539:
540: if (newattr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
541: new_cluster = newattre->cluster->length;
542: if (existattr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
543: exist_cluster = existattre->cluster->length;
544:
545: if (new_cluster < exist_cluster)
546: return -1;
547: if (new_cluster > exist_cluster)
548: return 1;
549:
550: /* 13. Neighbor address comparision. */
551: /* Do this only if neither path is "stale" as stale paths do not have
552: * valid peer information (as the connection may or may not be up).
553: */
554: if (CHECK_FLAG (exist->flags, BGP_INFO_STALE))
555: return -1;
556: if (CHECK_FLAG (new->flags, BGP_INFO_STALE))
557: return 1;
558: /* locally configured routes to advertise do not have su_remote */
559: if (new->peer->su_remote == NULL)
560: return 1;
561: if (exist->peer->su_remote == NULL)
562: return -1;
563:
564: ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
565:
566: if (ret == 1)
567: return 1;
568: if (ret == -1)
569: return -1;
570:
571: return -1;
572: }
573:
574: static enum filter_type
575: bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
576: afi_t afi, safi_t safi)
577: {
578: struct bgp_filter *filter;
579:
580: filter = &peer->filter[afi][safi];
581:
582: #define FILTER_EXIST_WARN(F,f,filter) \
583: if (BGP_DEBUG (update, UPDATE_IN) \
584: && !(F ## _IN (filter))) \
585: plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
586: peer->host, #f, F ## _IN_NAME(filter));
587:
588: if (DISTRIBUTE_IN_NAME (filter)) {
589: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
590:
591: if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
592: return FILTER_DENY;
593: }
594:
595: if (PREFIX_LIST_IN_NAME (filter)) {
596: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
597:
598: if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
599: return FILTER_DENY;
600: }
601:
602: if (FILTER_LIST_IN_NAME (filter)) {
603: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
604:
605: if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
606: return FILTER_DENY;
607: }
608:
609: return FILTER_PERMIT;
610: #undef FILTER_EXIST_WARN
611: }
612:
613: static enum filter_type
614: bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
615: afi_t afi, safi_t safi)
616: {
617: struct bgp_filter *filter;
618:
619: filter = &peer->filter[afi][safi];
620:
621: #define FILTER_EXIST_WARN(F,f,filter) \
622: if (BGP_DEBUG (update, UPDATE_OUT) \
623: && !(F ## _OUT (filter))) \
624: plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
625: peer->host, #f, F ## _OUT_NAME(filter));
626:
627: if (DISTRIBUTE_OUT_NAME (filter)) {
628: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
629:
630: if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
631: return FILTER_DENY;
632: }
633:
634: if (PREFIX_LIST_OUT_NAME (filter)) {
635: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
636:
637: if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
638: return FILTER_DENY;
639: }
640:
641: if (FILTER_LIST_OUT_NAME (filter)) {
642: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
643:
644: if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
645: return FILTER_DENY;
646: }
647:
648: return FILTER_PERMIT;
649: #undef FILTER_EXIST_WARN
650: }
651:
652: /* If community attribute includes no_export then return 1. */
653: static int
654: bgp_community_filter (struct peer *peer, struct attr *attr)
655: {
656: if (attr->community)
657: {
658: /* NO_ADVERTISE check. */
659: if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
660: return 1;
661:
662: /* NO_EXPORT check. */
663: if (peer->sort == BGP_PEER_EBGP &&
664: community_include (attr->community, COMMUNITY_NO_EXPORT))
665: return 1;
666:
667: /* NO_EXPORT_SUBCONFED check. */
668: if (peer->sort == BGP_PEER_EBGP
669: || peer->sort == BGP_PEER_CONFED)
670: if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
671: return 1;
672: }
673: return 0;
674: }
675:
676: /* Route reflection loop check. */
677: static int
678: bgp_cluster_filter (struct peer *peer, struct attr *attr)
679: {
680: struct in_addr cluster_id;
681:
682: if (attr->extra && attr->extra->cluster)
683: {
684: if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
685: cluster_id = peer->bgp->cluster_id;
686: else
687: cluster_id = peer->bgp->router_id;
688:
689: if (cluster_loop_check (attr->extra->cluster, cluster_id))
690: return 1;
691: }
692: return 0;
693: }
694:
695: static int
696: bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
697: afi_t afi, safi_t safi)
698: {
699: struct bgp_filter *filter;
700: struct bgp_info info;
701: route_map_result_t ret;
702:
703: filter = &peer->filter[afi][safi];
704:
705: /* Apply default weight value. */
706: if (peer->weight)
707: (bgp_attr_extra_get (attr))->weight = peer->weight;
708:
709: /* Route map apply. */
710: if (ROUTE_MAP_IN_NAME (filter))
711: {
712: /* Duplicate current value to new strucutre for modification. */
713: info.peer = peer;
714: info.attr = attr;
715:
716: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
717:
718: /* Apply BGP route map to the attribute. */
719: ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
720:
721: peer->rmap_type = 0;
722:
723: if (ret == RMAP_DENYMATCH)
724: /* caller has multiple error paths with bgp_attr_flush() */
725: return RMAP_DENY;
726: }
727: return RMAP_PERMIT;
728: }
729:
730: static int
731: bgp_export_modifier (struct peer *rsclient, struct peer *peer,
732: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
733: {
734: struct bgp_filter *filter;
735: struct bgp_info info;
736: route_map_result_t ret;
737:
738: filter = &peer->filter[afi][safi];
739:
740: /* Route map apply. */
741: if (ROUTE_MAP_EXPORT_NAME (filter))
742: {
743: /* Duplicate current value to new strucutre for modification. */
744: info.peer = rsclient;
745: info.attr = attr;
746:
747: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
748:
749: /* Apply BGP route map to the attribute. */
750: ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
751:
752: rsclient->rmap_type = 0;
753:
754: if (ret == RMAP_DENYMATCH)
755: {
756: /* Free newly generated AS path and community by route-map. */
757: bgp_attr_flush (attr);
758: return RMAP_DENY;
759: }
760: }
761: return RMAP_PERMIT;
762: }
763:
764: static int
765: bgp_import_modifier (struct peer *rsclient, struct peer *peer,
766: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
767: {
768: struct bgp_filter *filter;
769: struct bgp_info info;
770: route_map_result_t ret;
771:
772: filter = &rsclient->filter[afi][safi];
773:
774: /* Apply default weight value. */
775: if (peer->weight)
776: (bgp_attr_extra_get (attr))->weight = peer->weight;
777:
778: /* Route map apply. */
779: if (ROUTE_MAP_IMPORT_NAME (filter))
780: {
781: /* Duplicate current value to new strucutre for modification. */
782: info.peer = peer;
783: info.attr = attr;
784:
785: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
786:
787: /* Apply BGP route map to the attribute. */
788: ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
789:
790: peer->rmap_type = 0;
791:
792: if (ret == RMAP_DENYMATCH)
793: {
794: /* Free newly generated AS path and community by route-map. */
795: bgp_attr_flush (attr);
796: return RMAP_DENY;
797: }
798: }
799: return RMAP_PERMIT;
800: }
801:
802: static int
803: bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
804: struct attr *attr, afi_t afi, safi_t safi)
805: {
806: int ret;
807: char buf[SU_ADDRSTRLEN];
808: struct bgp_filter *filter;
809: struct peer *from;
810: struct bgp *bgp;
811: int transparent;
812: int reflect;
813: struct attr *riattr;
814:
815: from = ri->peer;
816: filter = &peer->filter[afi][safi];
817: bgp = peer->bgp;
818: riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
819:
820: if (DISABLE_BGP_ANNOUNCE)
821: return 0;
822:
823: /* Do not send announces to RS-clients from the 'normal' bgp_table. */
824: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
825: return 0;
826:
827: /* Do not send back route to sender. */
828: if (from == peer)
829: return 0;
830:
831: /* Aggregate-address suppress check. */
832: if (ri->extra && ri->extra->suppress)
833: if (! UNSUPPRESS_MAP_NAME (filter))
834: return 0;
835:
836: /* Default route check. */
837: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
838: {
839: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
840: return 0;
841: else if (p->family == AF_INET6 && p->prefixlen == 0)
842: return 0;
843: }
844:
845: /* Transparency check. */
846: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
847: && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
848: transparent = 1;
849: else
850: transparent = 0;
851:
852: /* If community is not disabled check the no-export and local. */
853: if (! transparent && bgp_community_filter (peer, riattr))
854: return 0;
855:
856: /* If the attribute has originator-id and it is same as remote
857: peer's id. */
858: if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
859: {
860: if (IPV4_ADDR_SAME (&peer->remote_id, &riattr->extra->originator_id))
861: {
862: if (BGP_DEBUG (filter, FILTER))
863: zlog (peer->log, LOG_DEBUG,
864: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
865: peer->host,
866: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
867: p->prefixlen);
868: return 0;
869: }
870: }
871:
872: /* ORF prefix-list filter check */
873: if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
874: && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
875: || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
876: if (peer->orf_plist[afi][safi])
877: {
878: if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
879: return 0;
880: }
881:
882: /* Output filter check. */
883: if (bgp_output_filter (peer, p, riattr, afi, safi) == FILTER_DENY)
884: {
885: if (BGP_DEBUG (filter, FILTER))
886: zlog (peer->log, LOG_DEBUG,
887: "%s [Update:SEND] %s/%d is filtered",
888: peer->host,
889: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
890: p->prefixlen);
891: return 0;
892: }
893:
894: #ifdef BGP_SEND_ASPATH_CHECK
895: /* AS path loop check. */
896: if (aspath_loop_check (riattr->aspath, peer->as))
897: {
898: if (BGP_DEBUG (filter, FILTER))
899: zlog (peer->log, LOG_DEBUG,
900: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
901: peer->host, peer->as);
902: return 0;
903: }
904: #endif /* BGP_SEND_ASPATH_CHECK */
905:
906: /* If we're a CONFED we need to loop check the CONFED ID too */
907: if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
908: {
909: if (aspath_loop_check(riattr->aspath, bgp->confed_id))
910: {
911: if (BGP_DEBUG (filter, FILTER))
912: zlog (peer->log, LOG_DEBUG,
913: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
914: peer->host,
915: bgp->confed_id);
916: return 0;
917: }
918: }
919:
920: /* Route-Reflect check. */
921: if (from->sort == BGP_PEER_IBGP && peer->sort == BGP_PEER_IBGP)
922: reflect = 1;
923: else
924: reflect = 0;
925:
926: /* IBGP reflection check. */
927: if (reflect)
928: {
929: /* A route from a Client peer. */
930: if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
931: {
932: /* Reflect to all the Non-Client peers and also to the
933: Client peers other than the originator. Originator check
934: is already done. So there is noting to do. */
935: /* no bgp client-to-client reflection check. */
936: if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
937: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
938: return 0;
939: }
940: else
941: {
942: /* A route from a Non-client peer. Reflect to all other
943: clients. */
944: if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
945: return 0;
946: }
947: }
948:
949: /* For modify attribute, copy it to temporary structure. */
950: bgp_attr_dup (attr, riattr);
951:
952: /* If local-preference is not set. */
953: if ((peer->sort == BGP_PEER_IBGP
954: || peer->sort == BGP_PEER_CONFED)
955: && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
956: {
957: attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
958: attr->local_pref = bgp->default_local_pref;
959: }
960:
961: /* If originator-id is not set and the route is to be reflected,
962: set the originator id */
963: if (peer && from && peer->sort == BGP_PEER_IBGP &&
964: from->sort == BGP_PEER_IBGP &&
965: (! (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))))
966: {
967: attr->extra = bgp_attr_extra_get(attr);
968: IPV4_ADDR_COPY(&(attr->extra->originator_id), &(from->remote_id));
969: SET_FLAG(attr->flag, BGP_ATTR_ORIGINATOR_ID);
970: }
971:
972: /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
973: if (peer->sort == BGP_PEER_EBGP
974: && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
975: {
976: if (ri->peer != bgp->peer_self && ! transparent
977: && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
978: attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
979: }
980:
981:
982: #define NEXTHOP_IS_V4 (\
983: (safi != SAFI_ENCAP && p->family == AF_INET) || \
984: (safi == SAFI_ENCAP && attr->extra->mp_nexthop_len == 4))
985:
986: #define NEXTHOP_IS_V6 (\
987: (safi != SAFI_ENCAP && p->family == AF_INET6) || \
988: (safi == SAFI_ENCAP && attr->extra->mp_nexthop_len == 16))
989:
990: /* next-hop-set */
991: if (transparent
992: || (reflect && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF_ALL))
993: || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
994: && ((NEXTHOP_IS_V4 && attr->nexthop.s_addr)
995: || (NEXTHOP_IS_V6 &&
996: ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
997: )))
998: {
999: /* NEXT-HOP Unchanged. */
1000: }
1001: else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
1002: || (NEXTHOP_IS_V4 && attr->nexthop.s_addr == 0)
1003: || (NEXTHOP_IS_V6 &&
1004: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
1005: || (peer->sort == BGP_PEER_EBGP
1006: && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
1007: {
1008: /* Set IPv4 nexthop. */
1009: if (NEXTHOP_IS_V4)
1010: {
1011: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
1012: memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
1013: IPV4_MAX_BYTELEN);
1014: else
1015: memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
1016: }
1017: /* Set IPv6 nexthop. */
1018: if (NEXTHOP_IS_V6)
1019: {
1020: /* IPv6 global nexthop must be included. */
1021: memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
1022: IPV6_MAX_BYTELEN);
1023: attr->extra->mp_nexthop_len = 16;
1024: }
1025: }
1026:
1027: if (p->family == AF_INET6 && safi != SAFI_ENCAP)
1028: {
1029: /* Left nexthop_local unchanged if so configured. */
1030: if ( CHECK_FLAG (peer->af_flags[afi][safi],
1031: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1032: {
1033: if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
1034: attr->extra->mp_nexthop_len=32;
1035: else
1036: attr->extra->mp_nexthop_len=16;
1037: }
1038:
1039: /* Default nexthop_local treatment for non-RS-Clients */
1040: else
1041: {
1042: /* Link-local address should not be transit to different peer. */
1043: attr->extra->mp_nexthop_len = 16;
1044:
1045: /* Set link-local address for shared network peer. */
1046: if (peer->shared_network
1047: && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
1048: {
1049: memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
1050: IPV6_MAX_BYTELEN);
1051: attr->extra->mp_nexthop_len = 32;
1052: }
1053:
1054: /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1055: address.*/
1056: if (reflect)
1057: attr->extra->mp_nexthop_len = 16;
1058:
1059: /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1060: if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
1061: attr->extra->mp_nexthop_len = 16;
1062: }
1063:
1064: }
1065:
1066: /* If this is EBGP peer and remove-private-AS is set. */
1067: if (peer->sort == BGP_PEER_EBGP
1068: && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1069: && aspath_private_as_check (attr->aspath))
1070: attr->aspath = aspath_empty_get ();
1071:
1072: /* Route map & unsuppress-map apply. */
1073: if (ROUTE_MAP_OUT_NAME (filter)
1074: || (ri->extra && ri->extra->suppress) )
1075: {
1076: struct bgp_info info;
1077: struct attr dummy_attr;
1078: struct attr_extra dummy_extra;
1079:
1080: dummy_attr.extra = &dummy_extra;
1081:
1082: info.peer = peer;
1083: info.attr = attr;
1084:
1085: /* The route reflector is not allowed to modify the attributes
1086: of the reflected IBGP routes. */
1087: if (from->sort == BGP_PEER_IBGP
1088: && peer->sort == BGP_PEER_IBGP)
1089: {
1090: bgp_attr_dup (&dummy_attr, attr);
1091: info.attr = &dummy_attr;
1092: }
1093:
1094: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1095:
1096: if (ri->extra && ri->extra->suppress)
1097: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1098: else
1099: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1100:
1101: peer->rmap_type = 0;
1102:
1103: if (ret == RMAP_DENYMATCH)
1104: {
1105: bgp_attr_flush (attr);
1106: return 0;
1107: }
1108: }
1109: return 1;
1110: }
1111:
1112: static int
1113: bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1114: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
1115: {
1116: int ret;
1117: char buf[SU_ADDRSTRLEN];
1118: struct bgp_filter *filter;
1119: struct bgp_info info;
1120: struct peer *from;
1121: struct attr *riattr;
1122:
1123: from = ri->peer;
1124: filter = &rsclient->filter[afi][safi];
1125: riattr = bgp_info_mpath_count (ri) ? bgp_info_mpath_attr (ri) : ri->attr;
1126:
1127: if (DISABLE_BGP_ANNOUNCE)
1128: return 0;
1129:
1130: /* Do not send back route to sender. */
1131: if (from == rsclient)
1132: return 0;
1133:
1134: /* Aggregate-address suppress check. */
1135: if (ri->extra && ri->extra->suppress)
1136: if (! UNSUPPRESS_MAP_NAME (filter))
1137: return 0;
1138:
1139: /* Default route check. */
1140: if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1141: PEER_STATUS_DEFAULT_ORIGINATE))
1142: {
1143: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1144: return 0;
1145: else if (p->family == AF_INET6 && p->prefixlen == 0)
1146: return 0;
1147: }
1148:
1149: /* If the attribute has originator-id and it is same as remote
1150: peer's id. */
1151: if (riattr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
1152: {
1153: if (IPV4_ADDR_SAME (&rsclient->remote_id,
1154: &riattr->extra->originator_id))
1155: {
1156: if (BGP_DEBUG (filter, FILTER))
1157: zlog (rsclient->log, LOG_DEBUG,
1158: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1159: rsclient->host,
1160: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1161: p->prefixlen);
1162: return 0;
1163: }
1164: }
1165:
1166: /* ORF prefix-list filter check */
1167: if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1168: && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1169: || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1170: if (rsclient->orf_plist[afi][safi])
1171: {
1172: if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1173: return 0;
1174: }
1175:
1176: /* Output filter check. */
1177: if (bgp_output_filter (rsclient, p, riattr, afi, safi) == FILTER_DENY)
1178: {
1179: if (BGP_DEBUG (filter, FILTER))
1180: zlog (rsclient->log, LOG_DEBUG,
1181: "%s [Update:SEND] %s/%d is filtered",
1182: rsclient->host,
1183: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1184: p->prefixlen);
1185: return 0;
1186: }
1187:
1188: #ifdef BGP_SEND_ASPATH_CHECK
1189: /* AS path loop check. */
1190: if (aspath_loop_check (riattr->aspath, rsclient->as))
1191: {
1192: if (BGP_DEBUG (filter, FILTER))
1193: zlog (rsclient->log, LOG_DEBUG,
1194: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
1195: rsclient->host, rsclient->as);
1196: return 0;
1197: }
1198: #endif /* BGP_SEND_ASPATH_CHECK */
1199:
1200: /* For modify attribute, copy it to temporary structure. */
1201: bgp_attr_dup (attr, riattr);
1202:
1203: /* next-hop-set */
1204: if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1205: || (p->family == AF_INET6 &&
1206: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
1207: )
1208: {
1209: /* Set IPv4 nexthop. */
1210: if (p->family == AF_INET)
1211: {
1212: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
1213: memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
1214: IPV4_MAX_BYTELEN);
1215: else
1216: memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1217: }
1218: /* Set IPv6 nexthop. */
1219: if (p->family == AF_INET6)
1220: {
1221: /* IPv6 global nexthop must be included. */
1222: memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
1223: IPV6_MAX_BYTELEN);
1224: attr->extra->mp_nexthop_len = 16;
1225: }
1226: }
1227:
1228: if (p->family == AF_INET6)
1229: {
1230: struct attr_extra *attre = attr->extra;
1231:
1232: /* Left nexthop_local unchanged if so configured. */
1233: if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1234: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1235: {
1236: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1237: attre->mp_nexthop_len=32;
1238: else
1239: attre->mp_nexthop_len=16;
1240: }
1241:
1242: /* Default nexthop_local treatment for RS-Clients */
1243: else
1244: {
1245: /* Announcer and RS-Client are both in the same network */
1246: if (rsclient->shared_network && from->shared_network &&
1247: (rsclient->ifindex == from->ifindex))
1248: {
1249: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1250: attre->mp_nexthop_len=32;
1251: else
1252: attre->mp_nexthop_len=16;
1253: }
1254:
1255: /* Set link-local address for shared network peer. */
1256: else if (rsclient->shared_network
1257: && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1258: {
1259: memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
1260: IPV6_MAX_BYTELEN);
1261: attre->mp_nexthop_len = 32;
1262: }
1263:
1264: else
1265: attre->mp_nexthop_len = 16;
1266: }
1267:
1268: }
1269:
1270: /* If this is EBGP peer and remove-private-AS is set. */
1271: if (rsclient->sort == BGP_PEER_EBGP
1272: && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1273: && aspath_private_as_check (attr->aspath))
1274: attr->aspath = aspath_empty_get ();
1275:
1276: /* Route map & unsuppress-map apply. */
1277: if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
1278: {
1279: info.peer = rsclient;
1280: info.attr = attr;
1281:
1282: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1283:
1284: if (ri->extra && ri->extra->suppress)
1285: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1286: else
1287: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1288:
1289: rsclient->rmap_type = 0;
1290:
1291: if (ret == RMAP_DENYMATCH)
1292: {
1293: bgp_attr_flush (attr);
1294: return 0;
1295: }
1296: }
1297:
1298: return 1;
1299: }
1300:
1301: struct bgp_info_pair
1302: {
1303: struct bgp_info *old;
1304: struct bgp_info *new;
1305: };
1306:
1307: static void
1308: bgp_best_selection (struct bgp *bgp, struct bgp_node *rn,
1309: struct bgp_info_pair *result,
1310: afi_t afi, safi_t safi)
1311: {
1312: struct bgp_info *new_select;
1313: struct bgp_info *old_select;
1314: struct bgp_info *ri;
1315: struct bgp_info *ri1;
1316: struct bgp_info *ri2;
1317: struct bgp_info *nextri = NULL;
1318: int cmpret, do_mpath;
1319: struct list mp_list;
1320:
1321: result->old = result->new = NULL;
1322:
1323: if (rn->info == NULL)
1324: {
1325: char buf[PREFIX_STRLEN];
1326: zlog_warn ("%s: Called for route_node %s with no routing entries!",
1327: __func__,
1328: prefix2str (&(bgp_node_to_rnode (rn)->p), buf, sizeof(buf)));
1329: return;
1330: }
1331:
1332: bgp_mp_list_init (&mp_list);
1333: do_mpath = bgp_mpath_is_configured (bgp, afi, safi);
1334:
1335: /* bgp deterministic-med */
1336: new_select = NULL;
1337: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1338: for (ri1 = rn->info; ri1; ri1 = ri1->next)
1339: {
1340: if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1341: continue;
1342: if (BGP_INFO_HOLDDOWN (ri1))
1343: continue;
1344: if (ri1->peer && ri1->peer != bgp->peer_self)
1345: if (ri1->peer->status != Established)
1346: continue;
1347:
1348: new_select = ri1;
1349: if (do_mpath)
1350: bgp_mp_list_add (&mp_list, ri1);
1351: old_select = CHECK_FLAG (ri1->flags, BGP_INFO_SELECTED) ? ri1 : NULL;
1352: if (ri1->next)
1353: for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1354: {
1355: if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1356: continue;
1357: if (BGP_INFO_HOLDDOWN (ri2))
1358: continue;
1359: if (ri2->peer &&
1360: ri2->peer != bgp->peer_self &&
1361: !CHECK_FLAG (ri2->peer->sflags, PEER_STATUS_NSF_WAIT))
1362: if (ri2->peer->status != Established)
1363: continue;
1364:
1365: if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1366: || aspath_cmp_left_confed (ri1->attr->aspath,
1367: ri2->attr->aspath))
1368: {
1369: if (CHECK_FLAG (ri2->flags, BGP_INFO_SELECTED))
1370: old_select = ri2;
1371: if ((cmpret = bgp_info_cmp (bgp, ri2, new_select, afi, safi))
1372: == -1)
1373: {
1374: bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1375: new_select = ri2;
1376: }
1377:
1378: if (do_mpath)
1379: {
1380: if (cmpret != 0)
1381: bgp_mp_list_clear (&mp_list);
1382:
1383: if (cmpret == 0 || cmpret == -1)
1384: bgp_mp_list_add (&mp_list, ri2);
1385: }
1386:
1387: bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
1388: }
1389: }
1390: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1391: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1392:
1393: bgp_info_mpath_update (rn, new_select, old_select, &mp_list, afi, safi);
1394: bgp_mp_list_clear (&mp_list);
1395: }
1396:
1397: /* Check old selected route and new selected route. */
1398: old_select = NULL;
1399: new_select = NULL;
1400: for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
1401: {
1402: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1403: old_select = ri;
1404:
1405: if (BGP_INFO_HOLDDOWN (ri))
1406: {
1407: /* reap REMOVED routes, if needs be
1408: * selected route must stay for a while longer though
1409: */
1410: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1411: && (ri != old_select))
1412: bgp_info_reap (rn, ri);
1413:
1414: continue;
1415: }
1416:
1417: if (ri->peer &&
1418: ri->peer != bgp->peer_self &&
1419: !CHECK_FLAG (ri->peer->sflags, PEER_STATUS_NSF_WAIT))
1420: if (ri->peer->status != Established)
1421: continue;
1422:
1423: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1424: && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1425: {
1426: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1427: continue;
1428: }
1429: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1430: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
1431:
1432: if ((cmpret = bgp_info_cmp (bgp, ri, new_select, afi, safi)) == -1)
1433: {
1434: if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1435: bgp_mp_dmed_deselect (new_select);
1436:
1437: new_select = ri;
1438: }
1439: else if (cmpret == 1 && do_mpath
1440: && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1441: bgp_mp_dmed_deselect (ri);
1442:
1443: if (do_mpath)
1444: {
1445: if (cmpret != 0)
1446: bgp_mp_list_clear (&mp_list);
1447:
1448: if (cmpret == 0 || cmpret == -1)
1449: bgp_mp_list_add (&mp_list, ri);
1450: }
1451: }
1452:
1453: if (!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1454: bgp_info_mpath_update (rn, new_select, old_select, &mp_list, afi, safi);
1455:
1456: bgp_info_mpath_aggregate_update (new_select, old_select);
1457: bgp_mp_list_clear (&mp_list);
1458:
1459: result->old = old_select;
1460: result->new = new_select;
1461:
1462: return;
1463: }
1464:
1465: static int
1466: bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
1467: struct bgp_node *rn, afi_t afi, safi_t safi)
1468: {
1469: struct prefix *p;
1470: struct attr attr;
1471: struct attr_extra extra;
1472:
1473: memset (&attr, 0, sizeof(struct attr));
1474: memset (&extra, 0, sizeof(struct attr_extra));
1475:
1476: p = &rn->p;
1477:
1478: /* Announce route to Established peer. */
1479: if (peer->status != Established)
1480: return 0;
1481:
1482: /* Address family configuration check. */
1483: if (! peer->afc_nego[afi][safi])
1484: return 0;
1485:
1486: /* First update is deferred until ORF or ROUTE-REFRESH is received */
1487: if (CHECK_FLAG (peer->af_sflags[afi][safi],
1488: PEER_STATUS_ORF_WAIT_REFRESH))
1489: return 0;
1490:
1491: /* It's initialized in bgp_announce_[check|check_rsclient]() */
1492: attr.extra = &extra;
1493:
1494: switch (bgp_node_table (rn)->type)
1495: {
1496: case BGP_TABLE_MAIN:
1497: /* Announcement to peer->conf. If the route is filtered,
1498: withdraw it. */
1499: if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1500: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1501: else
1502: bgp_adj_out_unset (rn, peer, p, afi, safi);
1503: break;
1504: case BGP_TABLE_RSCLIENT:
1505: /* Announcement to peer->conf. If the route is filtered,
1506: withdraw it. */
1507: if (selected &&
1508: bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1509: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1510: else
1511: bgp_adj_out_unset (rn, peer, p, afi, safi);
1512: break;
1513: }
1514:
1515: bgp_attr_flush (&attr);
1516: return 0;
1517: }
1518:
1519: struct bgp_process_queue
1520: {
1521: struct bgp *bgp;
1522: struct bgp_node *rn;
1523: afi_t afi;
1524: safi_t safi;
1525: };
1526:
1527: static wq_item_status
1528: bgp_process_rsclient (struct work_queue *wq, void *data)
1529: {
1530: struct bgp_process_queue *pq = data;
1531: struct bgp *bgp = pq->bgp;
1532: struct bgp_node *rn = pq->rn;
1533: afi_t afi = pq->afi;
1534: safi_t safi = pq->safi;
1535: struct bgp_info *new_select;
1536: struct bgp_info *old_select;
1537: struct bgp_info_pair old_and_new;
1538: struct listnode *node, *nnode;
1539: struct peer *rsclient = bgp_node_table (rn)->owner;
1540:
1541: /* Best path selection. */
1542: bgp_best_selection (bgp, rn, &old_and_new, afi, safi);
1543: new_select = old_and_new.new;
1544: old_select = old_and_new.old;
1545:
1546: if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1547: {
1548: if (rsclient->group)
1549: for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1550: {
1551: /* Nothing to do. */
1552: if (old_select && old_select == new_select)
1553: if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1554: continue;
1555:
1556: if (old_select)
1557: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1558: if (new_select)
1559: {
1560: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1561: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1562: UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
1563: }
1564:
1565: bgp_process_announce_selected (rsclient, new_select, rn,
1566: afi, safi);
1567: }
1568: }
1569: else
1570: {
1571: if (old_select)
1572: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1573: if (new_select)
1574: {
1575: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1576: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1577: UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
1578: }
1579: bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
1580: }
1581:
1582: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1583: bgp_info_reap (rn, old_select);
1584:
1585: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1586: return WQ_SUCCESS;
1587: }
1588:
1589: static wq_item_status
1590: bgp_process_main (struct work_queue *wq, void *data)
1591: {
1592: struct bgp_process_queue *pq = data;
1593: struct bgp *bgp = pq->bgp;
1594: struct bgp_node *rn = pq->rn;
1595: afi_t afi = pq->afi;
1596: safi_t safi = pq->safi;
1597: struct prefix *p = &rn->p;
1598: struct bgp_info *new_select;
1599: struct bgp_info *old_select;
1600: struct bgp_info_pair old_and_new;
1601: struct listnode *node, *nnode;
1602: struct peer *peer;
1603:
1604: /* Best path selection. */
1605: bgp_best_selection (bgp, rn, &old_and_new, afi, safi);
1606: old_select = old_and_new.old;
1607: new_select = old_and_new.new;
1608:
1609: /* Nothing to do. */
1610: if (old_select && old_select == new_select)
1611: {
1612: if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1613: {
1614: if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED) ||
1615: CHECK_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG))
1616: bgp_zebra_announce (p, old_select, bgp, safi);
1617:
1618: UNSET_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG);
1619: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1620: return WQ_SUCCESS;
1621: }
1622: }
1623:
1624: if (old_select)
1625: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1626: if (new_select)
1627: {
1628: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1629: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1630: UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
1631: }
1632:
1633:
1634: /* Check each BGP peer. */
1635: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
1636: {
1637: bgp_process_announce_selected (peer, new_select, rn, afi, safi);
1638: }
1639:
1640: /* FIB update. */
1641: if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp->name &&
1642: ! bgp_option_check (BGP_OPT_NO_FIB)))
1643: {
1644: if (new_select
1645: && new_select->type == ZEBRA_ROUTE_BGP
1646: && new_select->sub_type == BGP_ROUTE_NORMAL)
1647: bgp_zebra_announce (p, new_select, bgp, safi);
1648: else
1649: {
1650: /* Withdraw the route from the kernel. */
1651: if (old_select
1652: && old_select->type == ZEBRA_ROUTE_BGP
1653: && old_select->sub_type == BGP_ROUTE_NORMAL)
1654: bgp_zebra_withdraw (p, old_select, safi);
1655: }
1656: }
1657:
1658: /* Reap old select bgp_info, if it has been removed */
1659: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1660: bgp_info_reap (rn, old_select);
1661:
1662: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1663: return WQ_SUCCESS;
1664: }
1665:
1666: static void
1667: bgp_processq_del (struct work_queue *wq, void *data)
1668: {
1669: struct bgp_process_queue *pq = data;
1670: struct bgp_table *table = bgp_node_table (pq->rn);
1671:
1672: bgp_unlock (pq->bgp);
1673: bgp_unlock_node (pq->rn);
1674: bgp_table_unlock (table);
1675: XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1676: }
1677:
1678: static void
1679: bgp_process_queue_init (void)
1680: {
1681: bm->process_main_queue
1682: = work_queue_new (bm->master, "process_main_queue");
1683: bm->process_rsclient_queue
1684: = work_queue_new (bm->master, "process_rsclient_queue");
1685:
1686: if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1687: {
1688: zlog_err ("%s: Failed to allocate work queue", __func__);
1689: exit (1);
1690: }
1691:
1692: bm->process_main_queue->spec.workfunc = &bgp_process_main;
1693: bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
1694: bm->process_main_queue->spec.max_retries = 0;
1695: bm->process_main_queue->spec.hold = 50;
1696:
1697: bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
1698: bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
1699: bm->process_rsclient_queue->spec.max_retries = 0;
1700: bm->process_rsclient_queue->spec.hold = 50;
1701: }
1702:
1703: void
1704: bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1705: {
1706: struct bgp_process_queue *pqnode;
1707:
1708: /* already scheduled for processing? */
1709: if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1710: return;
1711:
1712: if (rn->info == NULL)
1713: {
1714: /* XXX: Perhaps remove before next release, after we've flushed out
1715: * any obvious cases
1716: */
1717: assert (rn->info != NULL);
1718: char buf[PREFIX_STRLEN];
1719: zlog_warn ("%s: Called for route_node %s with no routing entries!",
1720: __func__,
1721: prefix2str (&(bgp_node_to_rnode (rn)->p), buf, sizeof(buf)));
1722: return;
1723: }
1724:
1725: if ( (bm->process_main_queue == NULL) ||
1726: (bm->process_rsclient_queue == NULL) )
1727: bgp_process_queue_init ();
1728:
1729: pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1730: sizeof (struct bgp_process_queue));
1731: if (!pqnode)
1732: return;
1733:
1734: /* all unlocked in bgp_processq_del */
1735: bgp_table_lock (bgp_node_table (rn));
1736: pqnode->rn = bgp_lock_node (rn);
1737: pqnode->bgp = bgp;
1738: bgp_lock (bgp);
1739: pqnode->afi = afi;
1740: pqnode->safi = safi;
1741:
1742: switch (bgp_node_table (rn)->type)
1743: {
1744: case BGP_TABLE_MAIN:
1745: work_queue_add (bm->process_main_queue, pqnode);
1746: break;
1747: case BGP_TABLE_RSCLIENT:
1748: work_queue_add (bm->process_rsclient_queue, pqnode);
1749: break;
1750: }
1751:
1752: SET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1753: return;
1754: }
1755:
1756: static int
1757: bgp_maximum_prefix_restart_timer (struct thread *thread)
1758: {
1759: struct peer *peer;
1760:
1761: peer = THREAD_ARG (thread);
1762: peer->t_pmax_restart = NULL;
1763:
1764: if (BGP_DEBUG (events, EVENTS))
1765: zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1766: peer->host);
1767:
1768: peer_clear (peer);
1769:
1770: return 0;
1771: }
1772:
1773: int
1774: bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1775: safi_t safi, int always)
1776: {
1777: if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1778: return 0;
1779:
1780: if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
1781: {
1782: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1783: && ! always)
1784: return 0;
1785:
1786: zlog (peer->log, LOG_INFO,
1787: "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1788: "limit %ld", afi_safi_print (afi, safi), peer->host,
1789: peer->pcount[afi][safi], peer->pmax[afi][safi]);
1790: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1791:
1792: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1793: return 0;
1794:
1795: {
1796: u_int8_t ndata[7];
1797:
1798: if (safi == SAFI_MPLS_VPN)
1799: safi = SAFI_MPLS_LABELED_VPN;
1800:
1801: ndata[0] = (afi >> 8);
1802: ndata[1] = afi;
1803: ndata[2] = safi;
1804: ndata[3] = (peer->pmax[afi][safi] >> 24);
1805: ndata[4] = (peer->pmax[afi][safi] >> 16);
1806: ndata[5] = (peer->pmax[afi][safi] >> 8);
1807: ndata[6] = (peer->pmax[afi][safi]);
1808:
1809: SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1810: bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1811: BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1812: }
1813:
1814: /* restart timer start */
1815: if (peer->pmax_restart[afi][safi])
1816: {
1817: peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1818:
1819: if (BGP_DEBUG (events, EVENTS))
1820: zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1821: peer->host, peer->v_pmax_restart);
1822:
1823: BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1824: peer->v_pmax_restart);
1825: }
1826:
1827: return 1;
1828: }
1829: else
1830: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1831:
1832: if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1833: {
1834: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1835: && ! always)
1836: return 0;
1837:
1838: zlog (peer->log, LOG_INFO,
1839: "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1840: afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1841: peer->pmax[afi][safi]);
1842: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1843: }
1844: else
1845: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1846: return 0;
1847: }
1848:
1849: /* Unconditionally remove the route from the RIB, without taking
1850: * damping into consideration (eg, because the session went down)
1851: */
1852: static void
1853: bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1854: afi_t afi, safi_t safi)
1855: {
1856: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1857:
1858: if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1859: bgp_info_delete (rn, ri); /* keep historical info */
1860:
1861: bgp_process (peer->bgp, rn, afi, safi);
1862: }
1863:
1864: static void
1865: bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1866: afi_t afi, safi_t safi, struct prefix_rd *prd)
1867: {
1868: int status = BGP_DAMP_NONE;
1869:
1870: /* apply dampening, if result is suppressed, we'll be retaining
1871: * the bgp_info in the RIB for historical reference.
1872: */
1873: if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1874: && peer->sort == BGP_PEER_EBGP)
1875: if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1876: == BGP_DAMP_SUPPRESSED)
1877: {
1878: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1879: return;
1880: }
1881:
1882: bgp_rib_remove (rn, ri, peer, afi, safi);
1883: }
1884:
1885: static void
1886: bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1887: struct attr *attr, struct peer *peer, struct prefix *p, int type,
1888: int sub_type, struct prefix_rd *prd, u_char *tag)
1889: {
1890: struct bgp_node *rn;
1891: struct bgp *bgp;
1892: struct attr new_attr;
1893: struct attr_extra new_extra;
1894: struct attr *attr_new;
1895: struct attr *attr_new2;
1896: struct bgp_info *ri;
1897: struct bgp_info *new;
1898: const char *reason;
1899: char buf[SU_ADDRSTRLEN];
1900:
1901: /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1902: if (peer == rsclient)
1903: return;
1904:
1905: bgp = peer->bgp;
1906: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1907:
1908: /* Check previously received route. */
1909: for (ri = rn->info; ri; ri = ri->next)
1910: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1911: break;
1912:
1913: /* AS path loop check. */
1914: if (aspath_loop_check (attr->aspath, rsclient->as) > rsclient->allowas_in[afi][safi])
1915: {
1916: reason = "as-path contains our own AS;";
1917: goto filtered;
1918: }
1919:
1920: /* Route reflector originator ID check. */
1921: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
1922: && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
1923: {
1924: reason = "originator is us;";
1925: goto filtered;
1926: }
1927:
1928: new_attr.extra = &new_extra;
1929: bgp_attr_dup (&new_attr, attr);
1930:
1931: /* Apply export policy. */
1932: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1933: bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1934: {
1935: reason = "export-policy;";
1936: goto filtered;
1937: }
1938:
1939: attr_new2 = bgp_attr_intern (&new_attr);
1940:
1941: /* Apply import policy. */
1942: if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1943: {
1944: bgp_attr_unintern (&attr_new2);
1945:
1946: reason = "import-policy;";
1947: goto filtered;
1948: }
1949:
1950: attr_new = bgp_attr_intern (&new_attr);
1951: bgp_attr_unintern (&attr_new2);
1952:
1953: /* IPv4 unicast next hop check. */
1954: if ((afi == AFI_IP) && ((safi == SAFI_UNICAST) || safi == SAFI_MULTICAST))
1955: {
1956: /* Next hop must not be 0.0.0.0 nor Class D/E address. */
1957: if (new_attr.nexthop.s_addr == 0
1958: || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr)))
1959: {
1960: bgp_attr_unintern (&attr_new);
1961:
1962: reason = "martian next-hop;";
1963: goto filtered;
1964: }
1965: }
1966:
1967: /* If the update is implicit withdraw. */
1968: if (ri)
1969: {
1970: ri->uptime = bgp_clock ();
1971:
1972: /* Same attribute comes in. */
1973: if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1974: && attrhash_cmp (ri->attr, attr_new))
1975: {
1976:
1977: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1978:
1979: if (BGP_DEBUG (update, UPDATE_IN))
1980: zlog (peer->log, LOG_DEBUG,
1981: "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1982: peer->host,
1983: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1984: p->prefixlen, rsclient->host);
1985:
1986: bgp_unlock_node (rn);
1987: bgp_attr_unintern (&attr_new);
1988: bgp_attr_flush(&new_attr);
1989: return;
1990: }
1991:
1992: /* Withdraw/Announce before we fully processed the withdraw */
1993: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1994: bgp_info_restore (rn, ri);
1995:
1996: /* Received Logging. */
1997: if (BGP_DEBUG (update, UPDATE_IN))
1998: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1999: peer->host,
2000: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2001: p->prefixlen, rsclient->host);
2002:
2003: /* The attribute is changed. */
2004: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2005:
2006: /* Update to new attribute. */
2007: bgp_attr_unintern (&ri->attr);
2008: ri->attr = attr_new;
2009:
2010: /* Update MPLS tag. */
2011: if (safi == SAFI_MPLS_VPN)
2012: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
2013:
2014: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2015:
2016: /* Process change. */
2017: bgp_process (bgp, rn, afi, safi);
2018: bgp_unlock_node (rn);
2019:
2020: return;
2021: }
2022:
2023: /* Received Logging. */
2024: if (BGP_DEBUG (update, UPDATE_IN))
2025: {
2026: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
2027: peer->host,
2028: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2029: p->prefixlen, rsclient->host);
2030: }
2031:
2032: /* Make new BGP info. */
2033: new = bgp_info_new ();
2034: new->type = type;
2035: new->sub_type = sub_type;
2036: new->peer = peer;
2037: new->attr = attr_new;
2038: new->uptime = bgp_clock ();
2039:
2040: /* Update MPLS tag. */
2041: if (safi == SAFI_MPLS_VPN)
2042: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
2043:
2044: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2045:
2046: /* Register new BGP information. */
2047: bgp_info_add (rn, new);
2048:
2049: /* route_node_get lock */
2050: bgp_unlock_node (rn);
2051:
2052: /* Process change. */
2053: bgp_process (bgp, rn, afi, safi);
2054:
2055: return;
2056:
2057: filtered:
2058:
2059: /* This BGP update is filtered. Log the reason then update BGP entry. */
2060: if (BGP_DEBUG (update, UPDATE_IN))
2061: zlog (peer->log, LOG_DEBUG,
2062: "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
2063: peer->host,
2064: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2065: p->prefixlen, rsclient->host, reason);
2066:
2067: if (ri)
2068: bgp_rib_remove (rn, ri, peer, afi, safi);
2069:
2070: bgp_unlock_node (rn);
2071:
2072: return;
2073: }
2074:
2075: static void
2076: bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
2077: struct peer *peer, struct prefix *p, int type, int sub_type,
2078: struct prefix_rd *prd, u_char *tag)
2079: {
2080: struct bgp_node *rn;
2081: struct bgp_info *ri;
2082: char buf[SU_ADDRSTRLEN];
2083:
2084: if (rsclient == peer)
2085: return;
2086:
2087: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
2088:
2089: /* Lookup withdrawn route. */
2090: for (ri = rn->info; ri; ri = ri->next)
2091: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2092: break;
2093:
2094: /* Withdraw specified route from routing table. */
2095: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2096: bgp_rib_withdraw (rn, ri, peer, afi, safi, prd);
2097: else if (BGP_DEBUG (update, UPDATE_IN))
2098: zlog (peer->log, LOG_DEBUG,
2099: "%s Can't find the route %s/%d", peer->host,
2100: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2101: p->prefixlen);
2102:
2103: /* Unlock bgp_node_get() lock. */
2104: bgp_unlock_node (rn);
2105: }
2106:
2107: static int
2108: bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
2109: afi_t afi, safi_t safi, int type, int sub_type,
2110: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2111: {
2112: int ret;
2113: int aspath_loop_count = 0;
2114: struct bgp_node *rn;
2115: struct bgp *bgp;
2116: struct attr new_attr;
2117: struct attr_extra new_extra;
2118: struct attr *attr_new;
2119: struct bgp_info *ri;
2120: struct bgp_info *new;
2121: const char *reason;
2122: char buf[SU_ADDRSTRLEN];
2123:
2124: memset (&new_attr, 0, sizeof(struct attr));
2125: memset (&new_extra, 0, sizeof(struct attr_extra));
2126:
2127: bgp = peer->bgp;
2128: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2129:
2130: /* When peer's soft reconfiguration enabled. Record input packet in
2131: Adj-RIBs-In. */
2132: if (! soft_reconfig && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2133: && peer != bgp->peer_self)
2134: bgp_adj_in_set (rn, peer, attr);
2135:
2136: /* Check previously received route. */
2137: for (ri = rn->info; ri; ri = ri->next)
2138: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2139: break;
2140:
2141: /* AS path local-as loop check. */
2142: if (peer->change_local_as)
2143: {
2144: if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2145: aspath_loop_count = 1;
2146:
2147: if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2148: {
2149: reason = "as-path contains our own AS;";
2150: goto filtered;
2151: }
2152: }
2153:
2154: /* AS path loop check. */
2155: if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2156: || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2157: && aspath_loop_check(attr->aspath, bgp->confed_id)
2158: > peer->allowas_in[afi][safi]))
2159: {
2160: reason = "as-path contains our own AS;";
2161: goto filtered;
2162: }
2163:
2164: /* Route reflector originator ID check. */
2165: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
2166: && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
2167: {
2168: reason = "originator is us;";
2169: goto filtered;
2170: }
2171:
2172: /* Route reflector cluster ID check. */
2173: if (bgp_cluster_filter (peer, attr))
2174: {
2175: reason = "reflected from the same cluster;";
2176: goto filtered;
2177: }
2178:
2179: /* Apply incoming filter. */
2180: if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2181: {
2182: reason = "filter;";
2183: goto filtered;
2184: }
2185:
2186: new_attr.extra = &new_extra;
2187: bgp_attr_dup (&new_attr, attr);
2188:
2189: /* Apply incoming route-map.
2190: * NB: new_attr may now contain newly allocated values from route-map "set"
2191: * commands, so we need bgp_attr_flush in the error paths, until we intern
2192: * the attr (which takes over the memory references) */
2193: if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2194: {
2195: reason = "route-map;";
2196: bgp_attr_flush (&new_attr);
2197: goto filtered;
2198: }
2199:
2200: /* IPv4 unicast next hop check. */
2201: if (afi == AFI_IP && safi == SAFI_UNICAST)
2202: {
2203: /* If the peer is EBGP and nexthop is not on connected route,
2204: discard it. */
2205: if (peer->sort == BGP_PEER_EBGP && peer->ttl == 1
2206: && ! bgp_nexthop_onlink (afi, &new_attr)
2207: && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
2208: {
2209: reason = "non-connected next-hop;";
2210: bgp_attr_flush (&new_attr);
2211: goto filtered;
2212: }
2213:
2214: /* Next hop must not be 0.0.0.0 nor Class D/E address. Next hop
2215: must not be my own address. */
2216: if (new_attr.nexthop.s_addr == 0
2217: || IPV4_CLASS_DE (ntohl (new_attr.nexthop.s_addr))
2218: || bgp_nexthop_self (&new_attr))
2219: {
2220: reason = "martian next-hop;";
2221: bgp_attr_flush (&new_attr);
2222: goto filtered;
2223: }
2224: }
2225:
2226: attr_new = bgp_attr_intern (&new_attr);
2227:
2228: /* If the update is implicit withdraw. */
2229: if (ri)
2230: {
2231: ri->uptime = bgp_clock ();
2232:
2233: /* Same attribute comes in. */
2234: if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2235: && attrhash_cmp (ri->attr, attr_new))
2236: {
2237: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2238:
2239: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2240: && peer->sort == BGP_PEER_EBGP
2241: && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2242: {
2243: if (BGP_DEBUG (update, UPDATE_IN))
2244: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2245: peer->host,
2246: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2247: p->prefixlen);
2248:
2249: if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2250: {
2251: bgp_aggregate_increment (bgp, p, ri, afi, safi);
2252: bgp_process (bgp, rn, afi, safi);
2253: }
2254: }
2255: else /* Duplicate - odd */
2256: {
2257: if (BGP_DEBUG (update, UPDATE_IN))
2258: zlog (peer->log, LOG_DEBUG,
2259: "%s rcvd %s/%d...duplicate ignored",
2260: peer->host,
2261: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2262: p->prefixlen);
2263:
2264: /* graceful restart STALE flag unset. */
2265: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2266: {
2267: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2268: bgp_process (bgp, rn, afi, safi);
2269: }
2270: }
2271:
2272: bgp_unlock_node (rn);
2273: bgp_attr_unintern (&attr_new);
2274: bgp_attr_flush (&new_attr);
2275:
2276: return 0;
2277: }
2278:
2279: /* Withdraw/Announce before we fully processed the withdraw */
2280: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2281: {
2282: if (BGP_DEBUG (update, UPDATE_IN))
2283: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2284: peer->host,
2285: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2286: p->prefixlen);
2287: bgp_info_restore (rn, ri);
2288: }
2289:
2290: /* Received Logging. */
2291: if (BGP_DEBUG (update, UPDATE_IN))
2292: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2293: peer->host,
2294: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2295: p->prefixlen);
2296:
2297: /* graceful restart STALE flag unset. */
2298: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2299: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2300:
2301: /* The attribute is changed. */
2302: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2303:
2304: /* implicit withdraw, decrement aggregate and pcount here.
2305: * only if update is accepted, they'll increment below.
2306: */
2307: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2308:
2309: /* Update bgp route dampening information. */
2310: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2311: && peer->sort == BGP_PEER_EBGP)
2312: {
2313: /* This is implicit withdraw so we should update dampening
2314: information. */
2315: if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2316: bgp_damp_withdraw (ri, rn, afi, safi, 1);
2317: }
2318:
2319: /* Update to new attribute. */
2320: bgp_attr_unintern (&ri->attr);
2321: ri->attr = attr_new;
2322:
2323: /* Update MPLS tag. */
2324: if (safi == SAFI_MPLS_VPN)
2325: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
2326:
2327: bgp_attr_flush (&new_attr);
2328:
2329: /* Update bgp route dampening information. */
2330: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2331: && peer->sort == BGP_PEER_EBGP)
2332: {
2333: /* Now we do normal update dampening. */
2334: ret = bgp_damp_update (ri, rn, afi, safi);
2335: if (ret == BGP_DAMP_SUPPRESSED)
2336: {
2337: bgp_unlock_node (rn);
2338: return 0;
2339: }
2340: }
2341:
2342: /* Nexthop reachability check. */
2343: if ((afi == AFI_IP || afi == AFI_IP6)
2344: && safi == SAFI_UNICAST
2345: && (peer->sort == BGP_PEER_IBGP
2346: || peer->sort == BGP_PEER_CONFED
2347: || (peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
2348: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2349: {
2350: if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
2351: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2352: else
2353: bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
2354: }
2355: else
2356: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2357:
2358: bgp_attr_flush (&new_attr);
2359:
2360: /* Process change. */
2361: bgp_aggregate_increment (bgp, p, ri, afi, safi);
2362:
2363: bgp_process (bgp, rn, afi, safi);
2364: bgp_unlock_node (rn);
2365:
2366: return 0;
2367: }
2368:
2369: /* Received Logging. */
2370: if (BGP_DEBUG (update, UPDATE_IN))
2371: {
2372: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2373: peer->host,
2374: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2375: p->prefixlen);
2376: }
2377:
2378: /* Make new BGP info. */
2379: new = bgp_info_new ();
2380: new->type = type;
2381: new->sub_type = sub_type;
2382: new->peer = peer;
2383: new->attr = attr_new;
2384: new->uptime = bgp_clock ();
2385:
2386: /* Update MPLS tag. */
2387: if (safi == SAFI_MPLS_VPN)
2388: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
2389:
2390: /* Nexthop reachability check. */
2391: if ((afi == AFI_IP || afi == AFI_IP6)
2392: && safi == SAFI_UNICAST
2393: && (peer->sort == BGP_PEER_IBGP
2394: || peer->sort == BGP_PEER_CONFED
2395: || (peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
2396: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2397: {
2398: if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
2399: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2400: else
2401: bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
2402: }
2403: else
2404: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2405:
2406: /* Increment prefix */
2407: bgp_aggregate_increment (bgp, p, new, afi, safi);
2408:
2409: /* Register new BGP information. */
2410: bgp_info_add (rn, new);
2411:
2412: /* route_node_get lock */
2413: bgp_unlock_node (rn);
2414:
2415: bgp_attr_flush (&new_attr);
2416:
2417: /* If maximum prefix count is configured and current prefix
2418: count exeed it. */
2419: if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2420: return -1;
2421:
2422: /* Process change. */
2423: bgp_process (bgp, rn, afi, safi);
2424:
2425: return 0;
2426:
2427: /* This BGP update is filtered. Log the reason then update BGP
2428: entry. */
2429: filtered:
2430: if (BGP_DEBUG (update, UPDATE_IN))
2431: zlog (peer->log, LOG_DEBUG,
2432: "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2433: peer->host,
2434: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2435: p->prefixlen, reason);
2436:
2437: if (ri)
2438: bgp_rib_remove (rn, ri, peer, afi, safi);
2439:
2440: bgp_unlock_node (rn);
2441: bgp_attr_flush (&new_attr);
2442:
2443: return 0;
2444: }
2445:
2446: int
2447: bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2448: afi_t afi, safi_t safi, int type, int sub_type,
2449: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2450: {
2451: struct peer *rsclient;
2452: struct listnode *node, *nnode;
2453: struct bgp *bgp;
2454: int ret;
2455:
2456: ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2457: soft_reconfig);
2458:
2459: bgp = peer->bgp;
2460:
2461: /* Process the update for each RS-client. */
2462: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2463: {
2464: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2465: bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2466: sub_type, prd, tag);
2467: }
2468:
2469: return ret;
2470: }
2471:
2472: int
2473: bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
2474: afi_t afi, safi_t safi, int type, int sub_type,
2475: struct prefix_rd *prd, u_char *tag)
2476: {
2477: struct bgp *bgp;
2478: char buf[SU_ADDRSTRLEN];
2479: struct bgp_node *rn;
2480: struct bgp_info *ri;
2481: struct peer *rsclient;
2482: struct listnode *node, *nnode;
2483:
2484: bgp = peer->bgp;
2485:
2486: /* Lookup node. */
2487: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2488:
2489: /* Cisco IOS 12.4(24)T4 on session establishment sends withdraws for all
2490: * routes that are filtered. This tanks out Quagga RS pretty badly due to
2491: * the iteration over all RS clients.
2492: * Since we need to remove the entry from adj_in anyway, do that first and
2493: * if there was no entry, we don't need to do anything more. */
2494: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2495: && peer != bgp->peer_self)
2496: if (!bgp_adj_in_unset (rn, peer))
2497: {
2498: if (BGP_DEBUG (update, UPDATE_IN))
2499: zlog (peer->log, LOG_DEBUG, "%s withdrawing route %s/%d "
2500: "not in adj-in", peer->host,
2501: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2502: p->prefixlen);
2503: bgp_unlock_node (rn);
2504: return 0;
2505: }
2506:
2507: /* Process the withdraw for each RS-client. */
2508: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2509: {
2510: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2511: bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2512: }
2513:
2514: /* Logging. */
2515: if (BGP_DEBUG (update, UPDATE_IN))
2516: zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
2517: peer->host,
2518: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2519: p->prefixlen);
2520:
2521: /* Lookup withdrawn route. */
2522: for (ri = rn->info; ri; ri = ri->next)
2523: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2524: break;
2525:
2526: /* Withdraw specified route from routing table. */
2527: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2528: bgp_rib_withdraw (rn, ri, peer, afi, safi, prd);
2529: else if (BGP_DEBUG (update, UPDATE_IN))
2530: zlog (peer->log, LOG_DEBUG,
2531: "%s Can't find the route %s/%d", peer->host,
2532: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2533: p->prefixlen);
2534:
2535: /* Unlock bgp_node_get() lock. */
2536: bgp_unlock_node (rn);
2537:
2538: return 0;
2539: }
2540:
2541: void
2542: bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2543: {
2544: struct bgp *bgp;
2545: struct attr attr;
2546: struct aspath *aspath;
2547: struct prefix p;
2548: struct peer *from;
2549: struct bgp_node *rn;
2550: struct bgp_info *ri;
2551: int ret = RMAP_DENYMATCH;
2552:
2553: if (!(afi == AFI_IP || afi == AFI_IP6))
2554: return;
2555:
2556: bgp = peer->bgp;
2557: from = bgp->peer_self;
2558:
2559: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2560: aspath = attr.aspath;
2561: attr.local_pref = bgp->default_local_pref;
2562: memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2563:
2564: if (afi == AFI_IP)
2565: str2prefix ("0.0.0.0/0", &p);
2566: else if (afi == AFI_IP6)
2567: {
2568: struct attr_extra *ae = attr.extra;
2569:
2570: str2prefix ("::/0", &p);
2571:
2572: /* IPv6 global nexthop must be included. */
2573: memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
2574: IPV6_MAX_BYTELEN);
2575: ae->mp_nexthop_len = 16;
2576:
2577: /* If the peer is on shared nextwork and we have link-local
2578: nexthop set it. */
2579: if (peer->shared_network
2580: && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2581: {
2582: memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
2583: IPV6_MAX_BYTELEN);
2584: ae->mp_nexthop_len = 32;
2585: }
2586: }
2587:
2588: if (peer->default_rmap[afi][safi].name)
2589: {
2590: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2591: for (rn = bgp_table_top(bgp->rib[afi][safi]); rn; rn = bgp_route_next(rn))
2592: {
2593: for (ri = rn->info; ri; ri = ri->next)
2594: {
2595: struct attr dummy_attr;
2596: struct attr_extra dummy_extra;
2597: struct bgp_info info;
2598:
2599: /* Provide dummy so the route-map can't modify the attributes */
2600: dummy_attr.extra = &dummy_extra;
2601: bgp_attr_dup(&dummy_attr, ri->attr);
2602: info.peer = ri->peer;
2603: info.attr = &dummy_attr;
2604:
2605: ret = route_map_apply(peer->default_rmap[afi][safi].map, &rn->p,
2606: RMAP_BGP, &info);
2607:
2608: /* The route map might have set attributes. If we don't flush them
2609: * here, they will be leaked. */
2610: bgp_attr_flush(&dummy_attr);
2611: if (ret != RMAP_DENYMATCH)
2612: break;
2613: }
2614: if (ret != RMAP_DENYMATCH)
2615: break;
2616: }
2617: bgp->peer_self->rmap_type = 0;
2618:
2619: if (ret == RMAP_DENYMATCH)
2620: withdraw = 1;
2621: }
2622:
2623: if (withdraw)
2624: {
2625: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2626: bgp_default_withdraw_send (peer, afi, safi);
2627: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2628: }
2629: else
2630: {
2631: if (! CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2632: {
2633: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2634: bgp_default_update_send (peer, &attr, afi, safi, from);
2635: }
2636: }
2637:
2638: bgp_attr_extra_free (&attr);
2639: aspath_unintern (&aspath);
2640: }
2641:
2642: static void
2643: bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
2644: struct bgp_table *table, int rsclient)
2645: {
2646: struct bgp_node *rn;
2647: struct bgp_info *ri;
2648: struct attr attr;
2649: struct attr_extra extra;
2650:
2651: memset(&extra, 0, sizeof(extra));
2652:
2653: if (! table)
2654: table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
2655:
2656: if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP)
2657: && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2658: bgp_default_originate (peer, afi, safi, 0);
2659:
2660: /* It's initialized in bgp_announce_[check|check_rsclient]() */
2661: attr.extra = &extra;
2662:
2663: for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2664: for (ri = rn->info; ri; ri = ri->next)
2665: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2666: {
2667: if ( (rsclient) ?
2668: (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2669: : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
2670: bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2671: else
2672: bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
2673: }
2674:
2675: bgp_attr_flush_encap(&attr);
2676: }
2677:
2678: void
2679: bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2680: {
2681: struct bgp_node *rn;
2682: struct bgp_table *table;
2683:
2684: if (peer->status != Established)
2685: return;
2686:
2687: if (! peer->afc_nego[afi][safi])
2688: return;
2689:
2690: /* First update is deferred until ORF or ROUTE-REFRESH is received */
2691: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2692: return;
2693:
2694: if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP))
2695: bgp_announce_table (peer, afi, safi, NULL, 0);
2696: else
2697: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2698: rn = bgp_route_next(rn))
2699: if ((table = (rn->info)) != NULL)
2700: bgp_announce_table (peer, afi, safi, table, 0);
2701:
2702: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2703: bgp_announce_table (peer, afi, safi, NULL, 1);
2704: }
2705:
2706: void
2707: bgp_announce_route_all (struct peer *peer)
2708: {
2709: afi_t afi;
2710: safi_t safi;
2711:
2712: for (afi = AFI_IP; afi < AFI_MAX; afi++)
2713: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2714: bgp_announce_route (peer, afi, safi);
2715: }
2716:
2717: static void
2718: bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2719: safi_t safi, struct bgp_table *table, struct prefix_rd *prd)
2720: {
2721: struct bgp_node *rn;
2722: struct bgp_adj_in *ain;
2723:
2724: if (! table)
2725: table = rsclient->bgp->rib[afi][safi];
2726:
2727: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2728: for (ain = rn->adj_in; ain; ain = ain->next)
2729: {
2730: struct bgp_info *ri = rn->info;
2731: u_char *tag = (ri && ri->extra) ? ri->extra->tag : NULL;
2732:
2733: bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2734: &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd, tag);
2735: }
2736: }
2737:
2738: void
2739: bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2740: {
2741: struct bgp_table *table;
2742: struct bgp_node *rn;
2743:
2744: if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP))
2745: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL, NULL);
2746:
2747: else
2748: for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2749: rn = bgp_route_next (rn))
2750: if ((table = rn->info) != NULL)
2751: {
2752: struct prefix_rd prd;
2753: prd.family = AF_UNSPEC;
2754: prd.prefixlen = 64;
2755: memcpy(&prd.val, rn->p.u.val, 8);
2756:
2757: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table, &prd);
2758: }
2759: }
2760:
2761: static void
2762: bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2763: struct bgp_table *table, struct prefix_rd *prd)
2764: {
2765: int ret;
2766: struct bgp_node *rn;
2767: struct bgp_adj_in *ain;
2768:
2769: if (! table)
2770: table = peer->bgp->rib[afi][safi];
2771:
2772: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2773: for (ain = rn->adj_in; ain; ain = ain->next)
2774: {
2775: if (ain->peer == peer)
2776: {
2777: struct bgp_info *ri = rn->info;
2778: u_char *tag = (ri && ri->extra) ? ri->extra->tag : NULL;
2779:
2780: ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2781: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2782: prd, tag, 1);
2783:
2784: if (ret < 0)
2785: {
2786: bgp_unlock_node (rn);
2787: return;
2788: }
2789: continue;
2790: }
2791: }
2792: }
2793:
2794: void
2795: bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2796: {
2797: struct bgp_node *rn;
2798: struct bgp_table *table;
2799:
2800: if (peer->status != Established)
2801: return;
2802:
2803: if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP))
2804: bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL);
2805: else
2806: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2807: rn = bgp_route_next (rn))
2808: if ((table = rn->info) != NULL)
2809: {
2810: struct prefix_rd prd;
2811: prd.family = AF_UNSPEC;
2812: prd.prefixlen = 64;
2813: memcpy(&prd.val, rn->p.u.val, 8);
2814:
2815: bgp_soft_reconfig_table (peer, afi, safi, table, &prd);
2816: }
2817: }
2818:
2819:
2820: struct bgp_clear_node_queue
2821: {
2822: struct bgp_node *rn;
2823: enum bgp_clear_route_type purpose;
2824: };
2825:
2826: static wq_item_status
2827: bgp_clear_route_node (struct work_queue *wq, void *data)
2828: {
2829: struct bgp_clear_node_queue *cnq = data;
2830: struct bgp_node *rn = cnq->rn;
2831: struct peer *peer = wq->spec.data;
2832: struct bgp_info *ri;
2833: afi_t afi = bgp_node_table (rn)->afi;
2834: safi_t safi = bgp_node_table (rn)->safi;
2835:
2836: assert (rn && peer);
2837:
2838: for (ri = rn->info; ri; ri = ri->next)
2839: if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2840: {
2841: /* graceful restart STALE flag set. */
2842: if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2843: && peer->nsf[afi][safi]
2844: && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
2845: && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2846: bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
2847: else
2848: bgp_rib_remove (rn, ri, peer, afi, safi);
2849: break;
2850: }
2851: return WQ_SUCCESS;
2852: }
2853:
2854: static void
2855: bgp_clear_node_queue_del (struct work_queue *wq, void *data)
2856: {
2857: struct bgp_clear_node_queue *cnq = data;
2858: struct bgp_node *rn = cnq->rn;
2859: struct bgp_table *table = bgp_node_table (rn);
2860:
2861: bgp_unlock_node (rn);
2862: bgp_table_unlock (table);
2863: XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
2864: }
2865:
2866: static void
2867: bgp_clear_node_complete (struct work_queue *wq)
2868: {
2869: struct peer *peer = wq->spec.data;
2870:
2871: /* Tickle FSM to start moving again */
2872: BGP_EVENT_ADD (peer, Clearing_Completed);
2873:
2874: peer_unlock (peer); /* bgp_clear_route */
2875: }
2876:
2877: static void
2878: bgp_clear_node_queue_init (struct peer *peer)
2879: {
2880: char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
2881:
2882: snprintf (wname, sizeof(wname), "clear %s", peer->host);
2883: #undef CLEAR_QUEUE_NAME_LEN
2884:
2885: if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
2886: {
2887: zlog_err ("%s: Failed to allocate work queue", __func__);
2888: exit (1);
2889: }
2890: peer->clear_node_queue->spec.hold = 10;
2891: peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2892: peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2893: peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2894: peer->clear_node_queue->spec.max_retries = 0;
2895:
2896: /* we only 'lock' this peer reference when the queue is actually active */
2897: peer->clear_node_queue->spec.data = peer;
2898: }
2899:
2900: static void
2901: bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
2902: struct bgp_table *table, struct peer *rsclient,
2903: enum bgp_clear_route_type purpose)
2904: {
2905: struct bgp_node *rn;
2906:
2907:
2908: if (! table)
2909: table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
2910:
2911: /* If still no table => afi/safi isn't configured at all or smth. */
2912: if (! table)
2913: return;
2914:
2915: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2916: {
2917: struct bgp_info *ri;
2918: struct bgp_adj_in *ain;
2919: struct bgp_adj_out *aout;
2920:
2921: /* XXX:TODO: This is suboptimal, every non-empty route_node is
2922: * queued for every clearing peer, regardless of whether it is
2923: * relevant to the peer at hand.
2924: *
2925: * Overview: There are 3 different indices which need to be
2926: * scrubbed, potentially, when a peer is removed:
2927: *
2928: * 1 peer's routes visible via the RIB (ie accepted routes)
2929: * 2 peer's routes visible by the (optional) peer's adj-in index
2930: * 3 other routes visible by the peer's adj-out index
2931: *
2932: * 3 there is no hurry in scrubbing, once the struct peer is
2933: * removed from bgp->peer, we could just GC such deleted peer's
2934: * adj-outs at our leisure.
2935: *
2936: * 1 and 2 must be 'scrubbed' in some way, at least made
2937: * invisible via RIB index before peer session is allowed to be
2938: * brought back up. So one needs to know when such a 'search' is
2939: * complete.
2940: *
2941: * Ideally:
2942: *
2943: * - there'd be a single global queue or a single RIB walker
2944: * - rather than tracking which route_nodes still need to be
2945: * examined on a peer basis, we'd track which peers still
2946: * aren't cleared
2947: *
2948: * Given that our per-peer prefix-counts now should be reliable,
2949: * this may actually be achievable. It doesn't seem to be a huge
2950: * problem at this time,
2951: */
2952: for (ain = rn->adj_in; ain; ain = ain->next)
2953: if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2954: {
2955: bgp_adj_in_remove (rn, ain);
2956: bgp_unlock_node (rn);
2957: break;
2958: }
2959: for (aout = rn->adj_out; aout; aout = aout->next)
2960: if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2961: {
2962: bgp_adj_out_remove (rn, aout, peer, afi, safi);
2963: bgp_unlock_node (rn);
2964: break;
2965: }
2966:
2967: for (ri = rn->info; ri; ri = ri->next)
2968: if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2969: {
2970: struct bgp_clear_node_queue *cnq;
2971:
2972: /* both unlocked in bgp_clear_node_queue_del */
2973: bgp_table_lock (bgp_node_table (rn));
2974: bgp_lock_node (rn);
2975: cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2976: sizeof (struct bgp_clear_node_queue));
2977: cnq->rn = rn;
2978: cnq->purpose = purpose;
2979: work_queue_add (peer->clear_node_queue, cnq);
2980: break;
2981: }
2982: }
2983: return;
2984: }
2985:
2986: void
2987: bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2988: enum bgp_clear_route_type purpose)
2989: {
2990: struct bgp_node *rn;
2991: struct bgp_table *table;
2992: struct peer *rsclient;
2993: struct listnode *node, *nnode;
2994:
2995: if (peer->clear_node_queue == NULL)
2996: bgp_clear_node_queue_init (peer);
2997:
2998: /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2999: * Idle until it receives a Clearing_Completed event. This protects
3000: * against peers which flap faster than we can we clear, which could
3001: * lead to:
3002: *
3003: * a) race with routes from the new session being installed before
3004: * clear_route_node visits the node (to delete the route of that
3005: * peer)
3006: * b) resource exhaustion, clear_route_node likely leads to an entry
3007: * on the process_main queue. Fast-flapping could cause that queue
3008: * to grow and grow.
3009: */
3010:
3011: /* lock peer in assumption that clear-node-queue will get nodes; if so,
3012: * the unlock will happen upon work-queue completion; other wise, the
3013: * unlock happens at the end of this function.
3014: */
3015: if (!peer->clear_node_queue->thread)
3016: peer_lock (peer); /* bgp_clear_node_complete */
3017: switch (purpose)
3018: {
3019: case BGP_CLEAR_ROUTE_NORMAL:
3020: if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP))
3021: bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
3022: else
3023: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
3024: rn = bgp_route_next (rn))
3025: if ((table = rn->info) != NULL)
3026: bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
3027:
3028: for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
3029: if (CHECK_FLAG(rsclient->af_flags[afi][safi],
3030: PEER_FLAG_RSERVER_CLIENT))
3031: bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
3032: break;
3033:
3034: case BGP_CLEAR_ROUTE_MY_RSCLIENT:
3035: /*
3036: * gpz 091009: TBD why don't we have special handling for
3037: * SAFI_MPLS_VPN here in the original quagga code?
3038: * (and, by extension, for SAFI_ENCAP)
3039: */
3040: bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
3041: break;
3042:
3043: default:
3044: assert (0);
3045: break;
3046: }
3047:
3048: /* unlock if no nodes got added to the clear-node-queue. */
3049: if (!peer->clear_node_queue->thread)
3050: peer_unlock (peer);
3051:
3052: }
3053:
3054: void
3055: bgp_clear_route_all (struct peer *peer)
3056: {
3057: afi_t afi;
3058: safi_t safi;
3059:
3060: for (afi = AFI_IP; afi < AFI_MAX; afi++)
3061: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3062: bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
3063: }
3064:
3065: /*
3066: * Finish freeing things when exiting
3067: */
3068: static void
3069: bgp_drain_workqueue_immediate (struct work_queue *wq)
3070: {
3071: if (!wq)
3072: return;
3073:
3074: if (!wq->thread)
3075: {
3076: /*
3077: * no thread implies no queued items
3078: */
3079: assert(!wq->items->count);
3080: return;
3081: }
3082:
3083: while (wq->items->count)
3084: {
3085: if (wq->thread)
3086: thread_cancel(wq->thread);
3087: work_queue_run(wq->thread);
3088: }
3089: }
3090:
3091: /*
3092: * Special function to process clear node queue when bgpd is exiting
3093: * and the thread scheduler is no longer running.
3094: */
3095: void
3096: bgp_peer_clear_node_queue_drain_immediate(struct peer *peer)
3097: {
3098: if (!peer)
3099: return;
3100:
3101: bgp_drain_workqueue_immediate(peer->clear_node_queue);
3102: }
3103:
3104: /*
3105: * The work queues are not specific to a BGP instance, but the
3106: * items in them refer to BGP instances, so this should be called
3107: * before each BGP instance is deleted.
3108: */
3109: void
3110: bgp_process_queues_drain_immediate(void)
3111: {
3112: bgp_drain_workqueue_immediate(bm->process_main_queue);
3113: bgp_drain_workqueue_immediate(bm->process_rsclient_queue);
3114: }
3115:
3116: void
3117: bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
3118: {
3119: struct bgp_table *table;
3120: struct bgp_node *rn;
3121: struct bgp_adj_in *ain;
3122:
3123: table = peer->bgp->rib[afi][safi];
3124:
3125: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3126: for (ain = rn->adj_in; ain ; ain = ain->next)
3127: if (ain->peer == peer)
3128: {
3129: bgp_adj_in_remove (rn, ain);
3130: bgp_unlock_node (rn);
3131: break;
3132: }
3133: }
3134:
3135: void
3136: bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
3137: {
3138: struct bgp_node *rn;
3139: struct bgp_info *ri;
3140: struct bgp_table *table;
3141:
3142: table = peer->bgp->rib[afi][safi];
3143:
3144: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3145: {
3146: for (ri = rn->info; ri; ri = ri->next)
3147: if (ri->peer == peer)
3148: {
3149: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
3150: bgp_rib_remove (rn, ri, peer, afi, safi);
3151: break;
3152: }
3153: }
3154: }
3155:
3156: static void
3157: bgp_cleanup_table(struct bgp_table *table, safi_t safi)
3158: {
3159: struct bgp_node *rn;
3160: struct bgp_info *ri;
3161: struct bgp_info *next;
3162:
3163: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
3164: for (ri = rn->info; ri; ri = next)
3165: {
3166: next = ri->next;
3167: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
3168: && ri->type == ZEBRA_ROUTE_BGP
3169: && ri->sub_type == BGP_ROUTE_NORMAL)
3170: bgp_zebra_withdraw (&rn->p, ri, safi);
3171: }
3172: }
3173:
3174: /* Delete all kernel routes. */
3175: void
3176: bgp_cleanup_routes (void)
3177: {
3178: struct bgp *bgp;
3179: struct listnode *node, *nnode;
3180: afi_t afi;
3181:
3182: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
3183: {
3184: for (afi = AFI_IP; afi < AFI_MAX; ++afi)
3185: {
3186: struct bgp_node *rn;
3187:
3188: bgp_cleanup_table(bgp->rib[afi][SAFI_UNICAST], SAFI_UNICAST);
3189:
3190: /*
3191: * VPN and ENCAP tables are two-level (RD is top level)
3192: */
3193: for (rn = bgp_table_top(bgp->rib[afi][SAFI_MPLS_VPN]); rn;
3194: rn = bgp_route_next (rn))
3195: {
3196: if (rn->info)
3197: {
3198: bgp_cleanup_table((struct bgp_table *)(rn->info), SAFI_MPLS_VPN);
3199: bgp_table_finish ((struct bgp_table **)&(rn->info));
3200: rn->info = NULL;
3201: bgp_unlock_node(rn);
3202: }
3203: }
3204:
3205: for (rn = bgp_table_top(bgp->rib[afi][SAFI_ENCAP]); rn;
3206: rn = bgp_route_next (rn))
3207: {
3208: if (rn->info)
3209: {
3210: bgp_cleanup_table((struct bgp_table *)(rn->info), SAFI_ENCAP);
3211: bgp_table_finish ((struct bgp_table **)&(rn->info));
3212: rn->info = NULL;
3213: bgp_unlock_node(rn);
3214: }
3215: }
3216: }
3217: }
3218: }
3219:
3220: void
3221: bgp_reset (void)
3222: {
3223: vty_reset ();
3224: bgp_zclient_reset ();
3225: access_list_reset ();
3226: prefix_list_reset ();
3227: }
3228:
3229: /* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
3230: value. */
3231: int
3232: bgp_nlri_parse_ip (struct peer *peer, struct attr *attr,
3233: struct bgp_nlri *packet)
3234: {
3235: u_char *pnt;
3236: u_char *lim;
3237: struct prefix p;
3238: int psize;
3239: int ret;
3240:
3241: /* Check peer status. */
3242: if (peer->status != Established)
3243: return 0;
3244:
3245: pnt = packet->nlri;
3246: lim = pnt + packet->length;
3247:
3248: /* RFC4771 6.3 The NLRI field in the UPDATE message is checked for
3249: syntactic validity. If the field is syntactically incorrect,
3250: then the Error Subcode is set to Invalid Network Field. */
3251: for (; pnt < lim; pnt += psize)
3252: {
3253: /* Clear prefix structure. */
3254: memset (&p, 0, sizeof (struct prefix));
3255:
3256: /* Fetch prefix length. */
3257: p.prefixlen = *pnt++;
3258: /* afi/safi validity already verified by caller, bgp_update_receive */
3259: p.family = afi2family (packet->afi);
3260:
3261: /* Prefix length check. */
3262: if (p.prefixlen > prefix_blen (&p) * 8)
3263: {
3264: plog_err (peer->log,
3265: "%s [Error] Update packet error"
3266: " (wrong prefix length %u for afi %u)",
3267: peer->host, p.prefixlen, packet->afi);
3268: return -1;
3269: }
3270:
3271: /* Packet size overflow check. */
3272: psize = PSIZE (p.prefixlen);
3273:
3274: /* When packet overflow occur return immediately. */
3275: if (pnt + psize > lim)
3276: {
3277: plog_err (peer->log,
3278: "%s [Error] Update packet error"
3279: " (prefix length %u overflows packet)",
3280: peer->host, p.prefixlen);
3281: return -1;
3282: }
3283:
3284: /* Defensive coding, double-check the psize fits in a struct prefix */
3285: if (psize > (ssize_t) sizeof(p.u))
3286: {
3287: plog_err (peer->log,
3288: "%s [Error] Update packet error"
3289: " (prefix length %u too large for prefix storage %zu!?!!",
3290: peer->host, p.prefixlen, sizeof(p.u));
3291: return -1;
3292: }
3293:
3294: /* Fetch prefix from NLRI packet. */
3295: memcpy (&p.u.prefix, pnt, psize);
3296:
3297: /* Check address. */
3298: if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3299: {
3300: if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3301: {
3302: /*
3303: * From RFC4271 Section 6.3:
3304: *
3305: * If a prefix in the NLRI field is semantically incorrect
3306: * (e.g., an unexpected multicast IP address), an error SHOULD
3307: * be logged locally, and the prefix SHOULD be ignored.
3308: */
3309: zlog (peer->log, LOG_ERR,
3310: "%s: IPv4 unicast NLRI is multicast address %s, ignoring",
3311: peer->host, inet_ntoa (p.u.prefix4));
3312: continue;
3313: }
3314: }
3315:
3316: /* Check address. */
3317: if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3318: {
3319: if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3320: {
3321: char buf[BUFSIZ];
3322:
3323: zlog (peer->log, LOG_ERR,
3324: "%s: IPv6 unicast NLRI is link-local address %s, ignoring",
3325: peer->host,
3326: inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3327: continue;
3328: }
3329: if (IN6_IS_ADDR_MULTICAST (&p.u.prefix6))
3330: {
3331: char buf[BUFSIZ];
3332:
3333: zlog (peer->log, LOG_ERR,
3334: "%s: IPv6 unicast NLRI is multicast address %s, ignoring",
3335: peer->host,
3336: inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3337: continue;
3338: }
3339: }
3340:
3341: /* Normal process. */
3342: if (attr)
3343: ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3344: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3345: else
3346: ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3347: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3348:
3349: /* Address family configuration mismatch or maximum-prefix count
3350: overflow. */
3351: if (ret < 0)
3352: return -1;
3353: }
3354:
3355: /* Packet length consistency check. */
3356: if (pnt != lim)
3357: {
3358: plog_err (peer->log,
3359: "%s [Error] Update packet error"
3360: " (prefix length mismatch with total length)",
3361: peer->host);
3362: return -1;
3363: }
3364:
3365: return 0;
3366: }
3367:
3368: static struct bgp_static *
3369: bgp_static_new (void)
3370: {
3371: return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
3372: }
3373:
3374: static void
3375: bgp_static_free (struct bgp_static *bgp_static)
3376: {
3377: if (bgp_static->rmap.name)
3378: free (bgp_static->rmap.name);
3379: XFREE (MTYPE_BGP_STATIC, bgp_static);
3380: }
3381:
3382: static void
3383: bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3384: struct prefix *p, afi_t afi, safi_t safi)
3385: {
3386: struct bgp_node *rn;
3387: struct bgp_info *ri;
3388:
3389: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3390:
3391: /* Check selected route and self inserted route. */
3392: for (ri = rn->info; ri; ri = ri->next)
3393: if (ri->peer == bgp->peer_self
3394: && ri->type == ZEBRA_ROUTE_BGP
3395: && ri->sub_type == BGP_ROUTE_STATIC)
3396: break;
3397:
3398: /* Withdraw static BGP route from routing table. */
3399: if (ri)
3400: {
3401: bgp_info_delete (rn, ri);
3402: bgp_process (bgp, rn, afi, safi);
3403: }
3404:
3405: /* Unlock bgp_node_lookup. */
3406: bgp_unlock_node (rn);
3407: }
3408:
3409: static void
3410: bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
3411: struct bgp_static *bgp_static,
3412: afi_t afi, safi_t safi)
3413: {
3414: struct bgp_node *rn;
3415: struct bgp_info *ri;
3416: struct bgp_info *new;
3417: struct bgp_info info;
3418: struct attr *attr_new;
3419: struct attr attr;
3420: struct attr new_attr;
3421: struct attr_extra new_extra;
3422: struct bgp *bgp;
3423: int ret;
3424: char buf[SU_ADDRSTRLEN];
3425:
3426: bgp = rsclient->bgp;
3427:
3428: assert (bgp_static);
3429: if (!bgp_static)
3430: return;
3431:
3432: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3433:
3434: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3435:
3436: attr.nexthop = bgp_static->igpnexthop;
3437: attr.med = bgp_static->igpmetric;
3438: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3439:
3440: if (bgp_static->atomic)
3441: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3442:
3443: /* Apply network route-map for export to this rsclient. */
3444: if (bgp_static->rmap.name)
3445: {
3446: struct attr attr_tmp = attr;
3447: info.peer = rsclient;
3448: info.attr = &attr_tmp;
3449:
3450: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3451: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3452:
3453: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3454:
3455: rsclient->rmap_type = 0;
3456:
3457: if (ret == RMAP_DENYMATCH)
3458: {
3459: /* Free uninterned attribute. */
3460: bgp_attr_flush (&attr_tmp);
3461:
3462: /* Unintern original. */
3463: aspath_unintern (&attr.aspath);
3464: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3465: bgp_attr_extra_free (&attr);
3466:
3467: return;
3468: }
3469: attr_new = bgp_attr_intern (&attr_tmp);
3470: }
3471: else
3472: attr_new = bgp_attr_intern (&attr);
3473:
3474: new_attr.extra = &new_extra;
3475: bgp_attr_dup(&new_attr, attr_new);
3476:
3477: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3478:
3479: if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3480: == RMAP_DENY)
3481: {
3482: /* This BGP update is filtered. Log the reason then update BGP entry. */
3483: if (BGP_DEBUG (update, UPDATE_IN))
3484: zlog (rsclient->log, LOG_DEBUG,
3485: "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3486: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3487: p->prefixlen, rsclient->host);
3488:
3489: bgp->peer_self->rmap_type = 0;
3490:
3491: bgp_attr_unintern (&attr_new);
3492: aspath_unintern (&attr.aspath);
3493: bgp_attr_extra_free (&attr);
3494:
3495: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3496:
3497: return;
3498: }
3499:
3500: bgp->peer_self->rmap_type = 0;
3501:
3502: bgp_attr_unintern (&attr_new);
3503: attr_new = bgp_attr_intern (&new_attr);
3504:
3505: for (ri = rn->info; ri; ri = ri->next)
3506: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3507: && ri->sub_type == BGP_ROUTE_STATIC)
3508: break;
3509:
3510: if (ri)
3511: {
3512: if (attrhash_cmp (ri->attr, attr_new) &&
3513: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3514: {
3515: bgp_unlock_node (rn);
3516: bgp_attr_unintern (&attr_new);
3517: aspath_unintern (&attr.aspath);
3518: bgp_attr_extra_free (&attr);
3519: return;
3520: }
3521: else
3522: {
3523: /* The attribute is changed. */
3524: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3525:
3526: /* Rewrite BGP route information. */
3527: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3528: bgp_info_restore(rn, ri);
3529: bgp_attr_unintern (&ri->attr);
3530: ri->attr = attr_new;
3531: ri->uptime = bgp_clock ();
3532:
3533: /* Process change. */
3534: bgp_process (bgp, rn, afi, safi);
3535: bgp_unlock_node (rn);
3536: aspath_unintern (&attr.aspath);
3537: bgp_attr_extra_free (&attr);
3538: return;
3539: }
3540: }
3541:
3542: /* Make new BGP info. */
3543: new = bgp_info_new ();
3544: new->type = ZEBRA_ROUTE_BGP;
3545: new->sub_type = BGP_ROUTE_STATIC;
3546: new->peer = bgp->peer_self;
3547: SET_FLAG (new->flags, BGP_INFO_VALID);
3548: new->attr = attr_new;
3549: new->uptime = bgp_clock ();
3550:
3551: /* Register new BGP information. */
3552: bgp_info_add (rn, new);
3553:
3554: /* route_node_get lock */
3555: bgp_unlock_node (rn);
3556:
3557: /* Process change. */
3558: bgp_process (bgp, rn, afi, safi);
3559:
3560: /* Unintern original. */
3561: aspath_unintern (&attr.aspath);
3562: bgp_attr_extra_free (&attr);
3563: }
3564:
3565: static void
3566: bgp_static_update_main (struct bgp *bgp, struct prefix *p,
3567: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3568: {
3569: struct bgp_node *rn;
3570: struct bgp_info *ri;
3571: struct bgp_info *new;
3572: struct bgp_info info;
3573: struct attr attr;
3574: struct attr *attr_new;
3575: int ret;
3576:
3577: assert (bgp_static);
3578: if (!bgp_static)
3579: return;
3580:
3581: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3582:
3583: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3584:
3585: attr.nexthop = bgp_static->igpnexthop;
3586: attr.med = bgp_static->igpmetric;
3587: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3588:
3589: if (bgp_static->atomic)
3590: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3591:
3592: /* Apply route-map. */
3593: if (bgp_static->rmap.name)
3594: {
3595: struct attr attr_tmp = attr;
3596: info.peer = bgp->peer_self;
3597: info.attr = &attr_tmp;
3598:
3599: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3600:
3601: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3602:
3603: bgp->peer_self->rmap_type = 0;
3604:
3605: if (ret == RMAP_DENYMATCH)
3606: {
3607: /* Free uninterned attribute. */
3608: bgp_attr_flush (&attr_tmp);
3609:
3610: /* Unintern original. */
3611: aspath_unintern (&attr.aspath);
3612: bgp_attr_extra_free (&attr);
3613: bgp_static_withdraw (bgp, p, afi, safi);
3614: return;
3615: }
3616: attr_new = bgp_attr_intern (&attr_tmp);
3617: }
3618: else
3619: attr_new = bgp_attr_intern (&attr);
3620:
3621: for (ri = rn->info; ri; ri = ri->next)
3622: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3623: && ri->sub_type == BGP_ROUTE_STATIC)
3624: break;
3625:
3626: if (ri)
3627: {
3628: if (attrhash_cmp (ri->attr, attr_new) &&
3629: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3630: {
3631: bgp_unlock_node (rn);
3632: bgp_attr_unintern (&attr_new);
3633: aspath_unintern (&attr.aspath);
3634: bgp_attr_extra_free (&attr);
3635: return;
3636: }
3637: else
3638: {
3639: /* The attribute is changed. */
3640: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3641:
3642: /* Rewrite BGP route information. */
3643: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3644: bgp_info_restore(rn, ri);
3645: else
3646: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3647: bgp_attr_unintern (&ri->attr);
3648: ri->attr = attr_new;
3649: ri->uptime = bgp_clock ();
3650:
3651: /* Process change. */
3652: bgp_aggregate_increment (bgp, p, ri, afi, safi);
3653: bgp_process (bgp, rn, afi, safi);
3654: bgp_unlock_node (rn);
3655: aspath_unintern (&attr.aspath);
3656: bgp_attr_extra_free (&attr);
3657: return;
3658: }
3659: }
3660:
3661: /* Make new BGP info. */
3662: new = bgp_info_new ();
3663: new->type = ZEBRA_ROUTE_BGP;
3664: new->sub_type = BGP_ROUTE_STATIC;
3665: new->peer = bgp->peer_self;
3666: SET_FLAG (new->flags, BGP_INFO_VALID);
3667: new->attr = attr_new;
3668: new->uptime = bgp_clock ();
3669:
3670: /* Aggregate address increment. */
3671: bgp_aggregate_increment (bgp, p, new, afi, safi);
3672:
3673: /* Register new BGP information. */
3674: bgp_info_add (rn, new);
3675:
3676: /* route_node_get lock */
3677: bgp_unlock_node (rn);
3678:
3679: /* Process change. */
3680: bgp_process (bgp, rn, afi, safi);
3681:
3682: /* Unintern original. */
3683: aspath_unintern (&attr.aspath);
3684: bgp_attr_extra_free (&attr);
3685: }
3686:
3687: void
3688: bgp_static_update (struct bgp *bgp, struct prefix *p,
3689: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3690: {
3691: struct peer *rsclient;
3692: struct listnode *node, *nnode;
3693:
3694: bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3695:
3696: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
3697: {
3698: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3699: bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
3700: }
3701: }
3702:
3703: void
3704: bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3705: safi_t safi)
3706: {
3707: struct bgp_node *rn;
3708: struct bgp_info *ri;
3709:
3710: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3711:
3712: /* Check selected route and self inserted route. */
3713: for (ri = rn->info; ri; ri = ri->next)
3714: if (ri->peer == bgp->peer_self
3715: && ri->type == ZEBRA_ROUTE_BGP
3716: && ri->sub_type == BGP_ROUTE_STATIC)
3717: break;
3718:
3719: /* Withdraw static BGP route from routing table. */
3720: if (ri)
3721: {
3722: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3723: bgp_info_delete (rn, ri);
3724: bgp_process (bgp, rn, afi, safi);
3725: }
3726:
3727: /* Unlock bgp_node_lookup. */
3728: bgp_unlock_node (rn);
3729: }
3730:
3731: void
3732: bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3733: {
3734: struct bgp_static *bgp_static;
3735: struct bgp *bgp;
3736: struct bgp_node *rn;
3737: struct prefix *p;
3738:
3739: bgp = rsclient->bgp;
3740:
3741: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3742: if ((bgp_static = rn->info) != NULL)
3743: {
3744: p = &rn->p;
3745:
3746: bgp_static_update_rsclient (rsclient, p, bgp_static,
3747: afi, safi);
3748: }
3749: }
3750:
3751: /*
3752: * Used for SAFI_MPLS_VPN and SAFI_ENCAP
3753: */
3754: static void
3755: bgp_static_withdraw_safi (struct bgp *bgp, struct prefix *p, afi_t afi,
3756: safi_t safi, struct prefix_rd *prd, u_char *tag)
3757: {
3758: struct bgp_node *rn;
3759: struct bgp_info *ri;
3760:
3761: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3762:
3763: /* Check selected route and self inserted route. */
3764: for (ri = rn->info; ri; ri = ri->next)
3765: if (ri->peer == bgp->peer_self
3766: && ri->type == ZEBRA_ROUTE_BGP
3767: && ri->sub_type == BGP_ROUTE_STATIC)
3768: break;
3769:
3770: /* Withdraw static BGP route from routing table. */
3771: if (ri)
3772: {
3773: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3774: bgp_info_delete (rn, ri);
3775: bgp_process (bgp, rn, afi, safi);
3776: }
3777:
3778: /* Unlock bgp_node_lookup. */
3779: bgp_unlock_node (rn);
3780: }
3781:
3782: static void
3783: bgp_static_update_safi (struct bgp *bgp, struct prefix *p,
3784: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3785: {
3786: struct bgp_node *rn;
3787: struct bgp_info *new;
3788: struct attr *attr_new;
3789: struct attr attr = { 0 };
3790: struct bgp_info *ri;
3791:
3792: assert (bgp_static);
3793:
3794: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, &bgp_static->prd);
3795:
3796: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3797:
3798: attr.nexthop = bgp_static->igpnexthop;
3799: attr.med = bgp_static->igpmetric;
3800: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3801:
3802: /* Apply route-map. */
3803: if (bgp_static->rmap.name)
3804: {
3805: struct attr attr_tmp = attr;
3806: struct bgp_info info;
3807: int ret;
3808:
3809: info.peer = bgp->peer_self;
3810: info.attr = &attr_tmp;
3811:
3812: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3813:
3814: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3815:
3816: bgp->peer_self->rmap_type = 0;
3817:
3818: if (ret == RMAP_DENYMATCH)
3819: {
3820: /* Free uninterned attribute. */
3821: bgp_attr_flush (&attr_tmp);
3822:
3823: /* Unintern original. */
3824: aspath_unintern (&attr.aspath);
3825: bgp_attr_extra_free (&attr);
3826: bgp_static_withdraw_safi (bgp, p, afi, safi, &bgp_static->prd,
3827: bgp_static->tag);
3828: return;
3829: }
3830:
3831: attr_new = bgp_attr_intern (&attr_tmp);
3832: }
3833: else
3834: {
3835: attr_new = bgp_attr_intern (&attr);
3836: }
3837:
3838: for (ri = rn->info; ri; ri = ri->next)
3839: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3840: && ri->sub_type == BGP_ROUTE_STATIC)
3841: break;
3842:
3843: if (ri)
3844: {
3845: if (attrhash_cmp (ri->attr, attr_new) &&
3846: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3847: {
3848: bgp_unlock_node (rn);
3849: bgp_attr_unintern (&attr_new);
3850: aspath_unintern (&attr.aspath);
3851: bgp_attr_extra_free (&attr);
3852: return;
3853: }
3854: else
3855: {
3856: /* The attribute is changed. */
3857: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3858:
3859: /* Rewrite BGP route information. */
3860: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3861: bgp_info_restore(rn, ri);
3862: else
3863: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3864: bgp_attr_unintern (&ri->attr);
3865: ri->attr = attr_new;
3866: ri->uptime = bgp_clock ();
3867:
3868: /* Process change. */
3869: bgp_aggregate_increment (bgp, p, ri, afi, safi);
3870: bgp_process (bgp, rn, afi, safi);
3871: bgp_unlock_node (rn);
3872: aspath_unintern (&attr.aspath);
3873: bgp_attr_extra_free (&attr);
3874: return;
3875: }
3876: }
3877:
3878:
3879: /* Make new BGP info. */
3880: new = bgp_info_new ();
3881: new->type = ZEBRA_ROUTE_BGP;
3882: new->sub_type = BGP_ROUTE_STATIC;
3883: new->peer = bgp->peer_self;
3884: new->attr = attr_new;
3885: SET_FLAG (new->flags, BGP_INFO_VALID);
3886: new->uptime = bgp_clock ();
3887: new->extra = bgp_info_extra_new();
3888: memcpy (new->extra->tag, bgp_static->tag, 3);
3889:
3890: /* Aggregate address increment. */
3891: bgp_aggregate_increment (bgp, p, new, afi, safi);
3892:
3893: /* Register new BGP information. */
3894: bgp_info_add (rn, new);
3895:
3896: /* route_node_get lock */
3897: bgp_unlock_node (rn);
3898:
3899: /* Process change. */
3900: bgp_process (bgp, rn, afi, safi);
3901:
3902: /* Unintern original. */
3903: aspath_unintern (&attr.aspath);
3904: bgp_attr_extra_free (&attr);
3905: }
3906:
3907: /* Configure static BGP network. When user don't run zebra, static
3908: route should be installed as valid. */
3909: static int
3910: bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
3911: afi_t afi, safi_t safi, const char *rmap, int backdoor)
3912: {
3913: int ret;
3914: struct prefix p;
3915: struct bgp_static *bgp_static;
3916: struct bgp_node *rn;
3917: u_char need_update = 0;
3918:
3919: /* Convert IP prefix string to struct prefix. */
3920: ret = str2prefix (ip_str, &p);
3921: if (! ret)
3922: {
3923: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3924: return CMD_WARNING;
3925: }
3926: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3927: {
3928: vty_out (vty, "%% Malformed prefix (link-local address)%s",
3929: VTY_NEWLINE);
3930: return CMD_WARNING;
3931: }
3932:
3933: apply_mask (&p);
3934:
3935: /* Set BGP static route configuration. */
3936: rn = bgp_node_get (bgp->route[afi][safi], &p);
3937:
3938: if (rn->info)
3939: {
3940: /* Configuration change. */
3941: bgp_static = rn->info;
3942:
3943: /* Check previous routes are installed into BGP. */
3944: if (bgp_static->valid && bgp_static->backdoor != backdoor)
3945: need_update = 1;
3946:
3947: bgp_static->backdoor = backdoor;
3948:
3949: if (rmap)
3950: {
3951: if (bgp_static->rmap.name)
3952: free (bgp_static->rmap.name);
3953: bgp_static->rmap.name = strdup (rmap);
3954: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3955: }
3956: else
3957: {
3958: if (bgp_static->rmap.name)
3959: free (bgp_static->rmap.name);
3960: bgp_static->rmap.name = NULL;
3961: bgp_static->rmap.map = NULL;
3962: bgp_static->valid = 0;
3963: }
3964: bgp_unlock_node (rn);
3965: }
3966: else
3967: {
3968: /* New configuration. */
3969: bgp_static = bgp_static_new ();
3970: bgp_static->backdoor = backdoor;
3971: bgp_static->valid = 0;
3972: bgp_static->igpmetric = 0;
3973: bgp_static->igpnexthop.s_addr = 0;
3974:
3975: if (rmap)
3976: {
3977: if (bgp_static->rmap.name)
3978: free (bgp_static->rmap.name);
3979: bgp_static->rmap.name = strdup (rmap);
3980: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3981: }
3982: rn->info = bgp_static;
3983: }
3984:
3985: /* If BGP scan is not enabled, we should install this route here. */
3986: if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3987: {
3988: bgp_static->valid = 1;
3989:
3990: if (need_update)
3991: bgp_static_withdraw (bgp, &p, afi, safi);
3992:
3993: if (! bgp_static->backdoor)
3994: bgp_static_update (bgp, &p, bgp_static, afi, safi);
3995: }
3996:
3997: return CMD_SUCCESS;
3998: }
3999:
4000: /* Configure static BGP network. */
4001: static int
4002: bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
4003: afi_t afi, safi_t safi)
4004: {
4005: int ret;
4006: struct prefix p;
4007: struct bgp_static *bgp_static;
4008: struct bgp_node *rn;
4009:
4010: /* Convert IP prefix string to struct prefix. */
4011: ret = str2prefix (ip_str, &p);
4012: if (! ret)
4013: {
4014: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
4015: return CMD_WARNING;
4016: }
4017: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
4018: {
4019: vty_out (vty, "%% Malformed prefix (link-local address)%s",
4020: VTY_NEWLINE);
4021: return CMD_WARNING;
4022: }
4023:
4024: apply_mask (&p);
4025:
4026: rn = bgp_node_lookup (bgp->route[afi][safi], &p);
4027: if (! rn)
4028: {
4029: vty_out (vty, "%% Can't find specified static route configuration.%s",
4030: VTY_NEWLINE);
4031: return CMD_WARNING;
4032: }
4033:
4034: bgp_static = rn->info;
4035:
4036: /* Update BGP RIB. */
4037: if (! bgp_static->backdoor)
4038: bgp_static_withdraw (bgp, &p, afi, safi);
4039:
4040: /* Clear configuration. */
4041: bgp_static_free (bgp_static);
4042: rn->info = NULL;
4043: bgp_unlock_node (rn);
4044: bgp_unlock_node (rn);
4045:
4046: return CMD_SUCCESS;
4047: }
4048:
4049: /* Called from bgp_delete(). Delete all static routes from the BGP
4050: instance. */
4051: void
4052: bgp_static_delete (struct bgp *bgp)
4053: {
4054: afi_t afi;
4055: safi_t safi;
4056: struct bgp_node *rn;
4057: struct bgp_node *rm;
4058: struct bgp_table *table;
4059: struct bgp_static *bgp_static;
4060:
4061: for (afi = AFI_IP; afi < AFI_MAX; afi++)
4062: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
4063: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
4064: if (rn->info != NULL)
4065: {
4066: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
4067: {
4068: table = rn->info;
4069:
4070: for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
4071: {
4072: bgp_static = rn->info;
4073: bgp_static_withdraw_safi (bgp, &rm->p,
4074: AFI_IP, safi,
4075: (struct prefix_rd *)&rn->p,
4076: bgp_static->tag);
4077: bgp_static_free (bgp_static);
4078: rn->info = NULL;
4079: bgp_unlock_node (rn);
4080: }
4081: }
4082: else
4083: {
4084: bgp_static = rn->info;
4085: bgp_static_withdraw (bgp, &rn->p, afi, safi);
4086: bgp_static_free (bgp_static);
4087: rn->info = NULL;
4088: bgp_unlock_node (rn);
4089: }
4090: }
4091: }
4092:
4093: /*
4094: * gpz 110624
4095: * Currently this is used to set static routes for VPN and ENCAP.
4096: * I think it can probably be factored with bgp_static_set.
4097: */
4098: int
4099: bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str,
4100: const char *rd_str, const char *tag_str,
4101: const char *rmap_str)
4102: {
4103: int ret;
4104: struct prefix p;
4105: struct prefix_rd prd;
4106: struct bgp *bgp;
4107: struct bgp_node *prn;
4108: struct bgp_node *rn;
4109: struct bgp_table *table;
4110: struct bgp_static *bgp_static;
4111: u_char tag[3];
4112:
4113: bgp = vty->index;
4114:
4115: ret = str2prefix (ip_str, &p);
4116: if (! ret)
4117: {
4118: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
4119: return CMD_WARNING;
4120: }
4121: apply_mask (&p);
4122:
4123: ret = str2prefix_rd (rd_str, &prd);
4124: if (! ret)
4125: {
4126: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
4127: return CMD_WARNING;
4128: }
4129:
4130: ret = str2tag (tag_str, tag);
4131: if (! ret)
4132: {
4133: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
4134: return CMD_WARNING;
4135: }
4136:
4137: prn = bgp_node_get (bgp->route[AFI_IP][safi],
4138: (struct prefix *)&prd);
4139: if (prn->info == NULL)
4140: prn->info = bgp_table_init (AFI_IP, safi);
4141: else
4142: bgp_unlock_node (prn);
4143: table = prn->info;
4144:
4145: rn = bgp_node_get (table, &p);
4146:
4147: if (rn->info)
4148: {
4149: vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
4150: bgp_unlock_node (rn);
4151: }
4152: else
4153: {
4154: /* New configuration. */
4155: bgp_static = bgp_static_new ();
4156: bgp_static->backdoor = 0;
4157: bgp_static->valid = 0;
4158: bgp_static->igpmetric = 0;
4159: bgp_static->igpnexthop.s_addr = 0;
4160: memcpy(bgp_static->tag, tag, 3);
4161: bgp_static->prd = prd;
4162:
4163: if (rmap_str)
4164: {
4165: if (bgp_static->rmap.name)
4166: free (bgp_static->rmap.name);
4167: bgp_static->rmap.name = strdup (rmap_str);
4168: bgp_static->rmap.map = route_map_lookup_by_name (rmap_str);
4169: }
4170: rn->info = bgp_static;
4171:
4172: bgp_static->valid = 1;
4173: bgp_static_update_safi (bgp, &p, bgp_static, AFI_IP, safi);
4174: }
4175:
4176: return CMD_SUCCESS;
4177: }
4178:
4179: /* Configure static BGP network. */
4180: int
4181: bgp_static_unset_safi(safi_t safi, struct vty *vty, const char *ip_str,
4182: const char *rd_str, const char *tag_str)
4183: {
4184: int ret;
4185: struct bgp *bgp;
4186: struct prefix p;
4187: struct prefix_rd prd;
4188: struct bgp_node *prn;
4189: struct bgp_node *rn;
4190: struct bgp_table *table;
4191: struct bgp_static *bgp_static;
4192: u_char tag[3];
4193:
4194: bgp = vty->index;
4195:
4196: /* Convert IP prefix string to struct prefix. */
4197: ret = str2prefix (ip_str, &p);
4198: if (! ret)
4199: {
4200: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
4201: return CMD_WARNING;
4202: }
4203: apply_mask (&p);
4204:
4205: ret = str2prefix_rd (rd_str, &prd);
4206: if (! ret)
4207: {
4208: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
4209: return CMD_WARNING;
4210: }
4211:
4212: ret = str2tag (tag_str, tag);
4213: if (! ret)
4214: {
4215: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
4216: return CMD_WARNING;
4217: }
4218:
4219: prn = bgp_node_get (bgp->route[AFI_IP][safi],
4220: (struct prefix *)&prd);
4221: if (prn->info == NULL)
4222: prn->info = bgp_table_init (AFI_IP, safi);
4223: else
4224: bgp_unlock_node (prn);
4225: table = prn->info;
4226:
4227: rn = bgp_node_lookup (table, &p);
4228:
4229: if (rn)
4230: {
4231: bgp_static_withdraw_safi (bgp, &p, AFI_IP, safi, &prd, tag);
4232:
4233: bgp_static = rn->info;
4234: bgp_static_free (bgp_static);
4235: rn->info = NULL;
4236: bgp_unlock_node (rn);
4237: bgp_unlock_node (rn);
4238: }
4239: else
4240: vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
4241:
4242: return CMD_SUCCESS;
4243: }
4244:
4245: DEFUN (bgp_network,
4246: bgp_network_cmd,
4247: "network A.B.C.D/M",
4248: "Specify a network to announce via BGP\n"
4249: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4250: {
4251: return bgp_static_set (vty, vty->index, argv[0],
4252: AFI_IP, bgp_node_safi (vty), NULL, 0);
4253: }
4254:
4255: DEFUN (bgp_network_route_map,
4256: bgp_network_route_map_cmd,
4257: "network A.B.C.D/M route-map WORD",
4258: "Specify a network to announce via BGP\n"
4259: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4260: "Route-map to modify the attributes\n"
4261: "Name of the route map\n")
4262: {
4263: return bgp_static_set (vty, vty->index, argv[0],
4264: AFI_IP, bgp_node_safi (vty), argv[1], 0);
4265: }
4266:
4267: DEFUN (bgp_network_backdoor,
4268: bgp_network_backdoor_cmd,
4269: "network A.B.C.D/M backdoor",
4270: "Specify a network to announce via BGP\n"
4271: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4272: "Specify a BGP backdoor route\n")
4273: {
4274: return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
4275: NULL, 1);
4276: }
4277:
4278: DEFUN (bgp_network_mask,
4279: bgp_network_mask_cmd,
4280: "network A.B.C.D mask A.B.C.D",
4281: "Specify a network to announce via BGP\n"
4282: "Network number\n"
4283: "Network mask\n"
4284: "Network mask\n")
4285: {
4286: int ret;
4287: char prefix_str[BUFSIZ];
4288:
4289: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4290: if (! ret)
4291: {
4292: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4293: return CMD_WARNING;
4294: }
4295:
4296: return bgp_static_set (vty, vty->index, prefix_str,
4297: AFI_IP, bgp_node_safi (vty), NULL, 0);
4298: }
4299:
4300: DEFUN (bgp_network_mask_route_map,
4301: bgp_network_mask_route_map_cmd,
4302: "network A.B.C.D mask A.B.C.D route-map WORD",
4303: "Specify a network to announce via BGP\n"
4304: "Network number\n"
4305: "Network mask\n"
4306: "Network mask\n"
4307: "Route-map to modify the attributes\n"
4308: "Name of the route map\n")
4309: {
4310: int ret;
4311: char prefix_str[BUFSIZ];
4312:
4313: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4314: if (! ret)
4315: {
4316: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4317: return CMD_WARNING;
4318: }
4319:
4320: return bgp_static_set (vty, vty->index, prefix_str,
4321: AFI_IP, bgp_node_safi (vty), argv[2], 0);
4322: }
4323:
4324: DEFUN (bgp_network_mask_backdoor,
4325: bgp_network_mask_backdoor_cmd,
4326: "network A.B.C.D mask A.B.C.D backdoor",
4327: "Specify a network to announce via BGP\n"
4328: "Network number\n"
4329: "Network mask\n"
4330: "Network mask\n"
4331: "Specify a BGP backdoor route\n")
4332: {
4333: int ret;
4334: char prefix_str[BUFSIZ];
4335:
4336: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4337: if (! ret)
4338: {
4339: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4340: return CMD_WARNING;
4341: }
4342:
4343: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4344: NULL, 1);
4345: }
4346:
4347: DEFUN (bgp_network_mask_natural,
4348: bgp_network_mask_natural_cmd,
4349: "network A.B.C.D",
4350: "Specify a network to announce via BGP\n"
4351: "Network number\n")
4352: {
4353: int ret;
4354: char prefix_str[BUFSIZ];
4355:
4356: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4357: if (! ret)
4358: {
4359: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4360: return CMD_WARNING;
4361: }
4362:
4363: return bgp_static_set (vty, vty->index, prefix_str,
4364: AFI_IP, bgp_node_safi (vty), NULL, 0);
4365: }
4366:
4367: DEFUN (bgp_network_mask_natural_route_map,
4368: bgp_network_mask_natural_route_map_cmd,
4369: "network A.B.C.D route-map WORD",
4370: "Specify a network to announce via BGP\n"
4371: "Network number\n"
4372: "Route-map to modify the attributes\n"
4373: "Name of the route map\n")
4374: {
4375: int ret;
4376: char prefix_str[BUFSIZ];
4377:
4378: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4379: if (! ret)
4380: {
4381: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4382: return CMD_WARNING;
4383: }
4384:
4385: return bgp_static_set (vty, vty->index, prefix_str,
4386: AFI_IP, bgp_node_safi (vty), argv[1], 0);
4387: }
4388:
4389: DEFUN (bgp_network_mask_natural_backdoor,
4390: bgp_network_mask_natural_backdoor_cmd,
4391: "network A.B.C.D backdoor",
4392: "Specify a network to announce via BGP\n"
4393: "Network number\n"
4394: "Specify a BGP backdoor route\n")
4395: {
4396: int ret;
4397: char prefix_str[BUFSIZ];
4398:
4399: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4400: if (! ret)
4401: {
4402: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4403: return CMD_WARNING;
4404: }
4405:
4406: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4407: NULL, 1);
4408: }
4409:
4410: DEFUN (no_bgp_network,
4411: no_bgp_network_cmd,
4412: "no network A.B.C.D/M",
4413: NO_STR
4414: "Specify a network to announce via BGP\n"
4415: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4416: {
4417: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4418: bgp_node_safi (vty));
4419: }
4420:
4421: ALIAS (no_bgp_network,
4422: no_bgp_network_route_map_cmd,
4423: "no network A.B.C.D/M route-map WORD",
4424: NO_STR
4425: "Specify a network to announce via BGP\n"
4426: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4427: "Route-map to modify the attributes\n"
4428: "Name of the route map\n")
4429:
4430: ALIAS (no_bgp_network,
4431: no_bgp_network_backdoor_cmd,
4432: "no network A.B.C.D/M backdoor",
4433: NO_STR
4434: "Specify a network to announce via BGP\n"
4435: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4436: "Specify a BGP backdoor route\n")
4437:
4438: DEFUN (no_bgp_network_mask,
4439: no_bgp_network_mask_cmd,
4440: "no network A.B.C.D mask A.B.C.D",
4441: NO_STR
4442: "Specify a network to announce via BGP\n"
4443: "Network number\n"
4444: "Network mask\n"
4445: "Network mask\n")
4446: {
4447: int ret;
4448: char prefix_str[BUFSIZ];
4449:
4450: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4451: if (! ret)
4452: {
4453: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4454: return CMD_WARNING;
4455: }
4456:
4457: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4458: bgp_node_safi (vty));
4459: }
4460:
4461: ALIAS (no_bgp_network_mask,
4462: no_bgp_network_mask_route_map_cmd,
4463: "no network A.B.C.D mask A.B.C.D route-map WORD",
4464: NO_STR
4465: "Specify a network to announce via BGP\n"
4466: "Network number\n"
4467: "Network mask\n"
4468: "Network mask\n"
4469: "Route-map to modify the attributes\n"
4470: "Name of the route map\n")
4471:
4472: ALIAS (no_bgp_network_mask,
4473: no_bgp_network_mask_backdoor_cmd,
4474: "no network A.B.C.D mask A.B.C.D backdoor",
4475: NO_STR
4476: "Specify a network to announce via BGP\n"
4477: "Network number\n"
4478: "Network mask\n"
4479: "Network mask\n"
4480: "Specify a BGP backdoor route\n")
4481:
4482: DEFUN (no_bgp_network_mask_natural,
4483: no_bgp_network_mask_natural_cmd,
4484: "no network A.B.C.D",
4485: NO_STR
4486: "Specify a network to announce via BGP\n"
4487: "Network number\n")
4488: {
4489: int ret;
4490: char prefix_str[BUFSIZ];
4491:
4492: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4493: if (! ret)
4494: {
4495: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4496: return CMD_WARNING;
4497: }
4498:
4499: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4500: bgp_node_safi (vty));
4501: }
4502:
4503: ALIAS (no_bgp_network_mask_natural,
4504: no_bgp_network_mask_natural_route_map_cmd,
4505: "no network A.B.C.D route-map WORD",
4506: NO_STR
4507: "Specify a network to announce via BGP\n"
4508: "Network number\n"
4509: "Route-map to modify the attributes\n"
4510: "Name of the route map\n")
4511:
4512: ALIAS (no_bgp_network_mask_natural,
4513: no_bgp_network_mask_natural_backdoor_cmd,
4514: "no network A.B.C.D backdoor",
4515: NO_STR
4516: "Specify a network to announce via BGP\n"
4517: "Network number\n"
4518: "Specify a BGP backdoor route\n")
4519:
4520: DEFUN (ipv6_bgp_network,
4521: ipv6_bgp_network_cmd,
4522: "network X:X::X:X/M",
4523: "Specify a network to announce via BGP\n"
4524: "IPv6 prefix <network>/<length>\n")
4525: {
4526: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty),
4527: NULL, 0);
4528: }
4529:
4530: DEFUN (ipv6_bgp_network_route_map,
4531: ipv6_bgp_network_route_map_cmd,
4532: "network X:X::X:X/M route-map WORD",
4533: "Specify a network to announce via BGP\n"
4534: "IPv6 prefix <network>/<length>\n"
4535: "Route-map to modify the attributes\n"
4536: "Name of the route map\n")
4537: {
4538: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
4539: bgp_node_safi (vty), argv[1], 0);
4540: }
4541:
4542: DEFUN (no_ipv6_bgp_network,
4543: no_ipv6_bgp_network_cmd,
4544: "no network X:X::X:X/M",
4545: NO_STR
4546: "Specify a network to announce via BGP\n"
4547: "IPv6 prefix <network>/<length>\n")
4548: {
4549: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, bgp_node_safi(vty));
4550: }
4551:
4552: ALIAS (no_ipv6_bgp_network,
4553: no_ipv6_bgp_network_route_map_cmd,
4554: "no network X:X::X:X/M route-map WORD",
4555: NO_STR
4556: "Specify a network to announce via BGP\n"
4557: "IPv6 prefix <network>/<length>\n"
4558: "Route-map to modify the attributes\n"
4559: "Name of the route map\n")
4560:
4561: ALIAS (ipv6_bgp_network,
4562: old_ipv6_bgp_network_cmd,
4563: "ipv6 bgp network X:X::X:X/M",
4564: IPV6_STR
4565: BGP_STR
4566: "Specify a network to announce via BGP\n"
4567: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4568:
4569: ALIAS (no_ipv6_bgp_network,
4570: old_no_ipv6_bgp_network_cmd,
4571: "no ipv6 bgp network X:X::X:X/M",
4572: NO_STR
4573: IPV6_STR
4574: BGP_STR
4575: "Specify a network to announce via BGP\n"
4576: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4577:
4578: /* stubs for removed AS-Pathlimit commands, kept for config compatibility */
4579: ALIAS_DEPRECATED (bgp_network,
4580: bgp_network_ttl_cmd,
4581: "network A.B.C.D/M pathlimit <0-255>",
4582: "Specify a network to announce via BGP\n"
4583: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4584: "AS-Path hopcount limit attribute\n"
4585: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4586: ALIAS_DEPRECATED (bgp_network_backdoor,
4587: bgp_network_backdoor_ttl_cmd,
4588: "network A.B.C.D/M backdoor pathlimit <0-255>",
4589: "Specify a network to announce via BGP\n"
4590: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4591: "Specify a BGP backdoor route\n"
4592: "AS-Path hopcount limit attribute\n"
4593: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4594: ALIAS_DEPRECATED (bgp_network_mask,
4595: bgp_network_mask_ttl_cmd,
4596: "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4597: "Specify a network to announce via BGP\n"
4598: "Network number\n"
4599: "Network mask\n"
4600: "Network mask\n"
4601: "AS-Path hopcount limit attribute\n"
4602: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4603: ALIAS_DEPRECATED (bgp_network_mask_backdoor,
4604: bgp_network_mask_backdoor_ttl_cmd,
4605: "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4606: "Specify a network to announce via BGP\n"
4607: "Network number\n"
4608: "Network mask\n"
4609: "Network mask\n"
4610: "Specify a BGP backdoor route\n"
4611: "AS-Path hopcount limit attribute\n"
4612: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4613: ALIAS_DEPRECATED (bgp_network_mask_natural,
4614: bgp_network_mask_natural_ttl_cmd,
4615: "network A.B.C.D pathlimit <0-255>",
4616: "Specify a network to announce via BGP\n"
4617: "Network number\n"
4618: "AS-Path hopcount limit attribute\n"
4619: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4620: ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
4621: bgp_network_mask_natural_backdoor_ttl_cmd,
4622: "network A.B.C.D backdoor pathlimit <1-255>",
4623: "Specify a network to announce via BGP\n"
4624: "Network number\n"
4625: "Specify a BGP backdoor route\n"
4626: "AS-Path hopcount limit attribute\n"
4627: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4628: ALIAS_DEPRECATED (no_bgp_network,
4629: no_bgp_network_ttl_cmd,
4630: "no network A.B.C.D/M pathlimit <0-255>",
4631: NO_STR
4632: "Specify a network to announce via BGP\n"
4633: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4634: "AS-Path hopcount limit attribute\n"
4635: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4636: ALIAS_DEPRECATED (no_bgp_network,
4637: no_bgp_network_backdoor_ttl_cmd,
4638: "no network A.B.C.D/M backdoor pathlimit <0-255>",
4639: NO_STR
4640: "Specify a network to announce via BGP\n"
4641: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4642: "Specify a BGP backdoor route\n"
4643: "AS-Path hopcount limit attribute\n"
4644: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4645: ALIAS_DEPRECATED (no_bgp_network,
4646: no_bgp_network_mask_ttl_cmd,
4647: "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4648: NO_STR
4649: "Specify a network to announce via BGP\n"
4650: "Network number\n"
4651: "Network mask\n"
4652: "Network mask\n"
4653: "AS-Path hopcount limit attribute\n"
4654: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4655: ALIAS_DEPRECATED (no_bgp_network_mask,
4656: no_bgp_network_mask_backdoor_ttl_cmd,
4657: "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4658: NO_STR
4659: "Specify a network to announce via BGP\n"
4660: "Network number\n"
4661: "Network mask\n"
4662: "Network mask\n"
4663: "Specify a BGP backdoor route\n"
4664: "AS-Path hopcount limit attribute\n"
4665: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4666: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4667: no_bgp_network_mask_natural_ttl_cmd,
4668: "no network A.B.C.D pathlimit <0-255>",
4669: NO_STR
4670: "Specify a network to announce via BGP\n"
4671: "Network number\n"
4672: "AS-Path hopcount limit attribute\n"
4673: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4674: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4675: no_bgp_network_mask_natural_backdoor_ttl_cmd,
4676: "no network A.B.C.D backdoor pathlimit <0-255>",
4677: NO_STR
4678: "Specify a network to announce via BGP\n"
4679: "Network number\n"
4680: "Specify a BGP backdoor route\n"
4681: "AS-Path hopcount limit attribute\n"
4682: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4683: ALIAS_DEPRECATED (ipv6_bgp_network,
4684: ipv6_bgp_network_ttl_cmd,
4685: "network X:X::X:X/M pathlimit <0-255>",
4686: "Specify a network to announce via BGP\n"
4687: "IPv6 prefix <network>/<length>\n"
4688: "AS-Path hopcount limit attribute\n"
4689: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4690: ALIAS_DEPRECATED (no_ipv6_bgp_network,
4691: no_ipv6_bgp_network_ttl_cmd,
4692: "no network X:X::X:X/M pathlimit <0-255>",
4693: NO_STR
4694: "Specify a network to announce via BGP\n"
4695: "IPv6 prefix <network>/<length>\n"
4696: "AS-Path hopcount limit attribute\n"
4697: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4698:
4699: /* Aggreagete address:
4700:
4701: advertise-map Set condition to advertise attribute
4702: as-set Generate AS set path information
4703: attribute-map Set attributes of aggregate
4704: route-map Set parameters of aggregate
4705: summary-only Filter more specific routes from updates
4706: suppress-map Conditionally filter more specific routes from updates
4707: <cr>
4708: */
4709: struct bgp_aggregate
4710: {
4711: /* Summary-only flag. */
4712: u_char summary_only;
4713:
4714: /* AS set generation. */
4715: u_char as_set;
4716:
4717: /* Route-map for aggregated route. */
4718: struct route_map *map;
4719:
4720: /* Suppress-count. */
4721: unsigned long count;
4722:
4723: /* SAFI configuration. */
4724: safi_t safi;
4725: };
4726:
4727: static struct bgp_aggregate *
4728: bgp_aggregate_new (void)
4729: {
4730: return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
4731: }
4732:
4733: static void
4734: bgp_aggregate_free (struct bgp_aggregate *aggregate)
4735: {
4736: XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4737: }
4738:
4739: static void
4740: bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4741: afi_t afi, safi_t safi, struct bgp_info *del,
4742: struct bgp_aggregate *aggregate)
4743: {
4744: struct bgp_table *table;
4745: struct bgp_node *top;
4746: struct bgp_node *rn;
4747: u_char origin;
4748: struct aspath *aspath = NULL;
4749: struct aspath *asmerge = NULL;
4750: struct community *community = NULL;
4751: struct community *commerge = NULL;
4752: struct bgp_info *ri;
4753: struct bgp_info *new;
4754: int first = 1;
4755: unsigned long match = 0;
4756:
4757: /* ORIGIN attribute: If at least one route among routes that are
4758: aggregated has ORIGIN with the value INCOMPLETE, then the
4759: aggregated route must have the ORIGIN attribute with the value
4760: INCOMPLETE. Otherwise, if at least one route among routes that
4761: are aggregated has ORIGIN with the value EGP, then the aggregated
4762: route must have the origin attribute with the value EGP. In all
4763: other case the value of the ORIGIN attribute of the aggregated
4764: route is INTERNAL. */
4765: origin = BGP_ORIGIN_IGP;
4766:
4767: table = bgp->rib[afi][safi];
4768:
4769: top = bgp_node_get (table, p);
4770: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4771: if (rn->p.prefixlen > p->prefixlen)
4772: {
4773: match = 0;
4774:
4775: for (ri = rn->info; ri; ri = ri->next)
4776: {
4777: if (BGP_INFO_HOLDDOWN (ri))
4778: continue;
4779:
4780: if (del && ri == del)
4781: continue;
4782:
4783: if (! rinew && first)
4784: first = 0;
4785:
4786: #ifdef AGGREGATE_NEXTHOP_CHECK
4787: if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4788: || ri->attr->med != med)
4789: {
4790: if (aspath)
4791: aspath_free (aspath);
4792: if (community)
4793: community_free (community);
4794: bgp_unlock_node (rn);
4795: bgp_unlock_node (top);
4796: return;
4797: }
4798: #endif /* AGGREGATE_NEXTHOP_CHECK */
4799:
4800: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4801: {
4802: if (aggregate->summary_only)
4803: {
4804: (bgp_info_extra_get (ri))->suppress++;
4805: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4806: match++;
4807: }
4808:
4809: aggregate->count++;
4810:
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: }
4839: }
4840: if (match)
4841: bgp_process (bgp, rn, afi, safi);
4842: }
4843: bgp_unlock_node (top);
4844:
4845: if (rinew)
4846: {
4847: aggregate->count++;
4848:
4849: if (aggregate->summary_only)
4850: (bgp_info_extra_get (rinew))->suppress++;
4851:
4852: if (aggregate->as_set)
4853: {
4854: if (origin < rinew->attr->origin)
4855: origin = rinew->attr->origin;
4856:
4857: if (aspath)
4858: {
4859: asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4860: aspath_free (aspath);
4861: aspath = asmerge;
4862: }
4863: else
4864: aspath = aspath_dup (rinew->attr->aspath);
4865:
4866: if (rinew->attr->community)
4867: {
4868: if (community)
4869: {
4870: commerge = community_merge (community,
4871: rinew->attr->community);
4872: community = community_uniq_sort (commerge);
4873: community_free (commerge);
4874: }
4875: else
4876: community = community_dup (rinew->attr->community);
4877: }
4878: }
4879: }
4880:
4881: if (aggregate->count > 0)
4882: {
4883: rn = bgp_node_get (table, p);
4884: new = bgp_info_new ();
4885: new->type = ZEBRA_ROUTE_BGP;
4886: new->sub_type = BGP_ROUTE_AGGREGATE;
4887: new->peer = bgp->peer_self;
4888: SET_FLAG (new->flags, BGP_INFO_VALID);
4889: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4890: new->uptime = bgp_clock ();
4891:
4892: bgp_info_add (rn, new);
4893: bgp_unlock_node (rn);
4894: bgp_process (bgp, rn, afi, safi);
4895: }
4896: else
4897: {
4898: if (aspath)
4899: aspath_free (aspath);
4900: if (community)
4901: community_free (community);
4902: }
4903: }
4904:
4905: void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4906: struct bgp_aggregate *);
4907:
4908: void
4909: bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4910: struct bgp_info *ri, afi_t afi, safi_t safi)
4911: {
4912: struct bgp_node *child;
4913: struct bgp_node *rn;
4914: struct bgp_aggregate *aggregate;
4915: struct bgp_table *table;
4916:
4917: /* MPLS-VPN aggregation is not yet supported. */
4918: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
4919: return;
4920:
4921: table = bgp->aggregate[afi][safi];
4922:
4923: /* No aggregates configured. */
4924: if (bgp_table_top_nolock (table) == NULL)
4925: return;
4926:
4927: if (p->prefixlen == 0)
4928: return;
4929:
4930: if (BGP_INFO_HOLDDOWN (ri))
4931: return;
4932:
4933: child = bgp_node_get (table, p);
4934:
4935: /* Aggregate address configuration check. */
4936: for (rn = child; rn; rn = bgp_node_parent_nolock (rn))
4937: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4938: {
4939: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4940: bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
4941: }
4942: bgp_unlock_node (child);
4943: }
4944:
4945: void
4946: bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4947: struct bgp_info *del, afi_t afi, safi_t safi)
4948: {
4949: struct bgp_node *child;
4950: struct bgp_node *rn;
4951: struct bgp_aggregate *aggregate;
4952: struct bgp_table *table;
4953:
4954: /* MPLS-VPN aggregation is not yet supported. */
4955: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
4956: return;
4957:
4958: table = bgp->aggregate[afi][safi];
4959:
4960: /* No aggregates configured. */
4961: if (bgp_table_top_nolock (table) == NULL)
4962: return;
4963:
4964: if (p->prefixlen == 0)
4965: return;
4966:
4967: child = bgp_node_get (table, p);
4968:
4969: /* Aggregate address configuration check. */
4970: for (rn = child; rn; rn = bgp_node_parent_nolock (rn))
4971: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4972: {
4973: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4974: bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
4975: }
4976: bgp_unlock_node (child);
4977: }
4978:
4979: static void
4980: bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4981: struct bgp_aggregate *aggregate)
4982: {
4983: struct bgp_table *table;
4984: struct bgp_node *top;
4985: struct bgp_node *rn;
4986: struct bgp_info *new;
4987: struct bgp_info *ri;
4988: unsigned long match;
4989: u_char origin = BGP_ORIGIN_IGP;
4990: struct aspath *aspath = NULL;
4991: struct aspath *asmerge = NULL;
4992: struct community *community = NULL;
4993: struct community *commerge = NULL;
4994:
4995: table = bgp->rib[afi][safi];
4996:
4997: /* Sanity check. */
4998: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4999: return;
5000: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
5001: return;
5002:
5003: /* If routes exists below this node, generate aggregate routes. */
5004: top = bgp_node_get (table, p);
5005: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
5006: if (rn->p.prefixlen > p->prefixlen)
5007: {
5008: match = 0;
5009:
5010: for (ri = rn->info; ri; ri = ri->next)
5011: {
5012: if (BGP_INFO_HOLDDOWN (ri))
5013: continue;
5014:
5015: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
5016: {
5017: /* summary-only aggregate route suppress aggregated
5018: route announcement. */
5019: if (aggregate->summary_only)
5020: {
5021: (bgp_info_extra_get (ri))->suppress++;
5022: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
5023: match++;
5024: }
5025: /* as-set aggregate route generate origin, as path,
5026: community aggregation. */
5027: if (aggregate->as_set)
5028: {
5029: if (origin < ri->attr->origin)
5030: origin = ri->attr->origin;
5031:
5032: if (aspath)
5033: {
5034: asmerge = aspath_aggregate (aspath, ri->attr->aspath);
5035: aspath_free (aspath);
5036: aspath = asmerge;
5037: }
5038: else
5039: aspath = aspath_dup (ri->attr->aspath);
5040:
5041: if (ri->attr->community)
5042: {
5043: if (community)
5044: {
5045: commerge = community_merge (community,
5046: ri->attr->community);
5047: community = community_uniq_sort (commerge);
5048: community_free (commerge);
5049: }
5050: else
5051: community = community_dup (ri->attr->community);
5052: }
5053: }
5054: aggregate->count++;
5055: }
5056: }
5057:
5058: /* If this node is suppressed, process the change. */
5059: if (match)
5060: bgp_process (bgp, rn, afi, safi);
5061: }
5062: bgp_unlock_node (top);
5063:
5064: /* Add aggregate route to BGP table. */
5065: if (aggregate->count)
5066: {
5067: rn = bgp_node_get (table, p);
5068:
5069: new = bgp_info_new ();
5070: new->type = ZEBRA_ROUTE_BGP;
5071: new->sub_type = BGP_ROUTE_AGGREGATE;
5072: new->peer = bgp->peer_self;
5073: SET_FLAG (new->flags, BGP_INFO_VALID);
5074: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
5075: new->uptime = bgp_clock ();
5076:
5077: bgp_info_add (rn, new);
5078: bgp_unlock_node (rn);
5079:
5080: /* Process change. */
5081: bgp_process (bgp, rn, afi, safi);
5082: }
5083: else
5084: {
5085: if (aspath)
5086: aspath_free (aspath);
5087: if (community)
5088: community_free (community);
5089: }
5090: }
5091:
5092: void
5093: bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
5094: safi_t safi, struct bgp_aggregate *aggregate)
5095: {
5096: struct bgp_table *table;
5097: struct bgp_node *top;
5098: struct bgp_node *rn;
5099: struct bgp_info *ri;
5100: unsigned long match;
5101:
5102: table = bgp->rib[afi][safi];
5103:
5104: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
5105: return;
5106: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
5107: return;
5108:
5109: /* If routes exists below this node, generate aggregate routes. */
5110: top = bgp_node_get (table, p);
5111: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
5112: if (rn->p.prefixlen > p->prefixlen)
5113: {
5114: match = 0;
5115:
5116: for (ri = rn->info; ri; ri = ri->next)
5117: {
5118: if (BGP_INFO_HOLDDOWN (ri))
5119: continue;
5120:
5121: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
5122: {
5123: if (aggregate->summary_only && ri->extra)
5124: {
5125: ri->extra->suppress--;
5126:
5127: if (ri->extra->suppress == 0)
5128: {
5129: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
5130: match++;
5131: }
5132: }
5133: aggregate->count--;
5134: }
5135: }
5136:
5137: /* If this node was suppressed, process the change. */
5138: if (match)
5139: bgp_process (bgp, rn, afi, safi);
5140: }
5141: bgp_unlock_node (top);
5142:
5143: /* Delete aggregate route from BGP table. */
5144: rn = bgp_node_get (table, p);
5145:
5146: for (ri = rn->info; ri; ri = ri->next)
5147: if (ri->peer == bgp->peer_self
5148: && ri->type == ZEBRA_ROUTE_BGP
5149: && ri->sub_type == BGP_ROUTE_AGGREGATE)
5150: break;
5151:
5152: /* Withdraw static BGP route from routing table. */
5153: if (ri)
5154: {
5155: bgp_info_delete (rn, ri);
5156: bgp_process (bgp, rn, afi, safi);
5157: }
5158:
5159: /* Unlock bgp_node_lookup. */
5160: bgp_unlock_node (rn);
5161: }
5162:
5163: /* Aggregate route attribute. */
5164: #define AGGREGATE_SUMMARY_ONLY 1
5165: #define AGGREGATE_AS_SET 1
5166:
5167: static int
5168: bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
5169: afi_t afi, safi_t safi)
5170: {
5171: int ret;
5172: struct prefix p;
5173: struct bgp_node *rn;
5174: struct bgp *bgp;
5175: struct bgp_aggregate *aggregate;
5176:
5177: /* Convert string to prefix structure. */
5178: ret = str2prefix (prefix_str, &p);
5179: if (!ret)
5180: {
5181: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
5182: return CMD_WARNING;
5183: }
5184: apply_mask (&p);
5185:
5186: /* Get BGP structure. */
5187: bgp = vty->index;
5188:
5189: /* Old configuration check. */
5190: rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
5191: if (! rn)
5192: {
5193: vty_out (vty, "%% There is no aggregate-address configuration.%s",
5194: VTY_NEWLINE);
5195: return CMD_WARNING;
5196: }
5197:
5198: aggregate = rn->info;
5199: if (aggregate->safi & SAFI_UNICAST)
5200: bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
5201: if (aggregate->safi & SAFI_MULTICAST)
5202: bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5203:
5204: /* Unlock aggregate address configuration. */
5205: rn->info = NULL;
5206: bgp_aggregate_free (aggregate);
5207: bgp_unlock_node (rn);
5208: bgp_unlock_node (rn);
5209:
5210: return CMD_SUCCESS;
5211: }
5212:
5213: static int
5214: bgp_aggregate_set (struct vty *vty, const char *prefix_str,
5215: afi_t afi, safi_t safi,
5216: u_char summary_only, u_char as_set)
5217: {
5218: int ret;
5219: struct prefix p;
5220: struct bgp_node *rn;
5221: struct bgp *bgp;
5222: struct bgp_aggregate *aggregate;
5223:
5224: /* Convert string to prefix structure. */
5225: ret = str2prefix (prefix_str, &p);
5226: if (!ret)
5227: {
5228: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
5229: return CMD_WARNING;
5230: }
5231: apply_mask (&p);
5232:
5233: /* Get BGP structure. */
5234: bgp = vty->index;
5235:
5236: /* Old configuration check. */
5237: rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
5238:
5239: if (rn->info)
5240: {
5241: vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
5242: /* try to remove the old entry */
5243: ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
5244: if (ret)
5245: {
5246: vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
5247: bgp_unlock_node (rn);
5248: return CMD_WARNING;
5249: }
5250: }
5251:
5252: /* Make aggregate address structure. */
5253: aggregate = bgp_aggregate_new ();
5254: aggregate->summary_only = summary_only;
5255: aggregate->as_set = as_set;
5256: aggregate->safi = safi;
5257: rn->info = aggregate;
5258:
5259: /* Aggregate address insert into BGP routing table. */
5260: if (safi & SAFI_UNICAST)
5261: bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
5262: if (safi & SAFI_MULTICAST)
5263: bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
5264:
5265: return CMD_SUCCESS;
5266: }
5267:
5268: DEFUN (aggregate_address,
5269: aggregate_address_cmd,
5270: "aggregate-address A.B.C.D/M",
5271: "Configure BGP aggregate entries\n"
5272: "Aggregate prefix\n")
5273: {
5274: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
5275: }
5276:
5277: DEFUN (aggregate_address_mask,
5278: aggregate_address_mask_cmd,
5279: "aggregate-address A.B.C.D A.B.C.D",
5280: "Configure BGP aggregate entries\n"
5281: "Aggregate address\n"
5282: "Aggregate mask\n")
5283: {
5284: int ret;
5285: char prefix_str[BUFSIZ];
5286:
5287: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5288:
5289: if (! ret)
5290: {
5291: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5292: return CMD_WARNING;
5293: }
5294:
5295: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5296: 0, 0);
5297: }
5298:
5299: DEFUN (aggregate_address_summary_only,
5300: aggregate_address_summary_only_cmd,
5301: "aggregate-address A.B.C.D/M summary-only",
5302: "Configure BGP aggregate entries\n"
5303: "Aggregate prefix\n"
5304: "Filter more specific routes from updates\n")
5305: {
5306: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5307: AGGREGATE_SUMMARY_ONLY, 0);
5308: }
5309:
5310: DEFUN (aggregate_address_mask_summary_only,
5311: aggregate_address_mask_summary_only_cmd,
5312: "aggregate-address A.B.C.D A.B.C.D summary-only",
5313: "Configure BGP aggregate entries\n"
5314: "Aggregate address\n"
5315: "Aggregate mask\n"
5316: "Filter more specific routes from updates\n")
5317: {
5318: int ret;
5319: char prefix_str[BUFSIZ];
5320:
5321: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5322:
5323: if (! ret)
5324: {
5325: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5326: return CMD_WARNING;
5327: }
5328:
5329: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5330: AGGREGATE_SUMMARY_ONLY, 0);
5331: }
5332:
5333: DEFUN (aggregate_address_as_set,
5334: aggregate_address_as_set_cmd,
5335: "aggregate-address A.B.C.D/M as-set",
5336: "Configure BGP aggregate entries\n"
5337: "Aggregate prefix\n"
5338: "Generate AS set path information\n")
5339: {
5340: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5341: 0, AGGREGATE_AS_SET);
5342: }
5343:
5344: DEFUN (aggregate_address_mask_as_set,
5345: aggregate_address_mask_as_set_cmd,
5346: "aggregate-address A.B.C.D A.B.C.D as-set",
5347: "Configure BGP aggregate entries\n"
5348: "Aggregate address\n"
5349: "Aggregate mask\n"
5350: "Generate AS set path information\n")
5351: {
5352: int ret;
5353: char prefix_str[BUFSIZ];
5354:
5355: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5356:
5357: if (! ret)
5358: {
5359: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5360: return CMD_WARNING;
5361: }
5362:
5363: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5364: 0, AGGREGATE_AS_SET);
5365: }
5366:
5367:
5368: DEFUN (aggregate_address_as_set_summary,
5369: aggregate_address_as_set_summary_cmd,
5370: "aggregate-address A.B.C.D/M as-set summary-only",
5371: "Configure BGP aggregate entries\n"
5372: "Aggregate prefix\n"
5373: "Generate AS set path information\n"
5374: "Filter more specific routes from updates\n")
5375: {
5376: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5377: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5378: }
5379:
5380: ALIAS (aggregate_address_as_set_summary,
5381: aggregate_address_summary_as_set_cmd,
5382: "aggregate-address A.B.C.D/M summary-only as-set",
5383: "Configure BGP aggregate entries\n"
5384: "Aggregate prefix\n"
5385: "Filter more specific routes from updates\n"
5386: "Generate AS set path information\n")
5387:
5388: DEFUN (aggregate_address_mask_as_set_summary,
5389: aggregate_address_mask_as_set_summary_cmd,
5390: "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5391: "Configure BGP aggregate entries\n"
5392: "Aggregate address\n"
5393: "Aggregate mask\n"
5394: "Generate AS set path information\n"
5395: "Filter more specific routes from updates\n")
5396: {
5397: int ret;
5398: char prefix_str[BUFSIZ];
5399:
5400: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5401:
5402: if (! ret)
5403: {
5404: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5405: return CMD_WARNING;
5406: }
5407:
5408: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5409: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5410: }
5411:
5412: ALIAS (aggregate_address_mask_as_set_summary,
5413: aggregate_address_mask_summary_as_set_cmd,
5414: "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5415: "Configure BGP aggregate entries\n"
5416: "Aggregate address\n"
5417: "Aggregate mask\n"
5418: "Filter more specific routes from updates\n"
5419: "Generate AS set path information\n")
5420:
5421: DEFUN (no_aggregate_address,
5422: no_aggregate_address_cmd,
5423: "no aggregate-address A.B.C.D/M",
5424: NO_STR
5425: "Configure BGP aggregate entries\n"
5426: "Aggregate prefix\n")
5427: {
5428: return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5429: }
5430:
5431: ALIAS (no_aggregate_address,
5432: no_aggregate_address_summary_only_cmd,
5433: "no aggregate-address A.B.C.D/M summary-only",
5434: NO_STR
5435: "Configure BGP aggregate entries\n"
5436: "Aggregate prefix\n"
5437: "Filter more specific routes from updates\n")
5438:
5439: ALIAS (no_aggregate_address,
5440: no_aggregate_address_as_set_cmd,
5441: "no aggregate-address A.B.C.D/M as-set",
5442: NO_STR
5443: "Configure BGP aggregate entries\n"
5444: "Aggregate prefix\n"
5445: "Generate AS set path information\n")
5446:
5447: ALIAS (no_aggregate_address,
5448: no_aggregate_address_as_set_summary_cmd,
5449: "no aggregate-address A.B.C.D/M as-set summary-only",
5450: NO_STR
5451: "Configure BGP aggregate entries\n"
5452: "Aggregate prefix\n"
5453: "Generate AS set path information\n"
5454: "Filter more specific routes from updates\n")
5455:
5456: ALIAS (no_aggregate_address,
5457: no_aggregate_address_summary_as_set_cmd,
5458: "no aggregate-address A.B.C.D/M summary-only as-set",
5459: NO_STR
5460: "Configure BGP aggregate entries\n"
5461: "Aggregate prefix\n"
5462: "Filter more specific routes from updates\n"
5463: "Generate AS set path information\n")
5464:
5465: DEFUN (no_aggregate_address_mask,
5466: no_aggregate_address_mask_cmd,
5467: "no aggregate-address A.B.C.D A.B.C.D",
5468: NO_STR
5469: "Configure BGP aggregate entries\n"
5470: "Aggregate address\n"
5471: "Aggregate mask\n")
5472: {
5473: int ret;
5474: char prefix_str[BUFSIZ];
5475:
5476: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5477:
5478: if (! ret)
5479: {
5480: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5481: return CMD_WARNING;
5482: }
5483:
5484: return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5485: }
5486:
5487: ALIAS (no_aggregate_address_mask,
5488: no_aggregate_address_mask_summary_only_cmd,
5489: "no aggregate-address A.B.C.D A.B.C.D summary-only",
5490: NO_STR
5491: "Configure BGP aggregate entries\n"
5492: "Aggregate address\n"
5493: "Aggregate mask\n"
5494: "Filter more specific routes from updates\n")
5495:
5496: ALIAS (no_aggregate_address_mask,
5497: no_aggregate_address_mask_as_set_cmd,
5498: "no aggregate-address A.B.C.D A.B.C.D as-set",
5499: NO_STR
5500: "Configure BGP aggregate entries\n"
5501: "Aggregate address\n"
5502: "Aggregate mask\n"
5503: "Generate AS set path information\n")
5504:
5505: ALIAS (no_aggregate_address_mask,
5506: no_aggregate_address_mask_as_set_summary_cmd,
5507: "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5508: NO_STR
5509: "Configure BGP aggregate entries\n"
5510: "Aggregate address\n"
5511: "Aggregate mask\n"
5512: "Generate AS set path information\n"
5513: "Filter more specific routes from updates\n")
5514:
5515: ALIAS (no_aggregate_address_mask,
5516: no_aggregate_address_mask_summary_as_set_cmd,
5517: "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5518: NO_STR
5519: "Configure BGP aggregate entries\n"
5520: "Aggregate address\n"
5521: "Aggregate mask\n"
5522: "Filter more specific routes from updates\n"
5523: "Generate AS set path information\n")
5524:
5525: DEFUN (ipv6_aggregate_address,
5526: ipv6_aggregate_address_cmd,
5527: "aggregate-address X:X::X:X/M",
5528: "Configure BGP aggregate entries\n"
5529: "Aggregate prefix\n")
5530: {
5531: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5532: }
5533:
5534: DEFUN (ipv6_aggregate_address_summary_only,
5535: ipv6_aggregate_address_summary_only_cmd,
5536: "aggregate-address X:X::X:X/M summary-only",
5537: "Configure BGP aggregate entries\n"
5538: "Aggregate prefix\n"
5539: "Filter more specific routes from updates\n")
5540: {
5541: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5542: AGGREGATE_SUMMARY_ONLY, 0);
5543: }
5544:
5545: DEFUN (no_ipv6_aggregate_address,
5546: no_ipv6_aggregate_address_cmd,
5547: "no aggregate-address X:X::X:X/M",
5548: NO_STR
5549: "Configure BGP aggregate entries\n"
5550: "Aggregate prefix\n")
5551: {
5552: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5553: }
5554:
5555: DEFUN (no_ipv6_aggregate_address_summary_only,
5556: no_ipv6_aggregate_address_summary_only_cmd,
5557: "no aggregate-address X:X::X:X/M summary-only",
5558: NO_STR
5559: "Configure BGP aggregate entries\n"
5560: "Aggregate prefix\n"
5561: "Filter more specific routes from updates\n")
5562: {
5563: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5564: }
5565:
5566: ALIAS (ipv6_aggregate_address,
5567: old_ipv6_aggregate_address_cmd,
5568: "ipv6 bgp aggregate-address X:X::X:X/M",
5569: IPV6_STR
5570: BGP_STR
5571: "Configure BGP aggregate entries\n"
5572: "Aggregate prefix\n")
5573:
5574: ALIAS (ipv6_aggregate_address_summary_only,
5575: old_ipv6_aggregate_address_summary_only_cmd,
5576: "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5577: IPV6_STR
5578: BGP_STR
5579: "Configure BGP aggregate entries\n"
5580: "Aggregate prefix\n"
5581: "Filter more specific routes from updates\n")
5582:
5583: ALIAS (no_ipv6_aggregate_address,
5584: old_no_ipv6_aggregate_address_cmd,
5585: "no ipv6 bgp aggregate-address X:X::X:X/M",
5586: NO_STR
5587: IPV6_STR
5588: BGP_STR
5589: "Configure BGP aggregate entries\n"
5590: "Aggregate prefix\n")
5591:
5592: ALIAS (no_ipv6_aggregate_address_summary_only,
5593: old_no_ipv6_aggregate_address_summary_only_cmd,
5594: "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5595: NO_STR
5596: IPV6_STR
5597: BGP_STR
5598: "Configure BGP aggregate entries\n"
5599: "Aggregate prefix\n"
5600: "Filter more specific routes from updates\n")
5601:
5602: /* Redistribute route treatment. */
5603: void
5604: bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
5605: const struct in6_addr *nexthop6,
5606: u_int32_t metric, u_char type)
5607: {
5608: struct bgp *bgp;
5609: struct listnode *node, *nnode;
5610: struct bgp_info *new;
5611: struct bgp_info *bi;
5612: struct bgp_info info;
5613: struct bgp_node *bn;
5614: struct attr attr;
5615: struct attr *new_attr;
5616: afi_t afi;
5617: int ret;
5618:
5619: /* Make default attribute. */
5620: bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5621: if (nexthop)
5622: attr.nexthop = *nexthop;
5623:
5624: if (nexthop6)
5625: {
5626: struct attr_extra *extra = bgp_attr_extra_get(&attr);
5627: extra->mp_nexthop_global = *nexthop6;
5628: extra->mp_nexthop_len = 16;
5629: }
5630:
5631: attr.med = metric;
5632: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5633:
5634: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5635: {
5636: afi = family2afi (p->family);
5637:
5638: if (bgp->redist[afi][type])
5639: {
5640: struct attr attr_new;
5641: struct attr_extra extra_new;
5642:
5643: /* Copy attribute for modification. */
5644: attr_new.extra = &extra_new;
5645: bgp_attr_dup (&attr_new, &attr);
5646:
5647: if (bgp->redist_metric_flag[afi][type])
5648: attr_new.med = bgp->redist_metric[afi][type];
5649:
5650: /* Apply route-map. */
5651: if (bgp->rmap[afi][type].name)
5652: {
5653: info.peer = bgp->peer_self;
5654: info.attr = &attr_new;
5655:
5656: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5657:
5658: ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5659: &info);
5660:
5661: bgp->peer_self->rmap_type = 0;
5662:
5663: if (ret == RMAP_DENYMATCH)
5664: {
5665: /* Free uninterned attribute. */
5666: bgp_attr_flush (&attr_new);
5667:
5668: /* Unintern original. */
5669: aspath_unintern (&attr.aspath);
5670: bgp_attr_extra_free (&attr);
5671: bgp_redistribute_delete (p, type);
5672: return;
5673: }
5674: }
5675:
5676: bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5677: afi, SAFI_UNICAST, p, NULL);
5678:
5679: new_attr = bgp_attr_intern (&attr_new);
5680:
5681: for (bi = bn->info; bi; bi = bi->next)
5682: if (bi->peer == bgp->peer_self
5683: && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5684: break;
5685:
5686: if (bi)
5687: {
5688: if (attrhash_cmp (bi->attr, new_attr) &&
5689: !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5690: {
5691: bgp_attr_unintern (&new_attr);
5692: aspath_unintern (&attr.aspath);
5693: bgp_attr_extra_free (&attr);
5694: bgp_unlock_node (bn);
5695: return;
5696: }
5697: else
5698: {
5699: /* The attribute is changed. */
5700: bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
5701:
5702: /* Rewrite BGP route information. */
5703: if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5704: bgp_info_restore(bn, bi);
5705: else
5706: bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
5707: bgp_attr_unintern (&bi->attr);
5708: bi->attr = new_attr;
5709: bi->uptime = bgp_clock ();
5710:
5711: /* Process change. */
5712: bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5713: bgp_process (bgp, bn, afi, SAFI_UNICAST);
5714: bgp_unlock_node (bn);
5715: aspath_unintern (&attr.aspath);
5716: bgp_attr_extra_free (&attr);
5717: return;
5718: }
5719: }
5720:
5721: new = bgp_info_new ();
5722: new->type = type;
5723: new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5724: new->peer = bgp->peer_self;
5725: SET_FLAG (new->flags, BGP_INFO_VALID);
5726: new->attr = new_attr;
5727: new->uptime = bgp_clock ();
5728:
5729: bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5730: bgp_info_add (bn, new);
5731: bgp_unlock_node (bn);
5732: bgp_process (bgp, bn, afi, SAFI_UNICAST);
5733: }
5734: }
5735:
5736: /* Unintern original. */
5737: aspath_unintern (&attr.aspath);
5738: bgp_attr_extra_free (&attr);
5739: }
5740:
5741: void
5742: bgp_redistribute_delete (struct prefix *p, u_char type)
5743: {
5744: struct bgp *bgp;
5745: struct listnode *node, *nnode;
5746: afi_t afi;
5747: struct bgp_node *rn;
5748: struct bgp_info *ri;
5749:
5750: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5751: {
5752: afi = family2afi (p->family);
5753:
5754: if (bgp->redist[afi][type])
5755: {
5756: rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
5757:
5758: for (ri = rn->info; ri; ri = ri->next)
5759: if (ri->peer == bgp->peer_self
5760: && ri->type == type)
5761: break;
5762:
5763: if (ri)
5764: {
5765: bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
5766: bgp_info_delete (rn, ri);
5767: bgp_process (bgp, rn, afi, SAFI_UNICAST);
5768: }
5769: bgp_unlock_node (rn);
5770: }
5771: }
5772: }
5773:
5774: /* Withdraw specified route type's route. */
5775: void
5776: bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5777: {
5778: struct bgp_node *rn;
5779: struct bgp_info *ri;
5780: struct bgp_table *table;
5781:
5782: table = bgp->rib[afi][SAFI_UNICAST];
5783:
5784: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5785: {
5786: for (ri = rn->info; ri; ri = ri->next)
5787: if (ri->peer == bgp->peer_self
5788: && ri->type == type)
5789: break;
5790:
5791: if (ri)
5792: {
5793: bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
5794: bgp_info_delete (rn, ri);
5795: bgp_process (bgp, rn, afi, SAFI_UNICAST);
5796: }
5797: }
5798: }
5799:
5800: /* Static function to display route. */
5801: static void
5802: route_vty_out_route (struct prefix *p, struct vty *vty)
5803: {
5804: int len;
5805: u_int32_t destination;
5806: char buf[BUFSIZ];
5807:
5808: if (p->family == AF_INET)
5809: {
5810: len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5811: destination = ntohl (p->u.prefix4.s_addr);
5812:
5813: if ((IN_CLASSC (destination) && p->prefixlen == 24)
5814: || (IN_CLASSB (destination) && p->prefixlen == 16)
5815: || (IN_CLASSA (destination) && p->prefixlen == 8)
5816: || p->u.prefix4.s_addr == 0)
5817: {
5818: /* When mask is natural, mask is not displayed. */
5819: }
5820: else
5821: len += vty_out (vty, "/%d", p->prefixlen);
5822: }
5823: else
5824: len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5825: p->prefixlen);
5826:
5827: len = 17 - len;
5828: if (len < 1)
5829: vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5830: else
5831: vty_out (vty, "%*s", len, " ");
5832: }
5833:
5834: enum bgp_display_type
5835: {
5836: normal_list,
5837: };
5838:
5839: /* Print the short form route status for a bgp_info */
5840: static void
5841: route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
5842: {
5843: /* Route status display. */
5844: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5845: vty_out (vty, "R");
5846: else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5847: vty_out (vty, "S");
5848: else if (binfo->extra && binfo->extra->suppress)
5849: vty_out (vty, "s");
5850: else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5851: vty_out (vty, "*");
5852: else
5853: vty_out (vty, " ");
5854:
5855: /* Selected */
5856: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5857: vty_out (vty, "h");
5858: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5859: vty_out (vty, "d");
5860: else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5861: vty_out (vty, ">");
5862: else if (CHECK_FLAG (binfo->flags, BGP_INFO_MULTIPATH))
5863: vty_out (vty, "=");
5864: else
5865: vty_out (vty, " ");
5866:
5867: /* Internal route. */
5868: if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5869: vty_out (vty, "i");
5870: else
5871: vty_out (vty, " ");
5872: }
5873:
5874: /* called from terminal list command */
5875: void
5876: route_vty_out(
5877: struct vty *vty,
5878: struct prefix *p,
5879: struct bgp_info *binfo,
5880: int display,
5881: safi_t safi)
5882: {
5883: struct attr *attr;
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: /* Print attribute */
5895: attr = binfo->attr;
5896: if (attr)
5897: {
5898:
5899: /*
5900: * NEXTHOP start
5901: */
5902:
5903: /*
5904: * For ENCAP routes, nexthop address family is not
5905: * neccessarily the same as the prefix address family.
5906: * Both SAFI_MPLS_VPN and SAFI_ENCAP use the MP nexthop field
5907: */
5908: if ((safi == SAFI_ENCAP) || (safi == SAFI_MPLS_VPN)) {
5909: if (attr->extra) {
5910: char buf[BUFSIZ];
5911: int af = NEXTHOP_FAMILY(attr->extra->mp_nexthop_len);
5912:
5913: switch (af) {
5914: case AF_INET:
5915: vty_out (vty, "%s", inet_ntop(af,
5916: &attr->extra->mp_nexthop_global_in, buf, BUFSIZ));
5917: break;
5918: case AF_INET6:
5919: vty_out (vty, "%s", inet_ntop(af,
5920: &attr->extra->mp_nexthop_global, buf, BUFSIZ));
5921: break;
5922: default:
5923: vty_out(vty, "?");
5924: }
5925: } else {
5926: vty_out(vty, "?");
5927: }
5928: } else {
5929:
5930: if (p->family == AF_INET)
5931: {
5932: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5933: }
5934: else if (p->family == AF_INET6)
5935: {
5936: int len;
5937: char buf[BUFSIZ];
5938:
5939: len = vty_out (vty, "%s",
5940: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5941: buf, BUFSIZ));
5942: len = 16 - len;
5943: if (len < 1)
5944: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5945: else
5946: vty_out (vty, "%*s", len, " ");
5947: }
5948: else
5949: {
5950: vty_out(vty, "?");
5951: }
5952: }
5953:
5954: /*
5955: * NEXTHOP end
5956: */
5957:
5958:
5959: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5960: vty_out (vty, "%10u ", attr->med);
5961: else
5962: vty_out (vty, " ");
5963:
5964: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5965: vty_out (vty, "%7u ", attr->local_pref);
5966: else
5967: vty_out (vty, " ");
5968:
5969: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
5970:
5971: /* Print aspath */
5972: if (attr->aspath)
5973: aspath_print_vty (vty, "%s", attr->aspath, " ");
5974:
5975: /* Print origin */
5976: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5977: }
5978: vty_out (vty, "%s", VTY_NEWLINE);
5979: }
5980:
5981: /* called from terminal list command */
5982: void
5983: route_vty_out_tmp (struct vty *vty, struct prefix *p,
5984: struct attr *attr, safi_t safi)
5985: {
5986: /* Route status display. */
5987: vty_out (vty, "*");
5988: vty_out (vty, ">");
5989: vty_out (vty, " ");
5990:
5991: /* print prefix and mask */
5992: route_vty_out_route (p, vty);
5993:
5994: /* Print attribute */
5995: if (attr)
5996: {
5997: if (p->family == AF_INET)
5998: {
5999: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
6000: vty_out (vty, "%-16s",
6001: inet_ntoa (attr->extra->mp_nexthop_global_in));
6002: else
6003: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
6004: }
6005: else if (p->family == AF_INET6)
6006: {
6007: int len;
6008: char buf[BUFSIZ];
6009:
6010: assert (attr->extra);
6011:
6012: len = vty_out (vty, "%s",
6013: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
6014: buf, BUFSIZ));
6015: len = 16 - len;
6016: if (len < 1)
6017: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
6018: else
6019: vty_out (vty, "%*s", len, " ");
6020: }
6021:
6022: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
6023: vty_out (vty, "%10u ", attr->med);
6024: else
6025: vty_out (vty, " ");
6026:
6027: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
6028: vty_out (vty, "%7u ", attr->local_pref);
6029: else
6030: vty_out (vty, " ");
6031:
6032: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
6033:
6034: /* Print aspath */
6035: if (attr->aspath)
6036: aspath_print_vty (vty, "%s", attr->aspath, " ");
6037:
6038: /* Print origin */
6039: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
6040: }
6041:
6042: vty_out (vty, "%s", VTY_NEWLINE);
6043: }
6044:
6045: void
6046: route_vty_out_tag (struct vty *vty, struct prefix *p,
6047: struct bgp_info *binfo, int display, safi_t safi)
6048: {
6049: struct attr *attr;
6050: u_int32_t label = 0;
6051:
6052: if (!binfo->extra)
6053: return;
6054:
6055: /* short status lead text */
6056: route_vty_short_status_out (vty, binfo);
6057:
6058: /* print prefix and mask */
6059: if (! display)
6060: route_vty_out_route (p, vty);
6061: else
6062: vty_out (vty, "%*s", 17, " ");
6063:
6064: /* Print attribute */
6065: attr = binfo->attr;
6066: if (attr)
6067: {
6068: if (p->family == AF_INET)
6069: {
6070: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
6071: vty_out (vty, "%-16s",
6072: inet_ntoa (attr->extra->mp_nexthop_global_in));
6073: else
6074: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
6075: }
6076: else if (p->family == AF_INET6)
6077: {
6078: assert (attr->extra);
6079: char buf[BUFSIZ];
6080: char buf1[BUFSIZ];
6081: if (attr->extra->mp_nexthop_len == 16)
6082: vty_out (vty, "%s",
6083: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
6084: buf, BUFSIZ));
6085: else if (attr->extra->mp_nexthop_len == 32)
6086: vty_out (vty, "%s(%s)",
6087: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
6088: buf, BUFSIZ),
6089: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
6090: buf1, BUFSIZ));
6091:
6092: }
6093: }
6094:
6095: label = decode_label (binfo->extra->tag);
6096:
6097: vty_out (vty, "notag/%d", label);
6098:
6099: vty_out (vty, "%s", VTY_NEWLINE);
6100: }
6101:
6102: /* dampening route */
6103: static void
6104: damp_route_vty_out (struct vty *vty, struct prefix *p,
6105: struct bgp_info *binfo, int display, safi_t safi)
6106: {
6107: struct attr *attr;
6108: int len;
6109: char timebuf[BGP_UPTIME_LEN];
6110:
6111: /* short status lead text */
6112: route_vty_short_status_out (vty, binfo);
6113:
6114: /* print prefix and mask */
6115: if (! display)
6116: route_vty_out_route (p, vty);
6117: else
6118: vty_out (vty, "%*s", 17, " ");
6119:
6120: len = vty_out (vty, "%s", binfo->peer->host);
6121: len = 17 - len;
6122: if (len < 1)
6123: vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
6124: else
6125: vty_out (vty, "%*s", len, " ");
6126:
6127: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
6128:
6129: /* Print attribute */
6130: attr = binfo->attr;
6131: if (attr)
6132: {
6133: /* Print aspath */
6134: if (attr->aspath)
6135: aspath_print_vty (vty, "%s", attr->aspath, " ");
6136:
6137: /* Print origin */
6138: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
6139: }
6140: vty_out (vty, "%s", VTY_NEWLINE);
6141: }
6142:
6143: /* flap route */
6144: static void
6145: flap_route_vty_out (struct vty *vty, struct prefix *p,
6146: struct bgp_info *binfo, int display, safi_t safi)
6147: {
6148: struct attr *attr;
6149: struct bgp_damp_info *bdi;
6150: char timebuf[BGP_UPTIME_LEN];
6151: int len;
6152:
6153: if (!binfo->extra)
6154: return;
6155:
6156: bdi = binfo->extra->damp_info;
6157:
6158: /* short status lead text */
6159: route_vty_short_status_out (vty, binfo);
6160:
6161: /* print prefix and mask */
6162: if (! display)
6163: route_vty_out_route (p, vty);
6164: else
6165: vty_out (vty, "%*s", 17, " ");
6166:
6167: len = vty_out (vty, "%s", binfo->peer->host);
6168: len = 16 - len;
6169: if (len < 1)
6170: vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
6171: else
6172: vty_out (vty, "%*s", len, " ");
6173:
6174: len = vty_out (vty, "%d", bdi->flap);
6175: len = 5 - len;
6176: if (len < 1)
6177: vty_out (vty, " ");
6178: else
6179: vty_out (vty, "%*s ", len, " ");
6180:
6181: vty_out (vty, "%s ", peer_uptime (bdi->start_time,
6182: timebuf, BGP_UPTIME_LEN));
6183:
6184: if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
6185: && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6186: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
6187: else
6188: vty_out (vty, "%*s ", 8, " ");
6189:
6190: /* Print attribute */
6191: attr = binfo->attr;
6192: if (attr)
6193: {
6194: /* Print aspath */
6195: if (attr->aspath)
6196: aspath_print_vty (vty, "%s", attr->aspath, " ");
6197:
6198: /* Print origin */
6199: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
6200: }
6201: vty_out (vty, "%s", VTY_NEWLINE);
6202: }
6203:
6204: static void
6205: route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
6206: struct bgp_info *binfo, afi_t afi, safi_t safi)
6207: {
6208: char buf[INET6_ADDRSTRLEN];
6209: char buf1[BUFSIZ];
6210: struct attr *attr;
6211: int sockunion_vty_out (struct vty *, union sockunion *);
6212: #ifdef HAVE_CLOCK_MONOTONIC
6213: time_t tbuf;
6214: #endif
6215:
6216: attr = binfo->attr;
6217:
6218: if (attr)
6219: {
6220: /* Line1 display AS-path, Aggregator */
6221: if (attr->aspath)
6222: {
6223: vty_out (vty, " ");
6224: if (aspath_count_hops (attr->aspath) == 0)
6225: vty_out (vty, "Local");
6226: else
6227: aspath_print_vty (vty, "%s", attr->aspath, "");
6228: }
6229:
6230: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
6231: vty_out (vty, ", (removed)");
6232: if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
6233: vty_out (vty, ", (stale)");
6234: if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
6235: vty_out (vty, ", (aggregated by %u %s)",
6236: attr->extra->aggregator_as,
6237: inet_ntoa (attr->extra->aggregator_addr));
6238: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
6239: vty_out (vty, ", (Received from a RR-client)");
6240: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
6241: vty_out (vty, ", (Received from a RS-client)");
6242: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6243: vty_out (vty, ", (history entry)");
6244: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
6245: vty_out (vty, ", (suppressed due to dampening)");
6246: vty_out (vty, "%s", VTY_NEWLINE);
6247:
6248: /* Line2 display Next-hop, Neighbor, Router-id */
6249: if (p->family == AF_INET)
6250: {
6251: vty_out (vty, " %s", ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)) ?
6252: inet_ntoa (attr->extra->mp_nexthop_global_in) :
6253: inet_ntoa (attr->nexthop));
6254: }
6255: else
6256: {
6257: assert (attr->extra);
6258: vty_out (vty, " %s",
6259: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
6260: buf, INET6_ADDRSTRLEN));
6261: }
6262:
6263: if (binfo->peer == bgp->peer_self)
6264: {
6265: vty_out (vty, " from %s ",
6266: p->family == AF_INET ? "0.0.0.0" : "::");
6267: vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
6268: }
6269: else
6270: {
6271: if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
6272: vty_out (vty, " (inaccessible)");
6273: else if (binfo->extra && binfo->extra->igpmetric)
6274: vty_out (vty, " (metric %u)", binfo->extra->igpmetric);
6275: if (!sockunion2str (&binfo->peer->su, buf, sizeof(buf))) {
6276: buf[0] = '?';
6277: buf[1] = 0;
6278: }
6279: vty_out (vty, " from %s", buf);
6280: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6281: vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
6282: else
6283: vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
6284: }
6285: vty_out (vty, "%s", VTY_NEWLINE);
6286:
6287: /* display nexthop local */
6288: if (attr->extra && attr->extra->mp_nexthop_len == 32)
6289: {
6290: vty_out (vty, " (%s)%s",
6291: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
6292: buf, INET6_ADDRSTRLEN),
6293: VTY_NEWLINE);
6294: }
6295:
6296: /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
6297: vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
6298:
6299: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
6300: vty_out (vty, ", metric %u", attr->med);
6301:
6302: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
6303: vty_out (vty, ", localpref %u", attr->local_pref);
6304: else
6305: vty_out (vty, ", localpref %u", bgp->default_local_pref);
6306:
6307: if (attr->extra && attr->extra->weight != 0)
6308: vty_out (vty, ", weight %u", attr->extra->weight);
6309:
6310: if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
6311: vty_out (vty, ", valid");
6312:
6313: if (binfo->peer != bgp->peer_self)
6314: {
6315: if (binfo->peer->as == binfo->peer->local_as)
6316: vty_out (vty, ", internal");
6317: else
6318: vty_out (vty, ", %s",
6319: (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
6320: }
6321: else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
6322: vty_out (vty, ", aggregated, local");
6323: else if (binfo->type != ZEBRA_ROUTE_BGP)
6324: vty_out (vty, ", sourced");
6325: else
6326: vty_out (vty, ", sourced, local");
6327:
6328: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
6329: vty_out (vty, ", atomic-aggregate");
6330:
6331: if (CHECK_FLAG (binfo->flags, BGP_INFO_MULTIPATH) ||
6332: (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED) &&
6333: bgp_info_mpath_count (binfo)))
6334: vty_out (vty, ", multipath");
6335:
6336: if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
6337: vty_out (vty, ", best");
6338:
6339: vty_out (vty, "%s", VTY_NEWLINE);
6340:
6341: /* Line 4 display Community */
6342: if (attr->community)
6343: vty_out (vty, " Community: %s%s", attr->community->str,
6344: VTY_NEWLINE);
6345:
6346: /* Line 5 display Extended-community */
6347: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
6348: vty_out (vty, " Extended Community: %s%s",
6349: attr->extra->ecommunity->str, VTY_NEWLINE);
6350:
6351: /* Line 6 display Originator, Cluster-id */
6352: if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
6353: (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
6354: {
6355: assert (attr->extra);
6356: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
6357: vty_out (vty, " Originator: %s",
6358: inet_ntoa (attr->extra->originator_id));
6359:
6360: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
6361: {
6362: int i;
6363: vty_out (vty, ", Cluster list: ");
6364: for (i = 0; i < attr->extra->cluster->length / 4; i++)
6365: vty_out (vty, "%s ",
6366: inet_ntoa (attr->extra->cluster->list[i]));
6367: }
6368: vty_out (vty, "%s", VTY_NEWLINE);
6369: }
6370:
6371: if (binfo->extra && binfo->extra->damp_info)
6372: bgp_damp_info_vty (vty, binfo);
6373:
6374: /* Line 7 display Uptime */
6375: #ifdef HAVE_CLOCK_MONOTONIC
6376: tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
6377: vty_out (vty, " Last update: %s", ctime(&tbuf));
6378: #else
6379: vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
6380: #endif /* HAVE_CLOCK_MONOTONIC */
6381: }
6382: vty_out (vty, "%s", VTY_NEWLINE);
6383: }
6384:
6385: #define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, "\
6386: "h history, * valid, > best, = multipath,%s"\
6387: " i internal, r RIB-failure, S Stale, R Removed%s"
6388: #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
6389: #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
6390: #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
6391: #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
6392:
6393: enum bgp_show_type
6394: {
6395: bgp_show_type_normal,
6396: bgp_show_type_regexp,
6397: bgp_show_type_prefix_list,
6398: bgp_show_type_filter_list,
6399: bgp_show_type_route_map,
6400: bgp_show_type_neighbor,
6401: bgp_show_type_cidr_only,
6402: bgp_show_type_prefix_longer,
6403: bgp_show_type_community_all,
6404: bgp_show_type_community,
6405: bgp_show_type_community_exact,
6406: bgp_show_type_community_list,
6407: bgp_show_type_community_list_exact,
6408: bgp_show_type_flap_statistics,
6409: bgp_show_type_flap_address,
6410: bgp_show_type_flap_prefix,
6411: bgp_show_type_flap_cidr_only,
6412: bgp_show_type_flap_regexp,
6413: bgp_show_type_flap_filter_list,
6414: bgp_show_type_flap_prefix_list,
6415: bgp_show_type_flap_prefix_longer,
6416: bgp_show_type_flap_route_map,
6417: bgp_show_type_flap_neighbor,
6418: bgp_show_type_dampend_paths,
6419: bgp_show_type_damp_neighbor
6420: };
6421:
6422: static int
6423: bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
6424: enum bgp_show_type type, void *output_arg)
6425: {
6426: struct bgp_info *ri;
6427: struct bgp_node *rn;
6428: int header = 1;
6429: int display;
6430: unsigned long output_count;
6431: unsigned long total_count;
6432:
6433: /* This is first entry point, so reset total line. */
6434: output_count = 0;
6435: total_count = 0;
6436:
6437: /* Start processing of routes. */
6438: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6439: if (rn->info != NULL)
6440: {
6441: display = 0;
6442:
6443: for (ri = rn->info; ri; ri = ri->next)
6444: {
6445: total_count++;
6446: if (type == bgp_show_type_flap_statistics
6447: || type == bgp_show_type_flap_address
6448: || type == bgp_show_type_flap_prefix
6449: || type == bgp_show_type_flap_cidr_only
6450: || type == bgp_show_type_flap_regexp
6451: || type == bgp_show_type_flap_filter_list
6452: || type == bgp_show_type_flap_prefix_list
6453: || type == bgp_show_type_flap_prefix_longer
6454: || type == bgp_show_type_flap_route_map
6455: || type == bgp_show_type_flap_neighbor
6456: || type == bgp_show_type_dampend_paths
6457: || type == bgp_show_type_damp_neighbor)
6458: {
6459: if (!(ri->extra && ri->extra->damp_info))
6460: continue;
6461: }
6462: if (type == bgp_show_type_regexp
6463: || type == bgp_show_type_flap_regexp)
6464: {
6465: regex_t *regex = output_arg;
6466:
6467: if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6468: continue;
6469: }
6470: if (type == bgp_show_type_prefix_list
6471: || type == bgp_show_type_flap_prefix_list)
6472: {
6473: struct prefix_list *plist = output_arg;
6474:
6475: if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6476: continue;
6477: }
6478: if (type == bgp_show_type_filter_list
6479: || type == bgp_show_type_flap_filter_list)
6480: {
6481: struct as_list *as_list = output_arg;
6482:
6483: if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6484: continue;
6485: }
6486: if (type == bgp_show_type_route_map
6487: || type == bgp_show_type_flap_route_map)
6488: {
6489: struct route_map *rmap = output_arg;
6490: struct bgp_info binfo;
6491: struct attr dummy_attr;
6492: struct attr_extra dummy_extra;
6493: int ret;
6494:
6495: dummy_attr.extra = &dummy_extra;
6496: bgp_attr_dup (&dummy_attr, ri->attr);
6497:
6498: binfo.peer = ri->peer;
6499: binfo.attr = &dummy_attr;
6500:
6501: ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
6502: if (ret == RMAP_DENYMATCH)
6503: continue;
6504: }
6505: if (type == bgp_show_type_neighbor
6506: || type == bgp_show_type_flap_neighbor
6507: || type == bgp_show_type_damp_neighbor)
6508: {
6509: union sockunion *su = output_arg;
6510:
6511: if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6512: continue;
6513: }
6514: if (type == bgp_show_type_cidr_only
6515: || type == bgp_show_type_flap_cidr_only)
6516: {
6517: u_int32_t destination;
6518:
6519: destination = ntohl (rn->p.u.prefix4.s_addr);
6520: if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6521: continue;
6522: if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6523: continue;
6524: if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6525: continue;
6526: }
6527: if (type == bgp_show_type_prefix_longer
6528: || type == bgp_show_type_flap_prefix_longer)
6529: {
6530: struct prefix *p = output_arg;
6531:
6532: if (! prefix_match (p, &rn->p))
6533: continue;
6534: }
6535: if (type == bgp_show_type_community_all)
6536: {
6537: if (! ri->attr->community)
6538: continue;
6539: }
6540: if (type == bgp_show_type_community)
6541: {
6542: struct community *com = output_arg;
6543:
6544: if (! ri->attr->community ||
6545: ! community_match (ri->attr->community, com))
6546: continue;
6547: }
6548: if (type == bgp_show_type_community_exact)
6549: {
6550: struct community *com = output_arg;
6551:
6552: if (! ri->attr->community ||
6553: ! community_cmp (ri->attr->community, com))
6554: continue;
6555: }
6556: if (type == bgp_show_type_community_list)
6557: {
6558: struct community_list *list = output_arg;
6559:
6560: if (! community_list_match (ri->attr->community, list))
6561: continue;
6562: }
6563: if (type == bgp_show_type_community_list_exact)
6564: {
6565: struct community_list *list = output_arg;
6566:
6567: if (! community_list_exact_match (ri->attr->community, list))
6568: continue;
6569: }
6570: if (type == bgp_show_type_flap_address
6571: || type == bgp_show_type_flap_prefix)
6572: {
6573: struct prefix *p = output_arg;
6574:
6575: if (! prefix_match (&rn->p, p))
6576: continue;
6577:
6578: if (type == bgp_show_type_flap_prefix)
6579: if (p->prefixlen != rn->p.prefixlen)
6580: continue;
6581: }
6582: if (type == bgp_show_type_dampend_paths
6583: || type == bgp_show_type_damp_neighbor)
6584: {
6585: if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6586: || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6587: continue;
6588: }
6589:
6590: if (header)
6591: {
6592: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6593: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6594: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6595: if (type == bgp_show_type_dampend_paths
6596: || type == bgp_show_type_damp_neighbor)
6597: vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6598: else if (type == bgp_show_type_flap_statistics
6599: || type == bgp_show_type_flap_address
6600: || type == bgp_show_type_flap_prefix
6601: || type == bgp_show_type_flap_cidr_only
6602: || type == bgp_show_type_flap_regexp
6603: || type == bgp_show_type_flap_filter_list
6604: || type == bgp_show_type_flap_prefix_list
6605: || type == bgp_show_type_flap_prefix_longer
6606: || type == bgp_show_type_flap_route_map
6607: || type == bgp_show_type_flap_neighbor)
6608: vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6609: else
6610: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
6611: header = 0;
6612: }
6613:
6614: if (type == bgp_show_type_dampend_paths
6615: || type == bgp_show_type_damp_neighbor)
6616: damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6617: else if (type == bgp_show_type_flap_statistics
6618: || type == bgp_show_type_flap_address
6619: || type == bgp_show_type_flap_prefix
6620: || type == bgp_show_type_flap_cidr_only
6621: || type == bgp_show_type_flap_regexp
6622: || type == bgp_show_type_flap_filter_list
6623: || type == bgp_show_type_flap_prefix_list
6624: || type == bgp_show_type_flap_prefix_longer
6625: || type == bgp_show_type_flap_route_map
6626: || type == bgp_show_type_flap_neighbor)
6627: flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6628: else
6629: route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6630: display++;
6631: }
6632: if (display)
6633: output_count++;
6634: }
6635:
6636: /* No route is displayed */
6637: if (output_count == 0)
6638: {
6639: if (type == bgp_show_type_normal)
6640: vty_out (vty, "No BGP prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE);
6641: }
6642: else
6643: vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s",
6644: VTY_NEWLINE, output_count, total_count, VTY_NEWLINE);
6645:
6646: return CMD_SUCCESS;
6647: }
6648:
6649: static int
6650: bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
6651: enum bgp_show_type type, void *output_arg)
6652: {
6653: struct bgp_table *table;
6654:
6655: if (bgp == NULL) {
6656: bgp = bgp_get_default ();
6657: }
6658:
6659: if (bgp == NULL)
6660: {
6661: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6662: return CMD_WARNING;
6663: }
6664:
6665:
6666: table = bgp->rib[afi][safi];
6667:
6668: return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
6669: }
6670:
6671: /* Header of detailed BGP route information */
6672: static void
6673: route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6674: struct bgp_node *rn,
6675: struct prefix_rd *prd, afi_t afi, safi_t safi)
6676: {
6677: struct bgp_info *ri;
6678: struct prefix *p;
6679: struct peer *peer;
6680: struct listnode *node, *nnode;
6681: char buf1[INET6_ADDRSTRLEN];
6682: char buf2[INET6_ADDRSTRLEN];
6683: int count = 0;
6684: int best = 0;
6685: int suppress = 0;
6686: int no_export = 0;
6687: int no_advertise = 0;
6688: int local_as = 0;
6689: int first = 0;
6690: int printrd = ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP));
6691:
6692: p = &rn->p;
6693: vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6694: (printrd ? prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6695: printrd ? ":" : "",
6696: inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6697: p->prefixlen, VTY_NEWLINE);
6698:
6699: for (ri = rn->info; ri; ri = ri->next)
6700: {
6701: count++;
6702: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6703: {
6704: best = count;
6705: if (ri->extra && ri->extra->suppress)
6706: suppress = 1;
6707: if (ri->attr->community != NULL)
6708: {
6709: if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6710: no_advertise = 1;
6711: if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6712: no_export = 1;
6713: if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6714: local_as = 1;
6715: }
6716: }
6717: }
6718:
6719: vty_out (vty, "Paths: (%d available", count);
6720: if (best)
6721: {
6722: vty_out (vty, ", best #%d", best);
6723: if (safi == SAFI_UNICAST)
6724: vty_out (vty, ", table Default-IP-Routing-Table");
6725: }
6726: else
6727: vty_out (vty, ", no best path");
6728: if (no_advertise)
6729: vty_out (vty, ", not advertised to any peer");
6730: else if (no_export)
6731: vty_out (vty, ", not advertised to EBGP peer");
6732: else if (local_as)
6733: vty_out (vty, ", not advertised outside local AS");
6734: if (suppress)
6735: vty_out (vty, ", Advertisements suppressed by an aggregate.");
6736: vty_out (vty, ")%s", VTY_NEWLINE);
6737:
6738: /* advertised peer */
6739: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6740: {
6741: if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6742: {
6743: if (! first)
6744: vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6745: vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6746: first = 1;
6747: }
6748: }
6749: if (! first)
6750: vty_out (vty, " Not advertised to any peer");
6751: vty_out (vty, "%s", VTY_NEWLINE);
6752: }
6753:
6754: /* Display specified route of BGP table. */
6755: static int
6756: bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
6757: struct bgp_table *rib, const char *ip_str,
6758: afi_t afi, safi_t safi, struct prefix_rd *prd,
6759: int prefix_check)
6760: {
6761: int ret;
6762: int header;
6763: int display = 0;
6764: struct prefix match;
6765: struct bgp_node *rn;
6766: struct bgp_node *rm;
6767: struct bgp_info *ri;
6768: struct bgp_table *table;
6769:
6770: memset (&match, 0, sizeof (struct prefix)); /* keep valgrind happy */
6771: /* Check IP address argument. */
6772: ret = str2prefix (ip_str, &match);
6773: if (! ret)
6774: {
6775: vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6776: return CMD_WARNING;
6777: }
6778:
6779: match.family = afi2family (afi);
6780:
6781: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
6782: {
6783: for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
6784: {
6785: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6786: continue;
6787:
6788: if ((table = rn->info) != NULL)
6789: {
6790: header = 1;
6791:
6792: if ((rm = bgp_node_match (table, &match)) != NULL)
6793: {
6794: if (prefix_check && rm->p.prefixlen != match.prefixlen)
6795: {
6796: bgp_unlock_node (rm);
6797: continue;
6798: }
6799:
6800: for (ri = rm->info; ri; ri = ri->next)
6801: {
6802: if (header)
6803: {
6804: route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6805: AFI_IP, safi);
6806:
6807: header = 0;
6808: }
6809: display++;
6810: route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, safi);
6811: }
6812:
6813: bgp_unlock_node (rm);
6814: }
6815: }
6816: }
6817: }
6818: else
6819: {
6820: header = 1;
6821:
6822: if ((rn = bgp_node_match (rib, &match)) != NULL)
6823: {
6824: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6825: {
6826: for (ri = rn->info; ri; ri = ri->next)
6827: {
6828: if (header)
6829: {
6830: route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6831: header = 0;
6832: }
6833: display++;
6834: route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6835: }
6836: }
6837:
6838: bgp_unlock_node (rn);
6839: }
6840: }
6841:
6842: if (! display)
6843: {
6844: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6845: return CMD_WARNING;
6846: }
6847:
6848: return CMD_SUCCESS;
6849: }
6850:
6851: /* Display specified route of Main RIB */
6852: static int
6853: bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
6854: afi_t afi, safi_t safi, struct prefix_rd *prd,
6855: int prefix_check)
6856: {
6857: struct bgp *bgp;
6858:
6859: /* BGP structure lookup. */
6860: if (view_name)
6861: {
6862: bgp = bgp_lookup_by_name (view_name);
6863: if (bgp == NULL)
6864: {
6865: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6866: return CMD_WARNING;
6867: }
6868: }
6869: else
6870: {
6871: bgp = bgp_get_default ();
6872: if (bgp == NULL)
6873: {
6874: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6875: return CMD_WARNING;
6876: }
6877: }
6878:
6879: return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6880: afi, safi, prd, prefix_check);
6881: }
6882:
6883: /* BGP route print out function. */
6884: DEFUN (show_ip_bgp,
6885: show_ip_bgp_cmd,
6886: "show ip bgp",
6887: SHOW_STR
6888: IP_STR
6889: BGP_STR)
6890: {
6891: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6892: }
6893:
6894: DEFUN (show_ip_bgp_ipv4,
6895: show_ip_bgp_ipv4_cmd,
6896: "show ip bgp ipv4 (unicast|multicast)",
6897: SHOW_STR
6898: IP_STR
6899: BGP_STR
6900: "Address family\n"
6901: "Address Family modifier\n"
6902: "Address Family modifier\n")
6903: {
6904: if (strncmp (argv[0], "m", 1) == 0)
6905: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6906: NULL);
6907:
6908: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6909: }
6910:
6911: DEFUN (show_ip_bgp_route,
6912: show_ip_bgp_route_cmd,
6913: "show ip bgp A.B.C.D",
6914: SHOW_STR
6915: IP_STR
6916: BGP_STR
6917: "Network in the BGP routing table to display\n")
6918: {
6919: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6920: }
6921:
6922: DEFUN (show_ip_bgp_ipv4_route,
6923: show_ip_bgp_ipv4_route_cmd,
6924: "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6925: SHOW_STR
6926: IP_STR
6927: BGP_STR
6928: "Address family\n"
6929: "Address Family modifier\n"
6930: "Address Family modifier\n"
6931: "Network in the BGP routing table to display\n")
6932: {
6933: if (strncmp (argv[0], "m", 1) == 0)
6934: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6935:
6936: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6937: }
6938:
6939: DEFUN (show_ip_bgp_vpnv4_all_route,
6940: show_ip_bgp_vpnv4_all_route_cmd,
6941: "show ip bgp vpnv4 all A.B.C.D",
6942: SHOW_STR
6943: IP_STR
6944: BGP_STR
6945: "Display VPNv4 NLRI specific information\n"
6946: "Display information about all VPNv4 NLRIs\n"
6947: "Network in the BGP routing table to display\n")
6948: {
6949: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6950: }
6951:
6952: DEFUN (show_ip_bgp_vpnv4_rd_route,
6953: show_ip_bgp_vpnv4_rd_route_cmd,
6954: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6955: SHOW_STR
6956: IP_STR
6957: BGP_STR
6958: "Display VPNv4 NLRI specific information\n"
6959: "Display information for a route distinguisher\n"
6960: "VPN Route Distinguisher\n"
6961: "Network in the BGP routing table to display\n")
6962: {
6963: int ret;
6964: struct prefix_rd prd;
6965:
6966: ret = str2prefix_rd (argv[0], &prd);
6967: if (! ret)
6968: {
6969: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6970: return CMD_WARNING;
6971: }
6972: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6973: }
6974:
6975: DEFUN (show_ip_bgp_prefix,
6976: show_ip_bgp_prefix_cmd,
6977: "show ip bgp A.B.C.D/M",
6978: SHOW_STR
6979: IP_STR
6980: BGP_STR
6981: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6982: {
6983: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6984: }
6985:
6986: DEFUN (show_ip_bgp_ipv4_prefix,
6987: show_ip_bgp_ipv4_prefix_cmd,
6988: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6989: SHOW_STR
6990: IP_STR
6991: BGP_STR
6992: "Address family\n"
6993: "Address Family modifier\n"
6994: "Address Family modifier\n"
6995: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6996: {
6997: if (strncmp (argv[0], "m", 1) == 0)
6998: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6999:
7000: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
7001: }
7002:
7003: DEFUN (show_ip_bgp_vpnv4_all_prefix,
7004: show_ip_bgp_vpnv4_all_prefix_cmd,
7005: "show ip bgp vpnv4 all A.B.C.D/M",
7006: SHOW_STR
7007: IP_STR
7008: BGP_STR
7009: "Display VPNv4 NLRI specific information\n"
7010: "Display information about all VPNv4 NLRIs\n"
7011: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7012: {
7013: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
7014: }
7015:
7016: DEFUN (show_ip_bgp_vpnv4_rd_prefix,
7017: show_ip_bgp_vpnv4_rd_prefix_cmd,
7018: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
7019: SHOW_STR
7020: IP_STR
7021: BGP_STR
7022: "Display VPNv4 NLRI specific information\n"
7023: "Display information for a route distinguisher\n"
7024: "VPN Route Distinguisher\n"
7025: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7026: {
7027: int ret;
7028: struct prefix_rd prd;
7029:
7030: ret = str2prefix_rd (argv[0], &prd);
7031: if (! ret)
7032: {
7033: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7034: return CMD_WARNING;
7035: }
7036: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
7037: }
7038:
7039: DEFUN (show_ip_bgp_view,
7040: show_ip_bgp_view_cmd,
7041: "show ip bgp view WORD",
7042: SHOW_STR
7043: IP_STR
7044: BGP_STR
7045: "BGP view\n"
7046: "View name\n")
7047: {
7048: struct bgp *bgp;
7049:
7050: /* BGP structure lookup. */
7051: bgp = bgp_lookup_by_name (argv[0]);
7052: if (bgp == NULL)
7053: {
7054: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7055: return CMD_WARNING;
7056: }
7057:
7058: return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
7059: }
7060:
7061: DEFUN (show_ip_bgp_view_route,
7062: show_ip_bgp_view_route_cmd,
7063: "show ip bgp view WORD A.B.C.D",
7064: SHOW_STR
7065: IP_STR
7066: BGP_STR
7067: "BGP view\n"
7068: "View name\n"
7069: "Network in the BGP routing table to display\n")
7070: {
7071: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
7072: }
7073:
7074: DEFUN (show_ip_bgp_view_prefix,
7075: show_ip_bgp_view_prefix_cmd,
7076: "show ip bgp view WORD A.B.C.D/M",
7077: SHOW_STR
7078: IP_STR
7079: BGP_STR
7080: "BGP view\n"
7081: "View name\n"
7082: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7083: {
7084: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
7085: }
7086:
7087: DEFUN (show_bgp,
7088: show_bgp_cmd,
7089: "show bgp",
7090: SHOW_STR
7091: BGP_STR)
7092: {
7093: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
7094: NULL);
7095: }
7096:
7097: ALIAS (show_bgp,
7098: show_bgp_ipv6_cmd,
7099: "show bgp ipv6",
7100: SHOW_STR
7101: BGP_STR
7102: "Address family\n")
7103:
7104: /* old command */
7105: DEFUN (show_ipv6_bgp,
7106: show_ipv6_bgp_cmd,
7107: "show ipv6 bgp",
7108: SHOW_STR
7109: IP_STR
7110: BGP_STR)
7111: {
7112: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
7113: NULL);
7114: }
7115:
7116: DEFUN (show_bgp_route,
7117: show_bgp_route_cmd,
7118: "show bgp X:X::X:X",
7119: SHOW_STR
7120: BGP_STR
7121: "Network in the BGP routing table to display\n")
7122: {
7123: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
7124: }
7125:
7126: DEFUN (show_bgp_ipv4_safi,
7127: show_bgp_ipv4_safi_cmd,
7128: "show bgp ipv4 (unicast|multicast)",
7129: SHOW_STR
7130: BGP_STR
7131: "Address family\n"
7132: "Address Family modifier\n"
7133: "Address Family modifier\n")
7134: {
7135: if (strncmp (argv[0], "m", 1) == 0)
7136: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
7137: NULL);
7138:
7139: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
7140: }
7141:
7142: DEFUN (show_bgp_ipv4_safi_route,
7143: show_bgp_ipv4_safi_route_cmd,
7144: "show bgp ipv4 (unicast|multicast) A.B.C.D",
7145: SHOW_STR
7146: BGP_STR
7147: "Address family\n"
7148: "Address Family modifier\n"
7149: "Address Family modifier\n"
7150: "Network in the BGP routing table to display\n")
7151: {
7152: if (strncmp (argv[0], "m", 1) == 0)
7153: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
7154:
7155: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
7156: }
7157:
7158: DEFUN (show_bgp_ipv4_vpn_route,
7159: show_bgp_ipv4_vpn_route_cmd,
7160: "show bgp ipv4 vpn A.B.C.D",
7161: SHOW_STR
7162: BGP_STR
7163: "Address Family\n"
7164: "Display VPN NLRI specific information\n"
7165: "Network in the BGP routing table to display\n")
7166: {
7167: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
7168: }
7169:
7170: DEFUN (show_bgp_ipv6_vpn_route,
7171: show_bgp_ipv6_vpn_route_cmd,
7172: "show bgp ipv6 vpn X:X::X:X",
7173: SHOW_STR
7174: BGP_STR
7175: "Address Family\n"
7176: "Display VPN NLRI specific information\n"
7177: "Network in the BGP routing table to display\n")
7178: {
7179: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MPLS_VPN, NULL, 0);
7180: }
7181:
7182: DEFUN (show_bgp_ipv4_vpn_rd_route,
7183: show_bgp_ipv4_vpn_rd_route_cmd,
7184: "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn A.B.C.D",
7185: SHOW_STR
7186: BGP_STR
7187: IP_STR
7188: "Display VPN NLRI specific information\n"
7189: "Display information for a route distinguisher\n"
7190: "VPN Route Distinguisher\n"
7191: "Network in the BGP routing table to display\n")
7192: {
7193: int ret;
7194: struct prefix_rd prd;
7195:
7196: ret = str2prefix_rd (argv[0], &prd);
7197: if (! ret)
7198: {
7199: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7200: return CMD_WARNING;
7201: }
7202: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
7203: }
7204:
7205: DEFUN (show_bgp_ipv6_vpn_rd_route,
7206: show_bgp_ipv6_vpn_rd_route_cmd,
7207: "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn X:X::X:X",
7208: SHOW_STR
7209: BGP_STR
7210: "Address Family\n"
7211: "Display VPN NLRI specific information\n"
7212: "Display information for a route distinguisher\n"
7213: "VPN Route Distinguisher\n"
7214: "Network in the BGP routing table to display\n")
7215: {
7216: int ret;
7217: struct prefix_rd prd;
7218:
7219: ret = str2prefix_rd (argv[0], &prd);
7220: if (! ret)
7221: {
7222: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7223: return CMD_WARNING;
7224: }
7225: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MPLS_VPN, &prd, 0);
7226: }
7227:
7228: DEFUN (show_bgp_ipv4_encap_route,
7229: show_bgp_ipv4_encap_route_cmd,
7230: "show bgp ipv4 encap A.B.C.D",
7231: SHOW_STR
7232: BGP_STR
7233: IP_STR
7234: "Display ENCAP NLRI specific information\n"
7235: "Network in the BGP routing table to display\n")
7236: {
7237: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_ENCAP, NULL, 0);
7238: }
7239:
7240: DEFUN (show_bgp_ipv6_encap_route,
7241: show_bgp_ipv6_encap_route_cmd,
7242: "show bgp ipv6 encap X:X::X:X",
7243: SHOW_STR
7244: BGP_STR
7245: IP6_STR
7246: "Display ENCAP NLRI specific information\n"
7247: "Network in the BGP routing table to display\n")
7248: {
7249: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_ENCAP, NULL, 0);
7250: }
7251:
7252: DEFUN (show_bgp_ipv4_safi_rd_route,
7253: show_bgp_ipv4_safi_rd_route_cmd,
7254: "show bgp ipv4 (encap|vpn) rd ASN:nn_or_IP-address:nn A.B.C.D",
7255: SHOW_STR
7256: BGP_STR
7257: "Address Family\n"
7258: "Address Family Modifier\n"
7259: "Address Family Modifier\n"
7260: "Display information for a route distinguisher\n"
7261: "ENCAP Route Distinguisher\n"
7262: "Network in the BGP routing table to display\n")
7263: {
7264: int ret;
7265: struct prefix_rd prd;
7266: safi_t safi;
7267:
7268: if (bgp_parse_safi(argv[0], &safi)) {
7269: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
7270: return CMD_WARNING;
7271: }
7272: ret = str2prefix_rd (argv[1], &prd);
7273: if (! ret)
7274: {
7275: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7276: return CMD_WARNING;
7277: }
7278: return bgp_show_route (vty, NULL, argv[2], AFI_IP, safi, &prd, 0);
7279: }
7280:
7281: DEFUN (show_bgp_ipv6_safi_rd_route,
7282: show_bgp_ipv6_safi_rd_route_cmd,
7283: "show bgp ipv6 (encap|vpn) rd ASN:nn_or_IP-address:nn X:X::X:X",
7284: SHOW_STR
7285: BGP_STR
7286: "Address Family\n"
7287: "Address Family Modifier\n"
7288: "Address Family Modifier\n"
7289: "Display information for a route distinguisher\n"
7290: "ENCAP Route Distinguisher\n"
7291: "Network in the BGP routing table to display\n")
7292: {
7293: int ret;
7294: struct prefix_rd prd;
7295: safi_t safi;
7296:
7297: if (bgp_parse_safi(argv[0], &safi)) {
7298: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
7299: return CMD_WARNING;
7300: }
7301: ret = str2prefix_rd (argv[1], &prd);
7302: if (! ret)
7303: {
7304: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7305: return CMD_WARNING;
7306: }
7307: return bgp_show_route (vty, NULL, argv[2], AFI_IP6, SAFI_ENCAP, &prd, 0);
7308: }
7309:
7310: DEFUN (show_bgp_ipv4_prefix,
7311: show_bgp_ipv4_prefix_cmd,
7312: "show bgp ipv4 A.B.C.D/M",
7313: SHOW_STR
7314: BGP_STR
7315: IP_STR
7316: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7317: {
7318: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
7319: }
7320:
7321: DEFUN (show_bgp_ipv4_safi_prefix,
7322: show_bgp_ipv4_safi_prefix_cmd,
7323: "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
7324: SHOW_STR
7325: BGP_STR
7326: "Address family\n"
7327: "Address Family modifier\n"
7328: "Address Family modifier\n"
7329: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7330: {
7331: if (strncmp (argv[0], "m", 1) == 0)
7332: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
7333:
7334: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
7335: }
7336:
7337: DEFUN (show_bgp_ipv4_vpn_prefix,
7338: show_bgp_ipv4_vpn_prefix_cmd,
7339: "show bgp ipv4 vpn A.B.C.D/M",
7340: SHOW_STR
7341: BGP_STR
7342: IP_STR
7343: "Display VPN NLRI specific information\n"
7344: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7345: {
7346: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
7347: }
7348:
7349: DEFUN (show_bgp_ipv6_vpn_prefix,
7350: show_bgp_ipv6_vpn_prefix_cmd,
7351: "show bgp ipv6 vpn X:X::X:X/M",
7352: SHOW_STR
7353: BGP_STR
7354: "Address Family\n"
7355: "Display VPN NLRI specific information\n"
7356: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7357: {
7358: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MPLS_VPN, NULL, 1);
7359: }
7360:
7361: DEFUN (show_bgp_ipv4_encap_prefix,
7362: show_bgp_ipv4_encap_prefix_cmd,
7363: "show bgp ipv4 encap A.B.C.D/M",
7364: SHOW_STR
7365: BGP_STR
7366: IP_STR
7367: "Display ENCAP NLRI specific information\n"
7368: "Display information about ENCAP NLRIs\n"
7369: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7370: {
7371: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_ENCAP, NULL, 1);
7372: }
7373:
7374: DEFUN (show_bgp_ipv6_encap_prefix,
7375: show_bgp_ipv6_encap_prefix_cmd,
7376: "show bgp ipv6 encap X:X::X:X/M",
7377: SHOW_STR
7378: BGP_STR
7379: IP_STR
7380: "Display ENCAP NLRI specific information\n"
7381: "Display information about ENCAP NLRIs\n"
7382: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7383: {
7384: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_ENCAP, NULL, 1);
7385: }
7386:
7387: DEFUN (show_bgp_ipv4_safi_rd_prefix,
7388: show_bgp_ipv4_safi_rd_prefix_cmd,
7389: "show bgp ipv4 (encap|vpn) rd ASN:nn_or_IP-address:nn A.B.C.D/M",
7390: SHOW_STR
7391: BGP_STR
7392: "Address Family\n"
7393: "Address Family Modifier\n"
7394: "Address Family Modifier\n"
7395: "Display information for a route distinguisher\n"
7396: "ENCAP Route Distinguisher\n"
7397: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7398: {
7399: int ret;
7400: struct prefix_rd prd;
7401: safi_t safi;
7402:
7403: if (bgp_parse_safi(argv[0], &safi)) {
7404: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
7405: return CMD_WARNING;
7406: }
7407:
7408: ret = str2prefix_rd (argv[1], &prd);
7409: if (! ret)
7410: {
7411: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7412: return CMD_WARNING;
7413: }
7414: return bgp_show_route (vty, NULL, argv[2], AFI_IP, safi, &prd, 1);
7415: }
7416:
7417: DEFUN (show_bgp_ipv6_safi_rd_prefix,
7418: show_bgp_ipv6_safi_rd_prefix_cmd,
7419: "show bgp ipv6 (encap|vpn) rd ASN:nn_or_IP-address:nn X:X::X:X/M",
7420: SHOW_STR
7421: BGP_STR
7422: "Address Family\n"
7423: "Address Family Modifier\n"
7424: "Address Family Modifier\n"
7425: "Display information for a route distinguisher\n"
7426: "ENCAP Route Distinguisher\n"
7427: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7428: {
7429: int ret;
7430: struct prefix_rd prd;
7431: safi_t safi;
7432:
7433: if (bgp_parse_safi(argv[0], &safi)) {
7434: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
7435: return CMD_WARNING;
7436: }
7437:
7438: ret = str2prefix_rd (argv[1], &prd);
7439: if (! ret)
7440: {
7441: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
7442: return CMD_WARNING;
7443: }
7444: return bgp_show_route (vty, NULL, argv[2], AFI_IP6, safi, &prd, 1);
7445: }
7446:
7447: DEFUN (show_bgp_afi_safi_view,
7448: show_bgp_afi_safi_view_cmd,
7449: "show bgp view WORD (ipv4|ipv6) (encap|mulicast|unicast|vpn)",
7450: SHOW_STR
7451: BGP_STR
7452: "BGP view\n"
7453: "BGP view name\n"
7454: "Address Family\n"
7455: "Address Family\n"
7456: "Address Family Modifier\n"
7457: "Address Family Modifier\n"
7458: "Address Family Modifier\n"
7459: "Address Family Modifier\n"
7460: )
7461: {
7462: struct bgp *bgp;
7463: safi_t safi;
7464: afi_t afi;
7465:
7466: if (bgp_parse_afi(argv[1], &afi)) {
7467: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
7468: return CMD_WARNING;
7469: }
7470: if (bgp_parse_safi(argv[2], &safi)) {
7471: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
7472: return CMD_WARNING;
7473: }
7474:
7475: /* BGP structure lookup. */
7476: bgp = bgp_lookup_by_name (argv[0]);
7477: if (bgp == NULL)
7478: {
7479: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7480: return CMD_WARNING;
7481: }
7482:
7483: return bgp_show (vty, bgp, afi, safi, bgp_show_type_normal, NULL);
7484: }
7485:
7486: DEFUN (show_bgp_view_afi_safi_route,
7487: show_bgp_view_afi_safi_route_cmd,
7488: "show bgp view WORD (ipv4|ipv6) (encap|multicast|unicast|vpn) A.B.C.D",
7489: SHOW_STR
7490: BGP_STR
7491: "BGP view\n"
7492: "View name\n"
7493: "Address Family\n"
7494: "Address Family\n"
7495: "Address Family Modifier\n"
7496: "Address Family Modifier\n"
7497: "Address Family Modifier\n"
7498: "Address Family Modifier\n"
7499: "Network in the BGP routing table to display\n")
7500: {
7501: safi_t safi;
7502: afi_t afi;
7503:
7504: if (bgp_parse_afi(argv[1], &afi)) {
7505: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
7506: return CMD_WARNING;
7507: }
7508: if (bgp_parse_safi(argv[2], &safi)) {
7509: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
7510: return CMD_WARNING;
7511: }
7512: return bgp_show_route (vty, argv[0], argv[3], afi, safi, NULL, 0);
7513: }
7514:
7515: DEFUN (show_bgp_view_afi_safi_prefix,
7516: show_bgp_view_afi_safi_prefix_cmd,
7517: "show bgp view WORD (ipv4|ipv6) (encap|multicast|unicast|vpn) A.B.C.D/M",
7518: SHOW_STR
7519: BGP_STR
7520: "BGP view\n"
7521: "View name\n"
7522: "Address Family\n"
7523: "Address Family\n"
7524: "Address Family Modifier\n"
7525: "Address Family Modifier\n"
7526: "Address Family Modifier\n"
7527: "Address Family Modifier\n"
7528: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
7529: {
7530: safi_t safi;
7531: afi_t afi;
7532:
7533: if (bgp_parse_afi(argv[1], &afi)) {
7534: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
7535: return CMD_WARNING;
7536: }
7537: if (bgp_parse_safi(argv[2], &safi)) {
7538: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
7539: return CMD_WARNING;
7540: }
7541: return bgp_show_route (vty, argv[0], argv[3], afi, safi, NULL, 1);
7542: }
7543:
7544: /* new001 */
7545: DEFUN (show_bgp_afi,
7546: show_bgp_afi_cmd,
7547: "show bgp (ipv4|ipv6)",
7548: SHOW_STR
7549: BGP_STR
7550: "Address family\n"
7551: "Address family\n")
7552: {
7553: afi_t afi;
7554:
7555: if (bgp_parse_afi(argv[0], &afi)) {
7556: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
7557: return CMD_WARNING;
7558: }
7559: return bgp_show (vty, NULL, afi, SAFI_UNICAST, bgp_show_type_normal,
7560: NULL);
7561: }
7562:
7563: DEFUN (show_bgp_ipv6_safi,
7564: show_bgp_ipv6_safi_cmd,
7565: "show bgp ipv6 (unicast|multicast)",
7566: SHOW_STR
7567: BGP_STR
7568: "Address family\n"
7569: "Address Family modifier\n"
7570: "Address Family modifier\n")
7571: {
7572: if (strncmp (argv[0], "m", 1) == 0)
7573: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
7574: NULL);
7575:
7576: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
7577: }
7578:
7579: DEFUN (show_bgp_ipv6_route,
7580: show_bgp_ipv6_route_cmd,
7581: "show bgp ipv6 X:X::X:X",
7582: SHOW_STR
7583: BGP_STR
7584: "Address family\n"
7585: "Network in the BGP routing table to display\n")
7586: {
7587: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
7588: }
7589:
7590: DEFUN (show_bgp_ipv6_safi_route,
7591: show_bgp_ipv6_safi_route_cmd,
7592: "show bgp ipv6 (unicast|multicast) X:X::X:X",
7593: SHOW_STR
7594: BGP_STR
7595: "Address family\n"
7596: "Address Family modifier\n"
7597: "Address Family modifier\n"
7598: "Network in the BGP routing table to display\n")
7599: {
7600: if (strncmp (argv[0], "m", 1) == 0)
7601: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
7602:
7603: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
7604: }
7605:
7606: /* old command */
7607: DEFUN (show_ipv6_bgp_route,
7608: show_ipv6_bgp_route_cmd,
7609: "show ipv6 bgp X:X::X:X",
7610: SHOW_STR
7611: IP_STR
7612: BGP_STR
7613: "Network in the BGP routing table to display\n")
7614: {
7615: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
7616: }
7617:
7618: DEFUN (show_bgp_prefix,
7619: show_bgp_prefix_cmd,
7620: "show bgp X:X::X:X/M",
7621: SHOW_STR
7622: BGP_STR
7623: "IPv6 prefix <network>/<length>\n")
7624: {
7625: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
7626: }
7627:
7628:
7629: /* new002 */
7630: DEFUN (show_bgp_ipv6_prefix,
7631: show_bgp_ipv6_prefix_cmd,
7632: "show bgp ipv6 X:X::X:X/M",
7633: SHOW_STR
7634: BGP_STR
7635: "Address family\n"
7636: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7637: {
7638: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
7639: }
7640: DEFUN (show_bgp_ipv6_safi_prefix,
7641: show_bgp_ipv6_safi_prefix_cmd,
7642: "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
7643: SHOW_STR
7644: BGP_STR
7645: "Address family\n"
7646: "Address Family modifier\n"
7647: "Address Family modifier\n"
7648: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7649: {
7650: if (strncmp (argv[0], "m", 1) == 0)
7651: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
7652:
7653: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
7654: }
7655:
7656: /* old command */
7657: DEFUN (show_ipv6_bgp_prefix,
7658: show_ipv6_bgp_prefix_cmd,
7659: "show ipv6 bgp X:X::X:X/M",
7660: SHOW_STR
7661: IP_STR
7662: BGP_STR
7663: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7664: {
7665: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
7666: }
7667:
7668: DEFUN (show_bgp_view,
7669: show_bgp_view_cmd,
7670: "show bgp view WORD",
7671: SHOW_STR
7672: BGP_STR
7673: "BGP view\n"
7674: "View name\n")
7675: {
7676: struct bgp *bgp;
7677:
7678: /* BGP structure lookup. */
7679: bgp = bgp_lookup_by_name (argv[0]);
7680: if (bgp == NULL)
7681: {
7682: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7683: return CMD_WARNING;
7684: }
7685:
7686: return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
7687: }
7688:
7689: DEFUN (show_bgp_view_ipv6,
7690: show_bgp_view_ipv6_cmd,
7691: "show bgp view WORD ipv6",
7692: SHOW_STR
7693: BGP_STR
7694: "BGP view\n"
7695: "View name\n"
7696: "Address family\n")
7697: {
7698: struct bgp *bgp;
7699:
7700: /* BGP structure lookup. */
7701: bgp = bgp_lookup_by_name (argv[0]);
7702: if (bgp == NULL)
7703: {
7704: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7705: return CMD_WARNING;
7706: }
7707:
7708: return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
7709: }
7710:
7711: DEFUN (show_bgp_view_route,
7712: show_bgp_view_route_cmd,
7713: "show bgp view WORD X:X::X:X",
7714: SHOW_STR
7715: BGP_STR
7716: "BGP view\n"
7717: "View name\n"
7718: "Network in the BGP routing table to display\n")
7719: {
7720: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
7721: }
7722:
7723: DEFUN (show_bgp_view_ipv6_route,
7724: show_bgp_view_ipv6_route_cmd,
7725: "show bgp view WORD ipv6 X:X::X:X",
7726: SHOW_STR
7727: BGP_STR
7728: "BGP view\n"
7729: "View name\n"
7730: "Address family\n"
7731: "Network in the BGP routing table to display\n")
7732: {
7733: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
7734: }
7735:
7736: /* old command */
7737: DEFUN (show_ipv6_mbgp,
7738: show_ipv6_mbgp_cmd,
7739: "show ipv6 mbgp",
7740: SHOW_STR
7741: IP_STR
7742: MBGP_STR)
7743: {
7744: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
7745: NULL);
7746: }
7747:
7748: /* old command */
7749: DEFUN (show_ipv6_mbgp_route,
7750: show_ipv6_mbgp_route_cmd,
7751: "show ipv6 mbgp X:X::X:X",
7752: SHOW_STR
7753: IP_STR
7754: MBGP_STR
7755: "Network in the MBGP routing table to display\n")
7756: {
7757: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
7758: }
7759:
7760: /* old command */
7761: DEFUN (show_ipv6_mbgp_prefix,
7762: show_ipv6_mbgp_prefix_cmd,
7763: "show ipv6 mbgp X:X::X:X/M",
7764: SHOW_STR
7765: IP_STR
7766: MBGP_STR
7767: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
7768: {
7769: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
7770: }
7771:
7772: DEFUN (show_bgp_view_prefix,
7773: show_bgp_view_prefix_cmd,
7774: "show bgp view WORD X:X::X:X/M",
7775: SHOW_STR
7776: BGP_STR
7777: "BGP view\n"
7778: "View name\n"
7779: "IPv6 prefix <network>/<length>\n")
7780: {
7781: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
7782: }
7783:
7784: DEFUN (show_bgp_view_ipv6_prefix,
7785: show_bgp_view_ipv6_prefix_cmd,
7786: "show bgp view WORD ipv6 X:X::X:X/M",
7787: SHOW_STR
7788: BGP_STR
7789: "BGP view\n"
7790: "View name\n"
7791: "Address family\n"
7792: "IPv6 prefix <network>/<length>\n")
7793: {
7794: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
7795: }
7796:
7797: static int
7798: bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
7799: safi_t safi, enum bgp_show_type type)
7800: {
7801: int i;
7802: struct buffer *b;
7803: char *regstr;
7804: int first;
7805: regex_t *regex;
7806: int rc;
7807:
7808: first = 0;
7809: b = buffer_new (1024);
7810: for (i = 0; i < argc; i++)
7811: {
7812: if (first)
7813: buffer_putc (b, ' ');
7814: else
7815: {
7816: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7817: continue;
7818: first = 1;
7819: }
7820:
7821: buffer_putstr (b, argv[i]);
7822: }
7823: buffer_putc (b, '\0');
7824:
7825: regstr = buffer_getstr (b);
7826: buffer_free (b);
7827:
7828: regex = bgp_regcomp (regstr);
7829: XFREE(MTYPE_TMP, regstr);
7830: if (! regex)
7831: {
7832: vty_out (vty, "Can't compile regexp %s%s", argv[0],
7833: VTY_NEWLINE);
7834: return CMD_WARNING;
7835: }
7836:
7837: rc = bgp_show (vty, NULL, afi, safi, type, regex);
7838: bgp_regex_free (regex);
7839: return rc;
7840: }
7841:
7842:
7843: DEFUN (show_ip_bgp_regexp,
7844: show_ip_bgp_regexp_cmd,
7845: "show ip bgp regexp .LINE",
7846: SHOW_STR
7847: IP_STR
7848: BGP_STR
7849: "Display routes matching the AS path regular expression\n"
7850: "A regular-expression to match the BGP AS paths\n")
7851: {
7852: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7853: bgp_show_type_regexp);
7854: }
7855:
7856: DEFUN (show_ip_bgp_flap_regexp,
7857: show_ip_bgp_flap_regexp_cmd,
7858: "show ip bgp flap-statistics regexp .LINE",
7859: SHOW_STR
7860: IP_STR
7861: BGP_STR
7862: "Display flap statistics of routes\n"
7863: "Display routes matching the AS path regular expression\n"
7864: "A regular-expression to match the BGP AS paths\n")
7865: {
7866: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7867: bgp_show_type_flap_regexp);
7868: }
7869:
7870: ALIAS (show_ip_bgp_flap_regexp,
7871: show_ip_bgp_damp_flap_regexp_cmd,
7872: "show ip bgp dampening flap-statistics regexp .LINE",
7873: SHOW_STR
7874: IP_STR
7875: BGP_STR
7876: "Display detailed information about dampening\n"
7877: "Display flap statistics of routes\n"
7878: "Display routes matching the AS path regular expression\n"
7879: "A regular-expression to match the BGP AS paths\n")
7880:
7881: DEFUN (show_ip_bgp_ipv4_regexp,
7882: show_ip_bgp_ipv4_regexp_cmd,
7883: "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7884: SHOW_STR
7885: IP_STR
7886: BGP_STR
7887: "Address family\n"
7888: "Address Family modifier\n"
7889: "Address Family modifier\n"
7890: "Display routes matching the AS path regular expression\n"
7891: "A regular-expression to match the BGP AS paths\n")
7892: {
7893: if (strncmp (argv[0], "m", 1) == 0)
7894: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7895: bgp_show_type_regexp);
7896:
7897: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7898: bgp_show_type_regexp);
7899: }
7900:
7901: DEFUN (show_bgp_regexp,
7902: show_bgp_regexp_cmd,
7903: "show bgp regexp .LINE",
7904: SHOW_STR
7905: BGP_STR
7906: "Display routes matching the AS path regular expression\n"
7907: "A regular-expression to match the BGP AS paths\n")
7908: {
7909: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7910: bgp_show_type_regexp);
7911: }
7912:
7913: /* old command */
7914: DEFUN (show_ipv6_bgp_regexp,
7915: show_ipv6_bgp_regexp_cmd,
7916: "show ipv6 bgp regexp .LINE",
7917: SHOW_STR
7918: IP_STR
7919: BGP_STR
7920: "Display routes matching the AS path regular expression\n"
7921: "A regular-expression to match the BGP AS paths\n")
7922: {
7923: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7924: bgp_show_type_regexp);
7925: }
7926:
7927: /* old command */
7928: DEFUN (show_ipv6_mbgp_regexp,
7929: show_ipv6_mbgp_regexp_cmd,
7930: "show ipv6 mbgp regexp .LINE",
7931: SHOW_STR
7932: IP_STR
7933: BGP_STR
7934: "Display routes matching the AS path regular expression\n"
7935: "A regular-expression to match the MBGP AS paths\n")
7936: {
7937: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7938: bgp_show_type_regexp);
7939: }
7940:
7941: DEFUN (show_bgp_ipv4_safi_flap_regexp,
7942: show_bgp_ipv4_safi_flap_regexp_cmd,
7943: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics regexp .LINE",
7944: SHOW_STR
7945: BGP_STR
7946: IP_STR
7947: "Address Family Modifier\n"
7948: "Address Family Modifier\n"
7949: "Address Family Modifier\n"
7950: "Address Family Modifier\n"
7951: "Display flap statistics of routes\n"
7952: "Display routes matching the AS path regular expression\n"
7953: "A regular-expression to match the BGP AS paths\n")
7954: {
7955: safi_t safi;
7956:
7957: if (bgp_parse_safi(argv[0], &safi)) {
7958: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
7959: return CMD_WARNING;
7960: }
7961: return bgp_show_regexp (vty, argc-1, argv+1, AFI_IP, safi,
7962: bgp_show_type_flap_regexp);
7963: }
7964:
7965: ALIAS (show_bgp_ipv4_safi_flap_regexp,
7966: show_bgp_ipv4_safi_damp_flap_regexp_cmd,
7967: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics regexp .LINE",
7968: SHOW_STR
7969: BGP_STR
7970: IP_STR
7971: "Address Family Modifier\n"
7972: "Address Family Modifier\n"
7973: "Address Family Modifier\n"
7974: "Address Family Modifier\n"
7975: "Display detailed information about dampening\n"
7976: "Display flap statistics of routes\n"
7977: "Display routes matching the AS path regular expression\n"
7978: "A regular-expression to match the BGP AS paths\n")
7979:
7980: DEFUN (show_bgp_ipv6_safi_flap_regexp,
7981: show_bgp_ipv6_safi_flap_regexp_cmd,
7982: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics regexp .LINE",
7983: SHOW_STR
7984: BGP_STR
7985: IPV6_STR
7986: "Address Family Modifier\n"
7987: "Address Family Modifier\n"
7988: "Address Family Modifier\n"
7989: "Address Family Modifier\n"
7990: "Display flap statistics of routes\n"
7991: "Display routes matching the AS path regular expression\n"
7992: "A regular-expression to match the BGP AS paths\n")
7993: {
7994: safi_t safi;
7995:
7996: if (bgp_parse_safi(argv[0], &safi)) {
7997: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
7998: return CMD_WARNING;
7999: }
8000: return bgp_show_regexp (vty, argc-1, argv+1, AFI_IP6, safi,
8001: bgp_show_type_flap_regexp);
8002: }
8003:
8004: ALIAS (show_bgp_ipv6_safi_flap_regexp,
8005: show_bgp_ipv6_safi_damp_flap_regexp_cmd,
8006: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics regexp .LINE",
8007: SHOW_STR
8008: BGP_STR
8009: IPV6_STR
8010: "Address Family Modifier\n"
8011: "Address Family Modifier\n"
8012: "Address Family Modifier\n"
8013: "Address Family Modifier\n"
8014: "Display detailed information about dampening\n"
8015: "Display flap statistics of routes\n"
8016: "Display routes matching the AS path regular expression\n"
8017: "A regular-expression to match the BGP AS paths\n")
8018:
8019: DEFUN (show_bgp_ipv4_safi_regexp,
8020: show_bgp_ipv4_safi_regexp_cmd,
8021: "show bgp ipv4 (encap|multicast|unicast|vpn) regexp .LINE",
8022: SHOW_STR
8023: BGP_STR
8024: "Address family\n"
8025: "Address Family modifier\n"
8026: "Address Family modifier\n"
8027: "Address Family modifier\n"
8028: "Address Family modifier\n"
8029: "Display routes matching the AS path regular expression\n"
8030: "A regular-expression to match the BGP AS paths\n")
8031: {
8032: safi_t safi;
8033: if (bgp_parse_safi(argv[0], &safi)) {
8034: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8035: return CMD_WARNING;
8036: }
8037:
8038: return bgp_show_regexp (vty, argc-1, argv+1, AFI_IP, safi,
8039: bgp_show_type_regexp);
8040: }
8041:
8042: DEFUN (show_bgp_ipv6_safi_regexp,
8043: show_bgp_ipv6_safi_regexp_cmd,
8044: "show bgp ipv6 (encap|multicast|unicast|vpn) regexp .LINE",
8045: SHOW_STR
8046: BGP_STR
8047: "Address family\n"
8048: "Address Family modifier\n"
8049: "Address Family modifier\n"
8050: "Address Family modifier\n"
8051: "Address Family modifier\n"
8052: "Display routes matching the AS path regular expression\n"
8053: "A regular-expression to match the BGP AS paths\n")
8054: {
8055: safi_t safi;
8056: if (bgp_parse_safi(argv[0], &safi)) {
8057: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8058: return CMD_WARNING;
8059: }
8060:
8061: return bgp_show_regexp (vty, argc-1, argv+1, AFI_IP6, safi,
8062: bgp_show_type_regexp);
8063: }
8064:
8065: DEFUN (show_bgp_ipv6_regexp,
8066: show_bgp_ipv6_regexp_cmd,
8067: "show bgp ipv6 regexp .LINE",
8068: SHOW_STR
8069: BGP_STR
8070: "Address family\n"
8071: "Display routes matching the AS path regular expression\n"
8072: "A regular-expression to match the BGP AS paths\n")
8073: {
8074: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
8075: bgp_show_type_regexp);
8076: }
8077:
8078: static int
8079: bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
8080: safi_t safi, enum bgp_show_type type)
8081: {
8082: struct prefix_list *plist;
8083:
8084: plist = prefix_list_lookup (afi, prefix_list_str);
8085: if (plist == NULL)
8086: {
8087: vty_out (vty, "%% %s is not a valid prefix-list name%s",
8088: prefix_list_str, VTY_NEWLINE);
8089: return CMD_WARNING;
8090: }
8091:
8092: return bgp_show (vty, NULL, afi, safi, type, plist);
8093: }
8094: DEFUN (show_ip_bgp_prefix_list,
8095: show_ip_bgp_prefix_list_cmd,
8096: "show ip bgp prefix-list WORD",
8097: SHOW_STR
8098: IP_STR
8099: BGP_STR
8100: "Display routes conforming to the prefix-list\n"
8101: "IP prefix-list name\n")
8102: {
8103: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8104: bgp_show_type_prefix_list);
8105: }
8106:
8107: DEFUN (show_ip_bgp_flap_prefix_list,
8108: show_ip_bgp_flap_prefix_list_cmd,
8109: "show ip bgp flap-statistics prefix-list WORD",
8110: SHOW_STR
8111: IP_STR
8112: BGP_STR
8113: "Display flap statistics of routes\n"
8114: "Display routes conforming to the prefix-list\n"
8115: "IP prefix-list name\n")
8116: {
8117: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8118: bgp_show_type_flap_prefix_list);
8119: }
8120:
8121: ALIAS (show_ip_bgp_flap_prefix_list,
8122: show_ip_bgp_damp_flap_prefix_list_cmd,
8123: "show ip bgp dampening flap-statistics prefix-list WORD",
8124: SHOW_STR
8125: IP_STR
8126: BGP_STR
8127: "Display detailed information about dampening\n"
8128: "Display flap statistics of routes\n"
8129: "Display routes conforming to the prefix-list\n"
8130: "IP prefix-list name\n")
8131:
8132: DEFUN (show_ip_bgp_ipv4_prefix_list,
8133: show_ip_bgp_ipv4_prefix_list_cmd,
8134: "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
8135: SHOW_STR
8136: IP_STR
8137: BGP_STR
8138: "Address family\n"
8139: "Address Family modifier\n"
8140: "Address Family modifier\n"
8141: "Display routes conforming to the prefix-list\n"
8142: "IP prefix-list name\n")
8143: {
8144: if (strncmp (argv[0], "m", 1) == 0)
8145: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8146: bgp_show_type_prefix_list);
8147:
8148: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
8149: bgp_show_type_prefix_list);
8150: }
8151:
8152: DEFUN (show_bgp_prefix_list,
8153: show_bgp_prefix_list_cmd,
8154: "show bgp prefix-list WORD",
8155: SHOW_STR
8156: BGP_STR
8157: "Display routes conforming to the prefix-list\n"
8158: "IPv6 prefix-list name\n")
8159: {
8160: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8161: bgp_show_type_prefix_list);
8162: }
8163:
8164: ALIAS (show_bgp_prefix_list,
8165: show_bgp_ipv6_prefix_list_cmd,
8166: "show bgp ipv6 prefix-list WORD",
8167: SHOW_STR
8168: BGP_STR
8169: "Address family\n"
8170: "Display routes conforming to the prefix-list\n"
8171: "IPv6 prefix-list name\n")
8172:
8173: /* old command */
8174: DEFUN (show_ipv6_bgp_prefix_list,
8175: show_ipv6_bgp_prefix_list_cmd,
8176: "show ipv6 bgp prefix-list WORD",
8177: SHOW_STR
8178: IPV6_STR
8179: BGP_STR
8180: "Display routes matching the prefix-list\n"
8181: "IPv6 prefix-list name\n")
8182: {
8183: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8184: bgp_show_type_prefix_list);
8185: }
8186:
8187: /* old command */
8188: DEFUN (show_ipv6_mbgp_prefix_list,
8189: show_ipv6_mbgp_prefix_list_cmd,
8190: "show ipv6 mbgp prefix-list WORD",
8191: SHOW_STR
8192: IPV6_STR
8193: MBGP_STR
8194: "Display routes matching the prefix-list\n"
8195: "IPv6 prefix-list name\n")
8196: {
8197: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
8198: bgp_show_type_prefix_list);
8199: }
8200:
8201: DEFUN (show_bgp_ipv4_prefix_list,
8202: show_bgp_ipv4_prefix_list_cmd,
8203: "show bgp ipv4 prefix-list WORD",
8204: SHOW_STR
8205: BGP_STR
8206: IP_STR
8207: "Display routes conforming to the prefix-list\n"
8208: "IP prefix-list name\n")
8209: {
8210: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8211: bgp_show_type_prefix_list);
8212: }
8213:
8214: DEFUN (show_bgp_ipv4_safi_flap_prefix_list,
8215: show_bgp_ipv4_safi_flap_prefix_list_cmd,
8216: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics prefix-list WORD",
8217: SHOW_STR
8218: BGP_STR
8219: IP_STR
8220: "Address Family Modifier\n"
8221: "Address Family Modifier\n"
8222: "Address Family Modifier\n"
8223: "Address Family Modifier\n"
8224: "Display flap statistics of routes\n"
8225: "Display routes conforming to the prefix-list\n"
8226: "IP prefix-list name\n")
8227: {
8228: safi_t safi;
8229: if (bgp_parse_safi(argv[0], &safi)) {
8230: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8231: return CMD_WARNING;
8232: }
8233: return bgp_show_prefix_list (vty, argv[1], AFI_IP, safi,
8234: bgp_show_type_flap_prefix_list);
8235: }
8236:
8237: ALIAS (show_bgp_ipv4_safi_flap_prefix_list,
8238: show_bgp_ipv4_safi_damp_flap_prefix_list_cmd,
8239: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics prefix-list WORD",
8240: SHOW_STR
8241: BGP_STR
8242: IP_STR
8243: "Address Family Modifier\n"
8244: "Address Family Modifier\n"
8245: "Address Family Modifier\n"
8246: "Address Family Modifier\n"
8247: "Display detailed information about dampening\n"
8248: "Display flap statistics of routes\n"
8249: "Display routes conforming to the prefix-list\n"
8250: "IP prefix-list name\n")
8251:
8252: DEFUN (show_bgp_ipv6_safi_flap_prefix_list,
8253: show_bgp_ipv6_safi_flap_prefix_list_cmd,
8254: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics prefix-list WORD",
8255: SHOW_STR
8256: BGP_STR
8257: IPV6_STR
8258: "Address Family Modifier\n"
8259: "Address Family Modifier\n"
8260: "Address Family Modifier\n"
8261: "Address Family Modifier\n"
8262: "Display flap statistics of routes\n"
8263: "Display routes conforming to the prefix-list\n"
8264: "IP prefix-list name\n")
8265: {
8266: safi_t safi;
8267: if (bgp_parse_safi(argv[0], &safi)) {
8268: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8269: return CMD_WARNING;
8270: }
8271: return bgp_show_prefix_list (vty, argv[1], AFI_IP6, safi,
8272: bgp_show_type_flap_prefix_list);
8273: }
8274: ALIAS (show_bgp_ipv6_safi_flap_prefix_list,
8275: show_bgp_ipv6_safi_damp_flap_prefix_list_cmd,
8276: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics prefix-list WORD",
8277: SHOW_STR
8278: BGP_STR
8279: IPV6_STR
8280: "Address Family Modifier\n"
8281: "Address Family Modifier\n"
8282: "Address Family Modifier\n"
8283: "Address Family Modifier\n"
8284: "Display detailed information about dampening\n"
8285: "Display flap statistics of routes\n"
8286: "Display routes conforming to the prefix-list\n"
8287: "IP prefix-list name\n")
8288:
8289: DEFUN (show_bgp_ipv4_safi_prefix_list,
8290: show_bgp_ipv4_safi_prefix_list_cmd,
8291: "show bgp ipv4 (encap|multicast|unicast|vpn) prefix-list WORD",
8292: SHOW_STR
8293: BGP_STR
8294: "Address family\n"
8295: "Address Family modifier\n"
8296: "Address Family modifier\n"
8297: "Address Family modifier\n"
8298: "Address Family modifier\n"
8299: "Display routes conforming to the prefix-list\n"
8300: "IP prefix-list name\n")
8301: {
8302: safi_t safi;
8303: if (bgp_parse_safi(argv[0], &safi)) {
8304: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8305: return CMD_WARNING;
8306: }
8307: return bgp_show_prefix_list (vty, argv[1], AFI_IP, safi,
8308: bgp_show_type_prefix_list);
8309: }
8310:
8311: DEFUN (show_bgp_ipv6_safi_prefix_list,
8312: show_bgp_ipv6_safi_prefix_list_cmd,
8313: "show bgp ipv6 (encap|multicast|unicast|vpn) prefix-list WORD",
8314: SHOW_STR
8315: BGP_STR
8316: "Address family\n"
8317: "Address Family modifier\n"
8318: "Address Family modifier\n"
8319: "Address Family modifier\n"
8320: "Address Family modifier\n"
8321: "Display routes conforming to the prefix-list\n"
8322: "IP prefix-list name\n")
8323: {
8324: safi_t safi;
8325: if (bgp_parse_safi(argv[0], &safi)) {
8326: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8327: return CMD_WARNING;
8328: }
8329: return bgp_show_prefix_list (vty, argv[1], AFI_IP6, safi,
8330: bgp_show_type_prefix_list);
8331: }
8332:
8333: static int
8334: bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
8335: safi_t safi, enum bgp_show_type type)
8336: {
8337: struct as_list *as_list;
8338:
8339: as_list = as_list_lookup (filter);
8340: if (as_list == NULL)
8341: {
8342: vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
8343: return CMD_WARNING;
8344: }
8345:
8346: return bgp_show (vty, NULL, afi, safi, type, as_list);
8347: }
8348:
8349: DEFUN (show_ip_bgp_filter_list,
8350: show_ip_bgp_filter_list_cmd,
8351: "show ip bgp filter-list WORD",
8352: SHOW_STR
8353: IP_STR
8354: BGP_STR
8355: "Display routes conforming to the filter-list\n"
8356: "Regular expression access list name\n")
8357: {
8358: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8359: bgp_show_type_filter_list);
8360: }
8361:
8362: DEFUN (show_ip_bgp_flap_filter_list,
8363: show_ip_bgp_flap_filter_list_cmd,
8364: "show ip bgp flap-statistics filter-list WORD",
8365: SHOW_STR
8366: IP_STR
8367: BGP_STR
8368: "Display flap statistics of routes\n"
8369: "Display routes conforming to the filter-list\n"
8370: "Regular expression access list name\n")
8371: {
8372: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8373: bgp_show_type_flap_filter_list);
8374: }
8375:
8376: ALIAS (show_ip_bgp_flap_filter_list,
8377: show_ip_bgp_damp_flap_filter_list_cmd,
8378: "show ip bgp dampening flap-statistics filter-list WORD",
8379: SHOW_STR
8380: IP_STR
8381: BGP_STR
8382: "Display detailed information about dampening\n"
8383: "Display flap statistics of routes\n"
8384: "Display routes conforming to the filter-list\n"
8385: "Regular expression access list name\n")
8386:
8387: DEFUN (show_ip_bgp_ipv4_filter_list,
8388: show_ip_bgp_ipv4_filter_list_cmd,
8389: "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
8390: SHOW_STR
8391: IP_STR
8392: BGP_STR
8393: "Address family\n"
8394: "Address Family modifier\n"
8395: "Address Family modifier\n"
8396: "Display routes conforming to the filter-list\n"
8397: "Regular expression access list name\n")
8398: {
8399: if (strncmp (argv[0], "m", 1) == 0)
8400: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8401: bgp_show_type_filter_list);
8402:
8403: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
8404: bgp_show_type_filter_list);
8405: }
8406:
8407: DEFUN (show_bgp_filter_list,
8408: show_bgp_filter_list_cmd,
8409: "show bgp filter-list WORD",
8410: SHOW_STR
8411: BGP_STR
8412: "Display routes conforming to the filter-list\n"
8413: "Regular expression access list name\n")
8414: {
8415: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8416: bgp_show_type_filter_list);
8417: }
8418:
8419: /* old command */
8420: DEFUN (show_ipv6_bgp_filter_list,
8421: show_ipv6_bgp_filter_list_cmd,
8422: "show ipv6 bgp filter-list WORD",
8423: SHOW_STR
8424: IPV6_STR
8425: BGP_STR
8426: "Display routes conforming to the filter-list\n"
8427: "Regular expression access list name\n")
8428: {
8429: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8430: bgp_show_type_filter_list);
8431: }
8432:
8433: /* old command */
8434: DEFUN (show_ipv6_mbgp_filter_list,
8435: show_ipv6_mbgp_filter_list_cmd,
8436: "show ipv6 mbgp filter-list WORD",
8437: SHOW_STR
8438: IPV6_STR
8439: MBGP_STR
8440: "Display routes conforming to the filter-list\n"
8441: "Regular expression access list name\n")
8442: {
8443: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
8444: bgp_show_type_filter_list);
8445: }
8446:
8447: DEFUN (show_ip_bgp_dampening_info,
8448: show_ip_bgp_dampening_params_cmd,
8449: "show ip bgp dampening parameters",
8450: SHOW_STR
8451: IP_STR
8452: BGP_STR
8453: "Display detailed information about dampening\n"
8454: "Display detail of configured dampening parameters\n")
8455: {
8456: return bgp_show_dampening_parameters (vty, AFI_IP, SAFI_UNICAST);
8457: }
8458:
8459: DEFUN (show_bgp_ipv4_filter_list,
8460: show_bgp_ipv4_filter_list_cmd,
8461: "show bgp ipv4 filter-list WORD",
8462: SHOW_STR
8463: BGP_STR
8464: IP_STR
8465: "Display routes conforming to the filter-list\n"
8466: "Regular expression access list name\n")
8467: {
8468: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
8469: bgp_show_type_filter_list);
8470: }
8471:
8472: DEFUN (show_bgp_ipv4_safi_flap_filter_list,
8473: show_bgp_ipv4_safi_flap_filter_list_cmd,
8474: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics filter-list WORD",
8475: SHOW_STR
8476: BGP_STR
8477: IP_STR
8478: "Address Family modifier\n"
8479: "Address Family modifier\n"
8480: "Address Family modifier\n"
8481: "Address Family modifier\n"
8482: "Display flap statistics of routes\n"
8483: "Display routes conforming to the filter-list\n"
8484: "Regular expression access list name\n")
8485: {
8486: safi_t safi;
8487:
8488: if (bgp_parse_safi(argv[0], &safi)) {
8489: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8490: return CMD_WARNING;
8491: }
8492: return bgp_show_filter_list (vty, argv[1], AFI_IP, safi,
8493: bgp_show_type_flap_filter_list);
8494: }
8495:
8496: ALIAS (show_bgp_ipv4_safi_flap_filter_list,
8497: show_bgp_ipv4_safi_damp_flap_filter_list_cmd,
8498: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics filter-list WORD",
8499: SHOW_STR
8500: BGP_STR
8501: IP_STR
8502: "Address Family modifier\n"
8503: "Address Family modifier\n"
8504: "Address Family modifier\n"
8505: "Address Family modifier\n"
8506: "Display detailed information about dampening\n"
8507: "Display flap statistics of routes\n"
8508: "Display routes conforming to the filter-list\n"
8509: "Regular expression access list name\n")
8510:
8511: DEFUN (show_bgp_ipv6_safi_flap_filter_list,
8512: show_bgp_ipv6_safi_flap_filter_list_cmd,
8513: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics filter-list WORD",
8514: SHOW_STR
8515: BGP_STR
8516: IPV6_STR
8517: "Address Family modifier\n"
8518: "Address Family modifier\n"
8519: "Address Family modifier\n"
8520: "Address Family modifier\n"
8521: "Display flap statistics of routes\n"
8522: "Display routes conforming to the filter-list\n"
8523: "Regular expression access list name\n")
8524: {
8525: safi_t safi;
8526:
8527: if (bgp_parse_safi(argv[0], &safi)) {
8528: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8529: return CMD_WARNING;
8530: }
8531: return bgp_show_filter_list (vty, argv[1], AFI_IP6, safi,
8532: bgp_show_type_flap_filter_list);
8533: }
8534: ALIAS (show_bgp_ipv6_safi_flap_filter_list,
8535: show_bgp_ipv6_safi_damp_flap_filter_list_cmd,
8536: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics filter-list WORD",
8537: SHOW_STR
8538: BGP_STR
8539: IPV6_STR
8540: "Address Family modifier\n"
8541: "Address Family modifier\n"
8542: "Address Family modifier\n"
8543: "Address Family modifier\n"
8544: "Display detailed information about dampening\n"
8545: "Display flap statistics of routes\n"
8546: "Display routes conforming to the filter-list\n"
8547: "Regular expression access list name\n")
8548:
8549: DEFUN (show_bgp_ipv4_safi_filter_list,
8550: show_bgp_ipv4_safi_filter_list_cmd,
8551: "show bgp ipv4 (encap|multicast|unicast|vpn) filter-list WORD",
8552: SHOW_STR
8553: BGP_STR
8554: "Address Family modifier\n"
8555: "Address Family modifier\n"
8556: "Address Family modifier\n"
8557: "Address Family modifier\n"
8558: "Display routes conforming to the filter-list\n"
8559: "Regular expression access list name\n")
8560: {
8561: safi_t safi;
8562:
8563: if (bgp_parse_safi(argv[0], &safi)) {
8564: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8565: return CMD_WARNING;
8566: }
8567: return bgp_show_filter_list (vty, argv[1], AFI_IP, safi,
8568: bgp_show_type_filter_list);
8569: }
8570:
8571: DEFUN (show_bgp_ipv6_safi_filter_list,
8572: show_bgp_ipv6_safi_filter_list_cmd,
8573: "show bgp ipv6 (encap|multicast|unicast|vpn) filter-list WORD",
8574: SHOW_STR
8575: BGP_STR
8576: "Address Family modifier\n"
8577: "Address Family modifier\n"
8578: "Address Family modifier\n"
8579: "Address Family modifier\n"
8580: "Display routes conforming to the filter-list\n"
8581: "Regular expression access list name\n")
8582: {
8583: safi_t safi;
8584:
8585: if (bgp_parse_safi(argv[0], &safi)) {
8586: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8587: return CMD_WARNING;
8588: }
8589: return bgp_show_filter_list (vty, argv[1], AFI_IP6, safi,
8590: bgp_show_type_filter_list);
8591: }
8592:
8593: DEFUN (show_bgp_ipv6_filter_list,
8594: show_bgp_ipv6_filter_list_cmd,
8595: "show bgp ipv6 filter-list WORD",
8596: SHOW_STR
8597: BGP_STR
8598: "Address family\n"
8599: "Display routes conforming to the filter-list\n"
8600: "Regular expression access list name\n")
8601: {
8602: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8603: bgp_show_type_filter_list);
8604: }
8605:
8606: static int
8607: bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
8608: safi_t safi, enum bgp_show_type type)
8609: {
8610: struct route_map *rmap;
8611:
8612: rmap = route_map_lookup_by_name (rmap_str);
8613: if (! rmap)
8614: {
8615: vty_out (vty, "%% %s is not a valid route-map name%s",
8616: rmap_str, VTY_NEWLINE);
8617: return CMD_WARNING;
8618: }
8619:
8620: return bgp_show (vty, NULL, afi, safi, type, rmap);
8621: }
8622:
8623: DEFUN (show_ip_bgp_route_map,
8624: show_ip_bgp_route_map_cmd,
8625: "show ip bgp route-map WORD",
8626: SHOW_STR
8627: IP_STR
8628: BGP_STR
8629: "Display routes matching the route-map\n"
8630: "A route-map to match on\n")
8631: {
8632: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
8633: bgp_show_type_route_map);
8634: }
8635:
8636: DEFUN (show_ip_bgp_flap_route_map,
8637: show_ip_bgp_flap_route_map_cmd,
8638: "show ip bgp flap-statistics route-map WORD",
8639: SHOW_STR
8640: IP_STR
8641: BGP_STR
8642: "Display flap statistics of routes\n"
8643: "Display routes matching the route-map\n"
8644: "A route-map to match on\n")
8645: {
8646: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
8647: bgp_show_type_flap_route_map);
8648: }
8649:
8650: ALIAS (show_ip_bgp_flap_route_map,
8651: show_ip_bgp_damp_flap_route_map_cmd,
8652: "show ip bgp dampening flap-statistics route-map WORD",
8653: SHOW_STR
8654: IP_STR
8655: BGP_STR
8656: "Display detailed information about dampening\n"
8657: "Display flap statistics of routes\n"
8658: "Display routes matching the route-map\n"
8659: "A route-map to match on\n")
8660:
8661: DEFUN (show_ip_bgp_ipv4_route_map,
8662: show_ip_bgp_ipv4_route_map_cmd,
8663: "show ip bgp ipv4 (unicast|multicast) route-map WORD",
8664: SHOW_STR
8665: IP_STR
8666: BGP_STR
8667: "Address family\n"
8668: "Address Family modifier\n"
8669: "Address Family modifier\n"
8670: "Display routes matching the route-map\n"
8671: "A route-map to match on\n")
8672: {
8673: if (strncmp (argv[0], "m", 1) == 0)
8674: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8675: bgp_show_type_route_map);
8676:
8677: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
8678: bgp_show_type_route_map);
8679: }
8680:
8681: DEFUN (show_bgp_route_map,
8682: show_bgp_route_map_cmd,
8683: "show bgp route-map WORD",
8684: SHOW_STR
8685: BGP_STR
8686: "Display routes matching the route-map\n"
8687: "A route-map to match on\n")
8688: {
8689: return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8690: bgp_show_type_route_map);
8691: }
8692:
8693: DEFUN (show_ip_bgp_cidr_only,
8694: show_ip_bgp_cidr_only_cmd,
8695: "show ip bgp cidr-only",
8696: SHOW_STR
8697: IP_STR
8698: BGP_STR
8699: "Display only routes with non-natural netmasks\n")
8700: {
8701: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8702: bgp_show_type_cidr_only, NULL);
8703: }
8704:
8705: DEFUN (show_ip_bgp_flap_cidr_only,
8706: show_ip_bgp_flap_cidr_only_cmd,
8707: "show ip bgp flap-statistics cidr-only",
8708: SHOW_STR
8709: IP_STR
8710: BGP_STR
8711: "Display flap statistics of routes\n"
8712: "Display only routes with non-natural netmasks\n")
8713: {
8714: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8715: bgp_show_type_flap_cidr_only, NULL);
8716: }
8717:
8718: ALIAS (show_ip_bgp_flap_cidr_only,
8719: show_ip_bgp_damp_flap_cidr_only_cmd,
8720: "show ip bgp dampening flap-statistics cidr-only",
8721: SHOW_STR
8722: IP_STR
8723: BGP_STR
8724: "Display detailed information about dampening\n"
8725: "Display flap statistics of routes\n"
8726: "Display only routes with non-natural netmasks\n")
8727:
8728: DEFUN (show_ip_bgp_ipv4_cidr_only,
8729: show_ip_bgp_ipv4_cidr_only_cmd,
8730: "show ip bgp ipv4 (unicast|multicast) cidr-only",
8731: SHOW_STR
8732: IP_STR
8733: BGP_STR
8734: "Address family\n"
8735: "Address Family modifier\n"
8736: "Address Family modifier\n"
8737: "Display only routes with non-natural netmasks\n")
8738: {
8739: if (strncmp (argv[0], "m", 1) == 0)
8740: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
8741: bgp_show_type_cidr_only, NULL);
8742:
8743: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8744: bgp_show_type_cidr_only, NULL);
8745: }
8746:
8747: DEFUN (show_ip_bgp_community_all,
8748: show_ip_bgp_community_all_cmd,
8749: "show ip bgp community",
8750: SHOW_STR
8751: IP_STR
8752: BGP_STR
8753: "Display routes matching the communities\n")
8754: {
8755: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8756: bgp_show_type_community_all, NULL);
8757: }
8758:
8759: DEFUN (show_ip_bgp_ipv4_community_all,
8760: show_ip_bgp_ipv4_community_all_cmd,
8761: "show ip bgp ipv4 (unicast|multicast) community",
8762: SHOW_STR
8763: IP_STR
8764: BGP_STR
8765: "Address family\n"
8766: "Address Family modifier\n"
8767: "Address Family modifier\n"
8768: "Display routes matching the communities\n")
8769: {
8770: if (strncmp (argv[0], "m", 1) == 0)
8771: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
8772: bgp_show_type_community_all, NULL);
8773:
8774: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8775: bgp_show_type_community_all, NULL);
8776: }
8777:
8778: DEFUN (show_bgp_community_all,
8779: show_bgp_community_all_cmd,
8780: "show bgp community",
8781: SHOW_STR
8782: BGP_STR
8783: "Display routes matching the communities\n")
8784: {
8785: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
8786: bgp_show_type_community_all, NULL);
8787: }
8788:
8789: ALIAS (show_bgp_community_all,
8790: show_bgp_ipv6_community_all_cmd,
8791: "show bgp ipv6 community",
8792: SHOW_STR
8793: BGP_STR
8794: "Address family\n"
8795: "Display routes matching the communities\n")
8796:
8797: /* old command */
8798: DEFUN (show_ipv6_bgp_community_all,
8799: show_ipv6_bgp_community_all_cmd,
8800: "show ipv6 bgp community",
8801: SHOW_STR
8802: IPV6_STR
8803: BGP_STR
8804: "Display routes matching the communities\n")
8805: {
8806: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
8807: bgp_show_type_community_all, NULL);
8808: }
8809:
8810: /* old command */
8811: DEFUN (show_ipv6_mbgp_community_all,
8812: show_ipv6_mbgp_community_all_cmd,
8813: "show ipv6 mbgp community",
8814: SHOW_STR
8815: IPV6_STR
8816: MBGP_STR
8817: "Display routes matching the communities\n")
8818: {
8819: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
8820: bgp_show_type_community_all, NULL);
8821: }
8822:
8823: DEFUN (show_bgp_ipv4_route_map,
8824: show_bgp_ipv4_route_map_cmd,
8825: "show bgp ipv4 route-map WORD",
8826: SHOW_STR
8827: BGP_STR
8828: IP_STR
8829: "Display routes matching the route-map\n"
8830: "A route-map to match on\n")
8831: {
8832: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
8833: bgp_show_type_route_map);
8834: }
8835:
8836: DEFUN (show_bgp_ipv4_safi_flap_route_map,
8837: show_bgp_ipv4_safi_flap_route_map_cmd,
8838: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics route-map WORD",
8839: SHOW_STR
8840: BGP_STR
8841: IP_STR
8842: "Address Family Modifier\n"
8843: "Address Family Modifier\n"
8844: "Address Family Modifier\n"
8845: "Address Family Modifier\n"
8846: "Display flap statistics of routes\n"
8847: "Display routes matching the route-map\n"
8848: "A route-map to match on\n")
8849: {
8850: safi_t safi;
8851: if (bgp_parse_safi(argv[0], &safi)) {
8852: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8853: return CMD_WARNING;
8854: }
8855: return bgp_show_route_map (vty, argv[1], AFI_IP, safi,
8856: bgp_show_type_flap_route_map);
8857: }
8858:
8859: ALIAS (show_bgp_ipv4_safi_flap_route_map,
8860: show_bgp_ipv4_safi_damp_flap_route_map_cmd,
8861: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics route-map WORD",
8862: SHOW_STR
8863: BGP_STR
8864: IP_STR
8865: "Address Family Modifier\n"
8866: "Address Family Modifier\n"
8867: "Address Family Modifier\n"
8868: "Address Family Modifier\n"
8869: "Display detailed information about dampening\n"
8870: "Display flap statistics of routes\n"
8871: "Display routes matching the route-map\n"
8872: "A route-map to match on\n")
8873:
8874: DEFUN (show_bgp_ipv6_safi_flap_route_map,
8875: show_bgp_ipv6_safi_flap_route_map_cmd,
8876: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics route-map WORD",
8877: SHOW_STR
8878: BGP_STR
8879: IPV6_STR
8880: "Address Family Modifier\n"
8881: "Address Family Modifier\n"
8882: "Address Family Modifier\n"
8883: "Address Family Modifier\n"
8884: "Display flap statistics of routes\n"
8885: "Display routes matching the route-map\n"
8886: "A route-map to match on\n")
8887: {
8888: safi_t safi;
8889: if (bgp_parse_safi(argv[0], &safi)) {
8890: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8891: return CMD_WARNING;
8892: }
8893: return bgp_show_route_map (vty, argv[1], AFI_IP6, safi,
8894: bgp_show_type_flap_route_map);
8895: }
8896: ALIAS (show_bgp_ipv6_safi_flap_route_map,
8897: show_bgp_ipv6_safi_damp_flap_route_map_cmd,
8898: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics route-map WORD",
8899: SHOW_STR
8900: BGP_STR
8901: IPV6_STR
8902: "Address Family Modifier\n"
8903: "Address Family Modifier\n"
8904: "Address Family Modifier\n"
8905: "Address Family Modifier\n"
8906: "Display detailed information about dampening\n"
8907: "Display flap statistics of routes\n"
8908: "Display routes matching the route-map\n"
8909: "A route-map to match on\n")
8910:
8911: DEFUN (show_bgp_ipv4_safi_route_map,
8912: show_bgp_ipv4_safi_route_map_cmd,
8913: "show bgp ipv4 (encap|multicast|unicast|vpn) route-map WORD",
8914: SHOW_STR
8915: BGP_STR
8916: "Address family\n"
8917: "Address Family modifier\n"
8918: "Address Family modifier\n"
8919: "Address Family modifier\n"
8920: "Address Family modifier\n"
8921: "Display routes matching the route-map\n"
8922: "A route-map to match on\n")
8923: {
8924: safi_t safi;
8925: if (bgp_parse_safi(argv[0], &safi)) {
8926: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8927: return CMD_WARNING;
8928: }
8929: return bgp_show_route_map (vty, argv[1], AFI_IP, safi,
8930: bgp_show_type_route_map);
8931: }
8932:
8933: DEFUN (show_bgp_ipv6_safi_route_map,
8934: show_bgp_ipv6_safi_route_map_cmd,
8935: "show bgp ipv6 (encap|multicast|unicast|vpn) route-map WORD",
8936: SHOW_STR
8937: BGP_STR
8938: "Address family\n"
8939: "Address Family modifier\n"
8940: "Address Family modifier\n"
8941: "Address Family modifier\n"
8942: "Address Family modifier\n"
8943: "Display routes matching the route-map\n"
8944: "A route-map to match on\n")
8945: {
8946: safi_t safi;
8947: if (bgp_parse_safi(argv[0], &safi)) {
8948: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8949: return CMD_WARNING;
8950: }
8951: return bgp_show_route_map (vty, argv[1], AFI_IP6, safi,
8952: bgp_show_type_route_map);
8953: }
8954:
8955: DEFUN (show_bgp_ipv6_route_map,
8956: show_bgp_ipv6_route_map_cmd,
8957: "show bgp ipv6 route-map WORD",
8958: SHOW_STR
8959: BGP_STR
8960: "Address family\n"
8961: "Display routes matching the route-map\n"
8962: "A route-map to match on\n")
8963: {
8964: return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
8965: bgp_show_type_route_map);
8966: }
8967:
8968: DEFUN (show_bgp_ipv4_cidr_only,
8969: show_bgp_ipv4_cidr_only_cmd,
8970: "show bgp ipv4 cidr-only",
8971: SHOW_STR
8972: BGP_STR
8973: IP_STR
8974: "Display only routes with non-natural netmasks\n")
8975: {
8976: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
8977: bgp_show_type_cidr_only, NULL);
8978: }
8979:
8980: DEFUN (show_bgp_ipv4_safi_flap_cidr_only,
8981: show_bgp_ipv4_safi_flap_cidr_only_cmd,
8982: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics cidr-only",
8983: SHOW_STR
8984: BGP_STR
8985: "Address Family\n"
8986: "Address Family Modifier\n"
8987: "Address Family Modifier\n"
8988: "Address Family Modifier\n"
8989: "Address Family Modifier\n"
8990: "Display flap statistics of routes\n"
8991: "Display only routes with non-natural netmasks\n")
8992: {
8993: safi_t safi;
8994:
8995: if (bgp_parse_safi(argv[0], &safi)) {
8996: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
8997: return CMD_WARNING;
8998: }
8999: return bgp_show (vty, NULL, AFI_IP, safi, bgp_show_type_flap_cidr_only, NULL);
9000: }
9001:
9002: ALIAS (show_bgp_ipv4_safi_flap_cidr_only,
9003: show_bgp_ipv4_safi_damp_flap_cidr_only_cmd,
9004: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics cidr-only",
9005: SHOW_STR
9006: BGP_STR
9007: "Address Family\n"
9008: "Address Family Modifier\n"
9009: "Address Family Modifier\n"
9010: "Address Family Modifier\n"
9011: "Address Family Modifier\n"
9012: "Display detailed information about dampening\n"
9013: "Display flap statistics of routes\n"
9014: "Display only routes with non-natural netmasks\n")
9015:
9016: DEFUN (show_bgp_ipv4_safi_cidr_only,
9017: show_bgp_ipv4_safi_cidr_only_cmd,
9018: "show bgp ipv4 (unicast|multicast) cidr-only",
9019: SHOW_STR
9020: BGP_STR
9021: "Address family\n"
9022: "Address Family modifier\n"
9023: "Address Family modifier\n"
9024: "Display only routes with non-natural netmasks\n")
9025: {
9026: if (strncmp (argv[0], "m", 1) == 0)
9027: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
9028: bgp_show_type_cidr_only, NULL);
9029:
9030: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
9031: bgp_show_type_cidr_only, NULL);
9032: }
9033:
9034: /* new046 */
9035: DEFUN (show_bgp_afi_safi_community_all,
9036: show_bgp_afi_safi_community_all_cmd,
9037: "show bgp (ipv4|ipv6) (encap|multicast|unicast|vpn) community",
9038: SHOW_STR
9039: BGP_STR
9040: "Address family\n"
9041: "Address family\n"
9042: "Address Family modifier\n"
9043: "Address Family modifier\n"
9044: "Address Family modifier\n"
9045: "Address Family modifier\n"
9046: "Display routes matching the communities\n")
9047: {
9048: safi_t safi;
9049: afi_t afi;
9050:
9051: if (bgp_parse_afi(argv[0], &afi)) {
9052: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
9053: return CMD_WARNING;
9054: }
9055: if (bgp_parse_safi(argv[1], &safi)) {
9056: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
9057: return CMD_WARNING;
9058: }
9059:
9060: return bgp_show (vty, NULL, afi, safi, bgp_show_type_community_all, NULL);
9061: }
9062: DEFUN (show_bgp_afi_community_all,
9063: show_bgp_afi_community_all_cmd,
9064: "show bgp (ipv4|ipv6) community",
9065: SHOW_STR
9066: BGP_STR
9067: "Address family\n"
9068: "Address family\n"
9069: "Display routes matching the communities\n")
9070: {
9071: afi_t afi;
9072: safi_t safi = SAFI_UNICAST;
9073:
9074: if (bgp_parse_afi(argv[0], &afi)) {
9075: vty_out (vty, "Error: Bad AFI: %s%s", argv[0], VTY_NEWLINE);
9076: return CMD_WARNING;
9077: }
9078: return bgp_show (vty, NULL, afi, safi, bgp_show_type_community_all, NULL);
9079: }
9080:
9081: static int
9082: bgp_show_community (struct vty *vty, const char *view_name, int argc,
9083: const char **argv, int exact, afi_t afi, safi_t safi)
9084: {
9085: struct community *com;
9086: struct buffer *b;
9087: struct bgp *bgp;
9088: int i;
9089: char *str;
9090: int first = 0;
9091:
9092: /* BGP structure lookup */
9093: if (view_name)
9094: {
9095: bgp = bgp_lookup_by_name (view_name);
9096: if (bgp == NULL)
9097: {
9098: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
9099: return CMD_WARNING;
9100: }
9101: }
9102: else
9103: {
9104: bgp = bgp_get_default ();
9105: if (bgp == NULL)
9106: {
9107: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
9108: return CMD_WARNING;
9109: }
9110: }
9111:
9112: b = buffer_new (1024);
9113: for (i = 0; i < argc; i++)
9114: {
9115: if (first)
9116: buffer_putc (b, ' ');
9117: else
9118: {
9119: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
9120: continue;
9121: first = 1;
9122: }
9123:
9124: buffer_putstr (b, argv[i]);
9125: }
9126: buffer_putc (b, '\0');
9127:
9128: str = buffer_getstr (b);
9129: buffer_free (b);
9130:
9131: com = community_str2com (str);
9132: XFREE (MTYPE_TMP, str);
9133: if (! com)
9134: {
9135: vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
9136: return CMD_WARNING;
9137: }
9138:
9139: return bgp_show (vty, bgp, afi, safi,
9140: (exact ? bgp_show_type_community_exact :
9141: bgp_show_type_community), com);
9142: }
9143:
9144: DEFUN (show_ip_bgp_community,
9145: show_ip_bgp_community_cmd,
9146: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
9147: SHOW_STR
9148: IP_STR
9149: BGP_STR
9150: "Display routes matching the communities\n"
9151: "community number\n"
9152: "Do not send outside local AS (well-known community)\n"
9153: "Do not advertise to any peer (well-known community)\n"
9154: "Do not export to next AS (well-known community)\n")
9155: {
9156: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
9157: }
9158:
9159: ALIAS (show_ip_bgp_community,
9160: show_ip_bgp_community2_cmd,
9161: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9162: SHOW_STR
9163: IP_STR
9164: BGP_STR
9165: "Display routes matching the communities\n"
9166: "community number\n"
9167: "Do not send outside local AS (well-known community)\n"
9168: "Do not advertise to any peer (well-known community)\n"
9169: "Do not export to next AS (well-known community)\n"
9170: "community number\n"
9171: "Do not send outside local AS (well-known community)\n"
9172: "Do not advertise to any peer (well-known community)\n"
9173: "Do not export to next AS (well-known community)\n")
9174:
9175: ALIAS (show_ip_bgp_community,
9176: show_ip_bgp_community3_cmd,
9177: "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)",
9178: SHOW_STR
9179: IP_STR
9180: BGP_STR
9181: "Display routes matching the communities\n"
9182: "community number\n"
9183: "Do not send outside local AS (well-known community)\n"
9184: "Do not advertise to any peer (well-known community)\n"
9185: "Do not export to next AS (well-known community)\n"
9186: "community number\n"
9187: "Do not send outside local AS (well-known community)\n"
9188: "Do not advertise to any peer (well-known community)\n"
9189: "Do not export to next AS (well-known community)\n"
9190: "community number\n"
9191: "Do not send outside local AS (well-known community)\n"
9192: "Do not advertise to any peer (well-known community)\n"
9193: "Do not export to next AS (well-known community)\n")
9194:
9195: ALIAS (show_ip_bgp_community,
9196: show_ip_bgp_community4_cmd,
9197: "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)",
9198: SHOW_STR
9199: IP_STR
9200: BGP_STR
9201: "Display routes matching the communities\n"
9202: "community number\n"
9203: "Do not send outside local AS (well-known community)\n"
9204: "Do not advertise to any peer (well-known community)\n"
9205: "Do not export to next AS (well-known community)\n"
9206: "community number\n"
9207: "Do not send outside local AS (well-known community)\n"
9208: "Do not advertise to any peer (well-known community)\n"
9209: "Do not export to next AS (well-known community)\n"
9210: "community number\n"
9211: "Do not send outside local AS (well-known community)\n"
9212: "Do not advertise to any peer (well-known community)\n"
9213: "Do not export to next AS (well-known community)\n"
9214: "community number\n"
9215: "Do not send outside local AS (well-known community)\n"
9216: "Do not advertise to any peer (well-known community)\n"
9217: "Do not export to next AS (well-known community)\n")
9218:
9219: DEFUN (show_ip_bgp_ipv4_community,
9220: show_ip_bgp_ipv4_community_cmd,
9221: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
9222: SHOW_STR
9223: IP_STR
9224: BGP_STR
9225: "Address family\n"
9226: "Address Family modifier\n"
9227: "Address Family modifier\n"
9228: "Display routes matching the communities\n"
9229: "community number\n"
9230: "Do not send outside local AS (well-known community)\n"
9231: "Do not advertise to any peer (well-known community)\n"
9232: "Do not export to next AS (well-known community)\n")
9233: {
9234: if (strncmp (argv[0], "m", 1) == 0)
9235: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
9236:
9237: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
9238: }
9239:
9240: ALIAS (show_ip_bgp_ipv4_community,
9241: show_ip_bgp_ipv4_community2_cmd,
9242: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9243: SHOW_STR
9244: IP_STR
9245: BGP_STR
9246: "Address family\n"
9247: "Address Family modifier\n"
9248: "Address Family modifier\n"
9249: "Display routes matching the communities\n"
9250: "community number\n"
9251: "Do not send outside local AS (well-known community)\n"
9252: "Do not advertise to any peer (well-known community)\n"
9253: "Do not export to next AS (well-known community)\n"
9254: "community number\n"
9255: "Do not send outside local AS (well-known community)\n"
9256: "Do not advertise to any peer (well-known community)\n"
9257: "Do not export to next AS (well-known community)\n")
9258:
9259: ALIAS (show_ip_bgp_ipv4_community,
9260: show_ip_bgp_ipv4_community3_cmd,
9261: "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)",
9262: SHOW_STR
9263: IP_STR
9264: BGP_STR
9265: "Address family\n"
9266: "Address Family modifier\n"
9267: "Address Family modifier\n"
9268: "Display routes matching the communities\n"
9269: "community number\n"
9270: "Do not send outside local AS (well-known community)\n"
9271: "Do not advertise to any peer (well-known community)\n"
9272: "Do not export to next AS (well-known community)\n"
9273: "community number\n"
9274: "Do not send outside local AS (well-known community)\n"
9275: "Do not advertise to any peer (well-known community)\n"
9276: "Do not export to next AS (well-known community)\n"
9277: "community number\n"
9278: "Do not send outside local AS (well-known community)\n"
9279: "Do not advertise to any peer (well-known community)\n"
9280: "Do not export to next AS (well-known community)\n")
9281:
9282: ALIAS (show_ip_bgp_ipv4_community,
9283: show_ip_bgp_ipv4_community4_cmd,
9284: "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)",
9285: SHOW_STR
9286: IP_STR
9287: BGP_STR
9288: "Address family\n"
9289: "Address Family modifier\n"
9290: "Address Family modifier\n"
9291: "Display routes matching the communities\n"
9292: "community number\n"
9293: "Do not send outside local AS (well-known community)\n"
9294: "Do not advertise to any peer (well-known community)\n"
9295: "Do not export to next AS (well-known community)\n"
9296: "community number\n"
9297: "Do not send outside local AS (well-known community)\n"
9298: "Do not advertise to any peer (well-known community)\n"
9299: "Do not export to next AS (well-known community)\n"
9300: "community number\n"
9301: "Do not send outside local AS (well-known community)\n"
9302: "Do not advertise to any peer (well-known community)\n"
9303: "Do not export to next AS (well-known community)\n"
9304: "community number\n"
9305: "Do not send outside local AS (well-known community)\n"
9306: "Do not advertise to any peer (well-known community)\n"
9307: "Do not export to next AS (well-known community)\n")
9308:
9309: DEFUN (show_ip_bgp_community_exact,
9310: show_ip_bgp_community_exact_cmd,
9311: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
9312: SHOW_STR
9313: IP_STR
9314: BGP_STR
9315: "Display routes matching the communities\n"
9316: "community number\n"
9317: "Do not send outside local AS (well-known community)\n"
9318: "Do not advertise to any peer (well-known community)\n"
9319: "Do not export to next AS (well-known community)\n"
9320: "Exact match of the communities")
9321: {
9322: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
9323: }
9324:
9325: ALIAS (show_ip_bgp_community_exact,
9326: show_ip_bgp_community2_exact_cmd,
9327: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
9328: SHOW_STR
9329: IP_STR
9330: BGP_STR
9331: "Display routes matching the communities\n"
9332: "community number\n"
9333: "Do not send outside local AS (well-known community)\n"
9334: "Do not advertise to any peer (well-known community)\n"
9335: "Do not export to next AS (well-known community)\n"
9336: "community number\n"
9337: "Do not send outside local AS (well-known community)\n"
9338: "Do not advertise to any peer (well-known community)\n"
9339: "Do not export to next AS (well-known community)\n"
9340: "Exact match of the communities")
9341:
9342: ALIAS (show_ip_bgp_community_exact,
9343: show_ip_bgp_community3_exact_cmd,
9344: "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",
9345: SHOW_STR
9346: IP_STR
9347: BGP_STR
9348: "Display routes matching the communities\n"
9349: "community number\n"
9350: "Do not send outside local AS (well-known community)\n"
9351: "Do not advertise to any peer (well-known community)\n"
9352: "Do not export to next AS (well-known community)\n"
9353: "community number\n"
9354: "Do not send outside local AS (well-known community)\n"
9355: "Do not advertise to any peer (well-known community)\n"
9356: "Do not export to next AS (well-known community)\n"
9357: "community number\n"
9358: "Do not send outside local AS (well-known community)\n"
9359: "Do not advertise to any peer (well-known community)\n"
9360: "Do not export to next AS (well-known community)\n"
9361: "Exact match of the communities")
9362:
9363: ALIAS (show_ip_bgp_community_exact,
9364: show_ip_bgp_community4_exact_cmd,
9365: "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",
9366: SHOW_STR
9367: IP_STR
9368: BGP_STR
9369: "Display routes matching the communities\n"
9370: "community number\n"
9371: "Do not send outside local AS (well-known community)\n"
9372: "Do not advertise to any peer (well-known community)\n"
9373: "Do not export to next AS (well-known community)\n"
9374: "community number\n"
9375: "Do not send outside local AS (well-known community)\n"
9376: "Do not advertise to any peer (well-known community)\n"
9377: "Do not export to next AS (well-known community)\n"
9378: "community number\n"
9379: "Do not send outside local AS (well-known community)\n"
9380: "Do not advertise to any peer (well-known community)\n"
9381: "Do not export to next AS (well-known community)\n"
9382: "community number\n"
9383: "Do not send outside local AS (well-known community)\n"
9384: "Do not advertise to any peer (well-known community)\n"
9385: "Do not export to next AS (well-known community)\n"
9386: "Exact match of the communities")
9387:
9388: DEFUN (show_ip_bgp_ipv4_community_exact,
9389: show_ip_bgp_ipv4_community_exact_cmd,
9390: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
9391: SHOW_STR
9392: IP_STR
9393: BGP_STR
9394: "Address family\n"
9395: "Address Family modifier\n"
9396: "Address Family modifier\n"
9397: "Display routes matching the communities\n"
9398: "community number\n"
9399: "Do not send outside local AS (well-known community)\n"
9400: "Do not advertise to any peer (well-known community)\n"
9401: "Do not export to next AS (well-known community)\n"
9402: "Exact match of the communities")
9403: {
9404: if (strncmp (argv[0], "m", 1) == 0)
9405: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
9406:
9407: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
9408: }
9409:
9410: ALIAS (show_ip_bgp_ipv4_community_exact,
9411: show_ip_bgp_ipv4_community2_exact_cmd,
9412: "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",
9413: SHOW_STR
9414: IP_STR
9415: BGP_STR
9416: "Address family\n"
9417: "Address Family modifier\n"
9418: "Address Family modifier\n"
9419: "Display routes matching the communities\n"
9420: "community number\n"
9421: "Do not send outside local AS (well-known community)\n"
9422: "Do not advertise to any peer (well-known community)\n"
9423: "Do not export to next AS (well-known community)\n"
9424: "community number\n"
9425: "Do not send outside local AS (well-known community)\n"
9426: "Do not advertise to any peer (well-known community)\n"
9427: "Do not export to next AS (well-known community)\n"
9428: "Exact match of the communities")
9429:
9430: ALIAS (show_ip_bgp_ipv4_community_exact,
9431: show_ip_bgp_ipv4_community3_exact_cmd,
9432: "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",
9433: SHOW_STR
9434: IP_STR
9435: BGP_STR
9436: "Address family\n"
9437: "Address Family modifier\n"
9438: "Address Family modifier\n"
9439: "Display routes matching the communities\n"
9440: "community number\n"
9441: "Do not send outside local AS (well-known community)\n"
9442: "Do not advertise to any peer (well-known community)\n"
9443: "Do not export to next AS (well-known community)\n"
9444: "community number\n"
9445: "Do not send outside local AS (well-known community)\n"
9446: "Do not advertise to any peer (well-known community)\n"
9447: "Do not export to next AS (well-known community)\n"
9448: "community number\n"
9449: "Do not send outside local AS (well-known community)\n"
9450: "Do not advertise to any peer (well-known community)\n"
9451: "Do not export to next AS (well-known community)\n"
9452: "Exact match of the communities")
9453:
9454: ALIAS (show_ip_bgp_ipv4_community_exact,
9455: show_ip_bgp_ipv4_community4_exact_cmd,
9456: "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",
9457: SHOW_STR
9458: IP_STR
9459: BGP_STR
9460: "Address family\n"
9461: "Address Family modifier\n"
9462: "Address Family modifier\n"
9463: "Display routes matching the communities\n"
9464: "community number\n"
9465: "Do not send outside local AS (well-known community)\n"
9466: "Do not advertise to any peer (well-known community)\n"
9467: "Do not export to next AS (well-known community)\n"
9468: "community number\n"
9469: "Do not send outside local AS (well-known community)\n"
9470: "Do not advertise to any peer (well-known community)\n"
9471: "Do not export to next AS (well-known community)\n"
9472: "community number\n"
9473: "Do not send outside local AS (well-known community)\n"
9474: "Do not advertise to any peer (well-known community)\n"
9475: "Do not export to next AS (well-known community)\n"
9476: "community number\n"
9477: "Do not send outside local AS (well-known community)\n"
9478: "Do not advertise to any peer (well-known community)\n"
9479: "Do not export to next AS (well-known community)\n"
9480: "Exact match of the communities")
9481:
9482: DEFUN (show_bgp_community,
9483: show_bgp_community_cmd,
9484: "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
9485: SHOW_STR
9486: BGP_STR
9487: "Display routes matching the communities\n"
9488: "community number\n"
9489: "Do not send outside local AS (well-known community)\n"
9490: "Do not advertise to any peer (well-known community)\n"
9491: "Do not export to next AS (well-known community)\n")
9492: {
9493: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
9494: }
9495:
9496: ALIAS (show_bgp_community,
9497: show_bgp_ipv6_community_cmd,
9498: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
9499: SHOW_STR
9500: BGP_STR
9501: "Address family\n"
9502: "Display routes matching the communities\n"
9503: "community number\n"
9504: "Do not send outside local AS (well-known community)\n"
9505: "Do not advertise to any peer (well-known community)\n"
9506: "Do not export to next AS (well-known community)\n")
9507:
9508: ALIAS (show_bgp_community,
9509: show_bgp_community2_cmd,
9510: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9511: SHOW_STR
9512: BGP_STR
9513: "Display routes matching the communities\n"
9514: "community number\n"
9515: "Do not send outside local AS (well-known community)\n"
9516: "Do not advertise to any peer (well-known community)\n"
9517: "Do not export to next AS (well-known community)\n"
9518: "community number\n"
9519: "Do not send outside local AS (well-known community)\n"
9520: "Do not advertise to any peer (well-known community)\n"
9521: "Do not export to next AS (well-known community)\n")
9522:
9523: ALIAS (show_bgp_community,
9524: show_bgp_ipv6_community2_cmd,
9525: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9526: SHOW_STR
9527: BGP_STR
9528: "Address family\n"
9529: "Display routes matching the communities\n"
9530: "community number\n"
9531: "Do not send outside local AS (well-known community)\n"
9532: "Do not advertise to any peer (well-known community)\n"
9533: "Do not export to next AS (well-known community)\n"
9534: "community number\n"
9535: "Do not send outside local AS (well-known community)\n"
9536: "Do not advertise to any peer (well-known community)\n"
9537: "Do not export to next AS (well-known community)\n")
9538:
9539: ALIAS (show_bgp_community,
9540: show_bgp_community3_cmd,
9541: "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)",
9542: SHOW_STR
9543: BGP_STR
9544: "Display routes matching the communities\n"
9545: "community number\n"
9546: "Do not send outside local AS (well-known community)\n"
9547: "Do not advertise to any peer (well-known community)\n"
9548: "Do not export to next AS (well-known community)\n"
9549: "community number\n"
9550: "Do not send outside local AS (well-known community)\n"
9551: "Do not advertise to any peer (well-known community)\n"
9552: "Do not export to next AS (well-known community)\n"
9553: "community number\n"
9554: "Do not send outside local AS (well-known community)\n"
9555: "Do not advertise to any peer (well-known community)\n"
9556: "Do not export to next AS (well-known community)\n")
9557:
9558: ALIAS (show_bgp_community,
9559: show_bgp_ipv6_community3_cmd,
9560: "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)",
9561: SHOW_STR
9562: BGP_STR
9563: "Address family\n"
9564: "Display routes matching the communities\n"
9565: "community number\n"
9566: "Do not send outside local AS (well-known community)\n"
9567: "Do not advertise to any peer (well-known community)\n"
9568: "Do not export to next AS (well-known community)\n"
9569: "community number\n"
9570: "Do not send outside local AS (well-known community)\n"
9571: "Do not advertise to any peer (well-known community)\n"
9572: "Do not export to next AS (well-known community)\n"
9573: "community number\n"
9574: "Do not send outside local AS (well-known community)\n"
9575: "Do not advertise to any peer (well-known community)\n"
9576: "Do not export to next AS (well-known community)\n")
9577:
9578: ALIAS (show_bgp_community,
9579: show_bgp_community4_cmd,
9580: "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)",
9581: SHOW_STR
9582: BGP_STR
9583: "Display routes matching the communities\n"
9584: "community number\n"
9585: "Do not send outside local AS (well-known community)\n"
9586: "Do not advertise to any peer (well-known community)\n"
9587: "Do not export to next AS (well-known community)\n"
9588: "community number\n"
9589: "Do not send outside local AS (well-known community)\n"
9590: "Do not advertise to any peer (well-known community)\n"
9591: "Do not export to next AS (well-known community)\n"
9592: "community number\n"
9593: "Do not send outside local AS (well-known community)\n"
9594: "Do not advertise to any peer (well-known community)\n"
9595: "Do not export to next AS (well-known community)\n"
9596: "community number\n"
9597: "Do not send outside local AS (well-known community)\n"
9598: "Do not advertise to any peer (well-known community)\n"
9599: "Do not export to next AS (well-known community)\n")
9600:
9601: ALIAS (show_bgp_community,
9602: show_bgp_ipv6_community4_cmd,
9603: "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)",
9604: SHOW_STR
9605: BGP_STR
9606: "Address family\n"
9607: "Display routes matching the communities\n"
9608: "community number\n"
9609: "Do not send outside local AS (well-known community)\n"
9610: "Do not advertise to any peer (well-known community)\n"
9611: "Do not export to next AS (well-known community)\n"
9612: "community number\n"
9613: "Do not send outside local AS (well-known community)\n"
9614: "Do not advertise to any peer (well-known community)\n"
9615: "Do not export to next AS (well-known community)\n"
9616: "community number\n"
9617: "Do not send outside local AS (well-known community)\n"
9618: "Do not advertise to any peer (well-known community)\n"
9619: "Do not export to next AS (well-known community)\n"
9620: "community number\n"
9621: "Do not send outside local AS (well-known community)\n"
9622: "Do not advertise to any peer (well-known community)\n"
9623: "Do not export to next AS (well-known community)\n")
9624:
9625: /* old command */
9626: DEFUN (show_ipv6_bgp_community,
9627: show_ipv6_bgp_community_cmd,
9628: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
9629: SHOW_STR
9630: IPV6_STR
9631: BGP_STR
9632: "Display routes matching the communities\n"
9633: "community number\n"
9634: "Do not send outside local AS (well-known community)\n"
9635: "Do not advertise to any peer (well-known community)\n"
9636: "Do not export to next AS (well-known community)\n")
9637: {
9638: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
9639: }
9640:
9641: /* old command */
9642: ALIAS (show_ipv6_bgp_community,
9643: show_ipv6_bgp_community2_cmd,
9644: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9645: SHOW_STR
9646: IPV6_STR
9647: BGP_STR
9648: "Display routes matching the communities\n"
9649: "community number\n"
9650: "Do not send outside local AS (well-known community)\n"
9651: "Do not advertise to any peer (well-known community)\n"
9652: "Do not export to next AS (well-known community)\n"
9653: "community number\n"
9654: "Do not send outside local AS (well-known community)\n"
9655: "Do not advertise to any peer (well-known community)\n"
9656: "Do not export to next AS (well-known community)\n")
9657:
9658: /* old command */
9659: ALIAS (show_ipv6_bgp_community,
9660: show_ipv6_bgp_community3_cmd,
9661: "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)",
9662: SHOW_STR
9663: IPV6_STR
9664: BGP_STR
9665: "Display routes matching the communities\n"
9666: "community number\n"
9667: "Do not send outside local AS (well-known community)\n"
9668: "Do not advertise to any peer (well-known community)\n"
9669: "Do not export to next AS (well-known community)\n"
9670: "community number\n"
9671: "Do not send outside local AS (well-known community)\n"
9672: "Do not advertise to any peer (well-known community)\n"
9673: "Do not export to next AS (well-known community)\n"
9674: "community number\n"
9675: "Do not send outside local AS (well-known community)\n"
9676: "Do not advertise to any peer (well-known community)\n"
9677: "Do not export to next AS (well-known community)\n")
9678:
9679: /* old command */
9680: ALIAS (show_ipv6_bgp_community,
9681: show_ipv6_bgp_community4_cmd,
9682: "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)",
9683: SHOW_STR
9684: IPV6_STR
9685: BGP_STR
9686: "Display routes matching the communities\n"
9687: "community number\n"
9688: "Do not send outside local AS (well-known community)\n"
9689: "Do not advertise to any peer (well-known community)\n"
9690: "Do not export to next AS (well-known community)\n"
9691: "community number\n"
9692: "Do not send outside local AS (well-known community)\n"
9693: "Do not advertise to any peer (well-known community)\n"
9694: "Do not export to next AS (well-known community)\n"
9695: "community number\n"
9696: "Do not send outside local AS (well-known community)\n"
9697: "Do not advertise to any peer (well-known community)\n"
9698: "Do not export to next AS (well-known community)\n"
9699: "community number\n"
9700: "Do not send outside local AS (well-known community)\n"
9701: "Do not advertise to any peer (well-known community)\n"
9702: "Do not export to next AS (well-known community)\n")
9703:
9704: DEFUN (show_bgp_community_exact,
9705: show_bgp_community_exact_cmd,
9706: "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
9707: SHOW_STR
9708: BGP_STR
9709: "Display routes matching the communities\n"
9710: "community number\n"
9711: "Do not send outside local AS (well-known community)\n"
9712: "Do not advertise to any peer (well-known community)\n"
9713: "Do not export to next AS (well-known community)\n"
9714: "Exact match of the communities")
9715: {
9716: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
9717: }
9718:
9719: ALIAS (show_bgp_community_exact,
9720: show_bgp_ipv6_community_exact_cmd,
9721: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
9722: SHOW_STR
9723: BGP_STR
9724: "Address family\n"
9725: "Display routes matching the communities\n"
9726: "community number\n"
9727: "Do not send outside local AS (well-known community)\n"
9728: "Do not advertise to any peer (well-known community)\n"
9729: "Do not export to next AS (well-known community)\n"
9730: "Exact match of the communities")
9731:
9732: ALIAS (show_bgp_community_exact,
9733: show_bgp_community2_exact_cmd,
9734: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
9735: SHOW_STR
9736: BGP_STR
9737: "Display routes matching the communities\n"
9738: "community number\n"
9739: "Do not send outside local AS (well-known community)\n"
9740: "Do not advertise to any peer (well-known community)\n"
9741: "Do not export to next AS (well-known community)\n"
9742: "community number\n"
9743: "Do not send outside local AS (well-known community)\n"
9744: "Do not advertise to any peer (well-known community)\n"
9745: "Do not export to next AS (well-known community)\n"
9746: "Exact match of the communities")
9747:
9748: ALIAS (show_bgp_community_exact,
9749: show_bgp_ipv6_community2_exact_cmd,
9750: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
9751: SHOW_STR
9752: BGP_STR
9753: "Address family\n"
9754: "Display routes matching the communities\n"
9755: "community number\n"
9756: "Do not send outside local AS (well-known community)\n"
9757: "Do not advertise to any peer (well-known community)\n"
9758: "Do not export to next AS (well-known community)\n"
9759: "community number\n"
9760: "Do not send outside local AS (well-known community)\n"
9761: "Do not advertise to any peer (well-known community)\n"
9762: "Do not export to next AS (well-known community)\n"
9763: "Exact match of the communities")
9764:
9765: ALIAS (show_bgp_community_exact,
9766: show_bgp_community3_exact_cmd,
9767: "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",
9768: SHOW_STR
9769: BGP_STR
9770: "Display routes matching the communities\n"
9771: "community number\n"
9772: "Do not send outside local AS (well-known community)\n"
9773: "Do not advertise to any peer (well-known community)\n"
9774: "Do not export to next AS (well-known community)\n"
9775: "community number\n"
9776: "Do not send outside local AS (well-known community)\n"
9777: "Do not advertise to any peer (well-known community)\n"
9778: "Do not export to next AS (well-known community)\n"
9779: "community number\n"
9780: "Do not send outside local AS (well-known community)\n"
9781: "Do not advertise to any peer (well-known community)\n"
9782: "Do not export to next AS (well-known community)\n"
9783: "Exact match of the communities")
9784:
9785: ALIAS (show_bgp_community_exact,
9786: show_bgp_ipv6_community3_exact_cmd,
9787: "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",
9788: SHOW_STR
9789: BGP_STR
9790: "Address family\n"
9791: "Display routes matching the communities\n"
9792: "community number\n"
9793: "Do not send outside local AS (well-known community)\n"
9794: "Do not advertise to any peer (well-known community)\n"
9795: "Do not export to next AS (well-known community)\n"
9796: "community number\n"
9797: "Do not send outside local AS (well-known community)\n"
9798: "Do not advertise to any peer (well-known community)\n"
9799: "Do not export to next AS (well-known community)\n"
9800: "community number\n"
9801: "Do not send outside local AS (well-known community)\n"
9802: "Do not advertise to any peer (well-known community)\n"
9803: "Do not export to next AS (well-known community)\n"
9804: "Exact match of the communities")
9805:
9806: ALIAS (show_bgp_community_exact,
9807: show_bgp_community4_exact_cmd,
9808: "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",
9809: SHOW_STR
9810: BGP_STR
9811: "Display routes matching the communities\n"
9812: "community number\n"
9813: "Do not send outside local AS (well-known community)\n"
9814: "Do not advertise to any peer (well-known community)\n"
9815: "Do not export to next AS (well-known community)\n"
9816: "community number\n"
9817: "Do not send outside local AS (well-known community)\n"
9818: "Do not advertise to any peer (well-known community)\n"
9819: "Do not export to next AS (well-known community)\n"
9820: "community number\n"
9821: "Do not send outside local AS (well-known community)\n"
9822: "Do not advertise to any peer (well-known community)\n"
9823: "Do not export to next AS (well-known community)\n"
9824: "community number\n"
9825: "Do not send outside local AS (well-known community)\n"
9826: "Do not advertise to any peer (well-known community)\n"
9827: "Do not export to next AS (well-known community)\n"
9828: "Exact match of the communities")
9829:
9830: ALIAS (show_bgp_community_exact,
9831: show_bgp_ipv6_community4_exact_cmd,
9832: "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",
9833: SHOW_STR
9834: BGP_STR
9835: "Address family\n"
9836: "Display routes matching the communities\n"
9837: "community number\n"
9838: "Do not send outside local AS (well-known community)\n"
9839: "Do not advertise to any peer (well-known community)\n"
9840: "Do not export to next AS (well-known community)\n"
9841: "community number\n"
9842: "Do not send outside local AS (well-known community)\n"
9843: "Do not advertise to any peer (well-known community)\n"
9844: "Do not export to next AS (well-known community)\n"
9845: "community number\n"
9846: "Do not send outside local AS (well-known community)\n"
9847: "Do not advertise to any peer (well-known community)\n"
9848: "Do not export to next AS (well-known community)\n"
9849: "community number\n"
9850: "Do not send outside local AS (well-known community)\n"
9851: "Do not advertise to any peer (well-known community)\n"
9852: "Do not export to next AS (well-known community)\n"
9853: "Exact match of the communities")
9854:
9855: /* old command */
9856: DEFUN (show_ipv6_bgp_community_exact,
9857: show_ipv6_bgp_community_exact_cmd,
9858: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
9859: SHOW_STR
9860: IPV6_STR
9861: BGP_STR
9862: "Display routes matching the communities\n"
9863: "community number\n"
9864: "Do not send outside local AS (well-known community)\n"
9865: "Do not advertise to any peer (well-known community)\n"
9866: "Do not export to next AS (well-known community)\n"
9867: "Exact match of the communities")
9868: {
9869: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
9870: }
9871:
9872: /* old command */
9873: ALIAS (show_ipv6_bgp_community_exact,
9874: show_ipv6_bgp_community2_exact_cmd,
9875: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
9876: SHOW_STR
9877: IPV6_STR
9878: BGP_STR
9879: "Display routes matching the communities\n"
9880: "community number\n"
9881: "Do not send outside local AS (well-known community)\n"
9882: "Do not advertise to any peer (well-known community)\n"
9883: "Do not export to next AS (well-known community)\n"
9884: "community number\n"
9885: "Do not send outside local AS (well-known community)\n"
9886: "Do not advertise to any peer (well-known community)\n"
9887: "Do not export to next AS (well-known community)\n"
9888: "Exact match of the communities")
9889:
9890: /* old command */
9891: ALIAS (show_ipv6_bgp_community_exact,
9892: show_ipv6_bgp_community3_exact_cmd,
9893: "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",
9894: SHOW_STR
9895: IPV6_STR
9896: BGP_STR
9897: "Display routes matching the communities\n"
9898: "community number\n"
9899: "Do not send outside local AS (well-known community)\n"
9900: "Do not advertise to any peer (well-known community)\n"
9901: "Do not export to next AS (well-known community)\n"
9902: "community number\n"
9903: "Do not send outside local AS (well-known community)\n"
9904: "Do not advertise to any peer (well-known community)\n"
9905: "Do not export to next AS (well-known community)\n"
9906: "community number\n"
9907: "Do not send outside local AS (well-known community)\n"
9908: "Do not advertise to any peer (well-known community)\n"
9909: "Do not export to next AS (well-known community)\n"
9910: "Exact match of the communities")
9911:
9912: /* old command */
9913: ALIAS (show_ipv6_bgp_community_exact,
9914: show_ipv6_bgp_community4_exact_cmd,
9915: "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",
9916: SHOW_STR
9917: IPV6_STR
9918: BGP_STR
9919: "Display routes matching the communities\n"
9920: "community number\n"
9921: "Do not send outside local AS (well-known community)\n"
9922: "Do not advertise to any peer (well-known community)\n"
9923: "Do not export to next AS (well-known community)\n"
9924: "community number\n"
9925: "Do not send outside local AS (well-known community)\n"
9926: "Do not advertise to any peer (well-known community)\n"
9927: "Do not export to next AS (well-known community)\n"
9928: "community number\n"
9929: "Do not send outside local AS (well-known community)\n"
9930: "Do not advertise to any peer (well-known community)\n"
9931: "Do not export to next AS (well-known community)\n"
9932: "community number\n"
9933: "Do not send outside local AS (well-known community)\n"
9934: "Do not advertise to any peer (well-known community)\n"
9935: "Do not export to next AS (well-known community)\n"
9936: "Exact match of the communities")
9937:
9938: /* old command */
9939: DEFUN (show_ipv6_mbgp_community,
9940: show_ipv6_mbgp_community_cmd,
9941: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
9942: SHOW_STR
9943: IPV6_STR
9944: MBGP_STR
9945: "Display routes matching the communities\n"
9946: "community number\n"
9947: "Do not send outside local AS (well-known community)\n"
9948: "Do not advertise to any peer (well-known community)\n"
9949: "Do not export to next AS (well-known community)\n")
9950: {
9951: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
9952: }
9953:
9954: /* old command */
9955: ALIAS (show_ipv6_mbgp_community,
9956: show_ipv6_mbgp_community2_cmd,
9957: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
9958: SHOW_STR
9959: IPV6_STR
9960: MBGP_STR
9961: "Display routes matching the communities\n"
9962: "community number\n"
9963: "Do not send outside local AS (well-known community)\n"
9964: "Do not advertise to any peer (well-known community)\n"
9965: "Do not export to next AS (well-known community)\n"
9966: "community number\n"
9967: "Do not send outside local AS (well-known community)\n"
9968: "Do not advertise to any peer (well-known community)\n"
9969: "Do not export to next AS (well-known community)\n")
9970:
9971: /* old command */
9972: ALIAS (show_ipv6_mbgp_community,
9973: show_ipv6_mbgp_community3_cmd,
9974: "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)",
9975: SHOW_STR
9976: IPV6_STR
9977: MBGP_STR
9978: "Display routes matching the communities\n"
9979: "community number\n"
9980: "Do not send outside local AS (well-known community)\n"
9981: "Do not advertise to any peer (well-known community)\n"
9982: "Do not export to next AS (well-known community)\n"
9983: "community number\n"
9984: "Do not send outside local AS (well-known community)\n"
9985: "Do not advertise to any peer (well-known community)\n"
9986: "Do not export to next AS (well-known community)\n"
9987: "community number\n"
9988: "Do not send outside local AS (well-known community)\n"
9989: "Do not advertise to any peer (well-known community)\n"
9990: "Do not export to next AS (well-known community)\n")
9991:
9992: /* old command */
9993: ALIAS (show_ipv6_mbgp_community,
9994: show_ipv6_mbgp_community4_cmd,
9995: "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)",
9996: SHOW_STR
9997: IPV6_STR
9998: MBGP_STR
9999: "Display routes matching the communities\n"
10000: "community number\n"
10001: "Do not send outside local AS (well-known community)\n"
10002: "Do not advertise to any peer (well-known community)\n"
10003: "Do not export to next AS (well-known community)\n"
10004: "community number\n"
10005: "Do not send outside local AS (well-known community)\n"
10006: "Do not advertise to any peer (well-known community)\n"
10007: "Do not export to next AS (well-known community)\n"
10008: "community number\n"
10009: "Do not send outside local AS (well-known community)\n"
10010: "Do not advertise to any peer (well-known community)\n"
10011: "Do not export to next AS (well-known community)\n"
10012: "community number\n"
10013: "Do not send outside local AS (well-known community)\n"
10014: "Do not advertise to any peer (well-known community)\n"
10015: "Do not export to next AS (well-known community)\n")
10016:
10017: /* old command */
10018: DEFUN (show_ipv6_mbgp_community_exact,
10019: show_ipv6_mbgp_community_exact_cmd,
10020: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
10021: SHOW_STR
10022: IPV6_STR
10023: MBGP_STR
10024: "Display routes matching the communities\n"
10025: "community number\n"
10026: "Do not send outside local AS (well-known community)\n"
10027: "Do not advertise to any peer (well-known community)\n"
10028: "Do not export to next AS (well-known community)\n"
10029: "Exact match of the communities")
10030: {
10031: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
10032: }
10033:
10034: /* old command */
10035: ALIAS (show_ipv6_mbgp_community_exact,
10036: show_ipv6_mbgp_community2_exact_cmd,
10037: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
10038: SHOW_STR
10039: IPV6_STR
10040: MBGP_STR
10041: "Display routes matching the communities\n"
10042: "community number\n"
10043: "Do not send outside local AS (well-known community)\n"
10044: "Do not advertise to any peer (well-known community)\n"
10045: "Do not export to next AS (well-known community)\n"
10046: "community number\n"
10047: "Do not send outside local AS (well-known community)\n"
10048: "Do not advertise to any peer (well-known community)\n"
10049: "Do not export to next AS (well-known community)\n"
10050: "Exact match of the communities")
10051:
10052: /* old command */
10053: ALIAS (show_ipv6_mbgp_community_exact,
10054: show_ipv6_mbgp_community3_exact_cmd,
10055: "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",
10056: SHOW_STR
10057: IPV6_STR
10058: MBGP_STR
10059: "Display routes matching the communities\n"
10060: "community number\n"
10061: "Do not send outside local AS (well-known community)\n"
10062: "Do not advertise to any peer (well-known community)\n"
10063: "Do not export to next AS (well-known community)\n"
10064: "community number\n"
10065: "Do not send outside local AS (well-known community)\n"
10066: "Do not advertise to any peer (well-known community)\n"
10067: "Do not export to next AS (well-known community)\n"
10068: "community number\n"
10069: "Do not send outside local AS (well-known community)\n"
10070: "Do not advertise to any peer (well-known community)\n"
10071: "Do not export to next AS (well-known community)\n"
10072: "Exact match of the communities")
10073:
10074: /* old command */
10075: ALIAS (show_ipv6_mbgp_community_exact,
10076: show_ipv6_mbgp_community4_exact_cmd,
10077: "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",
10078: SHOW_STR
10079: IPV6_STR
10080: MBGP_STR
10081: "Display routes matching the communities\n"
10082: "community number\n"
10083: "Do not send outside local AS (well-known community)\n"
10084: "Do not advertise to any peer (well-known community)\n"
10085: "Do not export to next AS (well-known community)\n"
10086: "community number\n"
10087: "Do not send outside local AS (well-known community)\n"
10088: "Do not advertise to any peer (well-known community)\n"
10089: "Do not export to next AS (well-known community)\n"
10090: "community number\n"
10091: "Do not send outside local AS (well-known community)\n"
10092: "Do not advertise to any peer (well-known community)\n"
10093: "Do not export to next AS (well-known community)\n"
10094: "community number\n"
10095: "Do not send outside local AS (well-known community)\n"
10096: "Do not advertise to any peer (well-known community)\n"
10097: "Do not export to next AS (well-known community)\n"
10098: "Exact match of the communities")
10099:
10100: DEFUN (show_bgp_ipv4_community,
10101: show_bgp_ipv4_community_cmd,
10102: "show bgp ipv4 community (AA:NN|local-AS|no-advertise|no-export)",
10103: SHOW_STR
10104: BGP_STR
10105: IP_STR
10106: "Display routes matching the communities\n"
10107: "community number\n"
10108: "Do not send outside local AS (well-known community)\n"
10109: "Do not advertise to any peer (well-known community)\n"
10110: "Do not export to next AS (well-known community)\n")
10111: {
10112: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
10113: }
10114:
10115: ALIAS (show_bgp_ipv4_community,
10116: show_bgp_ipv4_community2_cmd,
10117: "show bgp ipv4 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10118: SHOW_STR
10119: BGP_STR
10120: IP_STR
10121: "Display routes matching the communities\n"
10122: "community number\n"
10123: "Do not send outside local AS (well-known community)\n"
10124: "Do not advertise to any peer (well-known community)\n"
10125: "Do not export to next AS (well-known community)\n"
10126: "community number\n"
10127: "Do not send outside local AS (well-known community)\n"
10128: "Do not advertise to any peer (well-known community)\n"
10129: "Do not export to next AS (well-known community)\n")
10130:
10131: ALIAS (show_bgp_ipv4_community,
10132: show_bgp_ipv4_community3_cmd,
10133: "show bgp ipv4 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)",
10134: SHOW_STR
10135: BGP_STR
10136: IP_STR
10137: "Display routes matching the communities\n"
10138: "community number\n"
10139: "Do not send outside local AS (well-known community)\n"
10140: "Do not advertise to any peer (well-known community)\n"
10141: "Do not export to next AS (well-known community)\n"
10142: "community number\n"
10143: "Do not send outside local AS (well-known community)\n"
10144: "Do not advertise to any peer (well-known community)\n"
10145: "Do not export to next AS (well-known community)\n"
10146: "community number\n"
10147: "Do not send outside local AS (well-known community)\n"
10148: "Do not advertise to any peer (well-known community)\n"
10149: "Do not export to next AS (well-known community)\n")
10150:
10151: ALIAS (show_bgp_ipv4_community,
10152: show_bgp_ipv4_community4_cmd,
10153: "show bgp ipv4 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)",
10154: SHOW_STR
10155: BGP_STR
10156: IP_STR
10157: "Display routes matching the communities\n"
10158: "community number\n"
10159: "Do not send outside local AS (well-known community)\n"
10160: "Do not advertise to any peer (well-known community)\n"
10161: "Do not export to next AS (well-known community)\n"
10162: "community number\n"
10163: "Do not send outside local AS (well-known community)\n"
10164: "Do not advertise to any peer (well-known community)\n"
10165: "Do not export to next AS (well-known community)\n"
10166: "community number\n"
10167: "Do not send outside local AS (well-known community)\n"
10168: "Do not advertise to any peer (well-known community)\n"
10169: "Do not export to next AS (well-known community)\n"
10170: "community number\n"
10171: "Do not send outside local AS (well-known community)\n"
10172: "Do not advertise to any peer (well-known community)\n"
10173: "Do not export to next AS (well-known community)\n")
10174:
10175: DEFUN (show_bgp_ipv4_safi_community,
10176: show_bgp_ipv4_safi_community_cmd,
10177: "show bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
10178: SHOW_STR
10179: BGP_STR
10180: "Address family\n"
10181: "Address Family modifier\n"
10182: "Address Family modifier\n"
10183: "Display routes matching the communities\n"
10184: "community number\n"
10185: "Do not send outside local AS (well-known community)\n"
10186: "Do not advertise to any peer (well-known community)\n"
10187: "Do not export to next AS (well-known community)\n")
10188: {
10189: if (strncmp (argv[0], "m", 1) == 0)
10190: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
10191:
10192: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
10193: }
10194:
10195: ALIAS (show_bgp_ipv4_safi_community,
10196: show_bgp_ipv4_safi_community2_cmd,
10197: "show bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10198: SHOW_STR
10199: BGP_STR
10200: "Address family\n"
10201: "Address Family modifier\n"
10202: "Address Family modifier\n"
10203: "Display routes matching the communities\n"
10204: "community number\n"
10205: "Do not send outside local AS (well-known community)\n"
10206: "Do not advertise to any peer (well-known community)\n"
10207: "Do not export to next AS (well-known community)\n"
10208: "community number\n"
10209: "Do not send outside local AS (well-known community)\n"
10210: "Do not advertise to any peer (well-known community)\n"
10211: "Do not export to next AS (well-known community)\n")
10212:
10213: ALIAS (show_bgp_ipv4_safi_community,
10214: show_bgp_ipv4_safi_community3_cmd,
10215: "show 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)",
10216: SHOW_STR
10217: BGP_STR
10218: "Address family\n"
10219: "Address Family modifier\n"
10220: "Address Family modifier\n"
10221: "Display routes matching the communities\n"
10222: "community number\n"
10223: "Do not send outside local AS (well-known community)\n"
10224: "Do not advertise to any peer (well-known community)\n"
10225: "Do not export to next AS (well-known community)\n"
10226: "community number\n"
10227: "Do not send outside local AS (well-known community)\n"
10228: "Do not advertise to any peer (well-known community)\n"
10229: "Do not export to next AS (well-known community)\n"
10230: "community number\n"
10231: "Do not send outside local AS (well-known community)\n"
10232: "Do not advertise to any peer (well-known community)\n"
10233: "Do not export to next AS (well-known community)\n")
10234:
10235: ALIAS (show_bgp_ipv4_safi_community,
10236: show_bgp_ipv4_safi_community4_cmd,
10237: "show 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)",
10238: SHOW_STR
10239: BGP_STR
10240: "Address family\n"
10241: "Address Family modifier\n"
10242: "Address Family modifier\n"
10243: "Display routes matching the communities\n"
10244: "community number\n"
10245: "Do not send outside local AS (well-known community)\n"
10246: "Do not advertise to any peer (well-known community)\n"
10247: "Do not export to next AS (well-known community)\n"
10248: "community number\n"
10249: "Do not send outside local AS (well-known community)\n"
10250: "Do not advertise to any peer (well-known community)\n"
10251: "Do not export to next AS (well-known community)\n"
10252: "community number\n"
10253: "Do not send outside local AS (well-known community)\n"
10254: "Do not advertise to any peer (well-known community)\n"
10255: "Do not export to next AS (well-known community)\n"
10256: "community number\n"
10257: "Do not send outside local AS (well-known community)\n"
10258: "Do not advertise to any peer (well-known community)\n"
10259: "Do not export to next AS (well-known community)\n")
10260:
10261: DEFUN (show_bgp_view_afi_safi_community_all,
10262: show_bgp_view_afi_safi_community_all_cmd,
10263: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
10264: SHOW_STR
10265: BGP_STR
10266: "BGP view\n"
10267: "View name\n"
10268: "Address family\n"
10269: "Address family\n"
10270: "Address Family modifier\n"
10271: "Address Family modifier\n"
10272: "Display routes matching the communities\n")
10273: {
10274: int afi;
10275: int safi;
10276: struct bgp *bgp;
10277:
10278: /* BGP structure lookup. */
10279: bgp = bgp_lookup_by_name (argv[0]);
10280: if (bgp == NULL)
10281: {
10282: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10283: return CMD_WARNING;
10284: }
10285:
10286: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10287: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10288: return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
10289: }
10290:
10291: DEFUN (show_bgp_view_afi_safi_community,
10292: show_bgp_view_afi_safi_community_cmd,
10293: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
10294: SHOW_STR
10295: BGP_STR
10296: "BGP view\n"
10297: "View name\n"
10298: "Address family\n"
10299: "Address family\n"
10300: "Address family modifier\n"
10301: "Address family modifier\n"
10302: "Display routes matching the communities\n"
10303: "community number\n"
10304: "Do not send outside local AS (well-known community)\n"
10305: "Do not advertise to any peer (well-known community)\n"
10306: "Do not export to next AS (well-known community)\n")
10307: {
10308: int afi;
10309: int safi;
10310:
10311: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10312: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10313: return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
10314: }
10315:
10316: ALIAS (show_bgp_view_afi_safi_community,
10317: show_bgp_view_afi_safi_community2_cmd,
10318: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10319: SHOW_STR
10320: BGP_STR
10321: "BGP view\n"
10322: "View name\n"
10323: "Address family\n"
10324: "Address family\n"
10325: "Address family modifier\n"
10326: "Address family modifier\n"
10327: "Display routes matching the communities\n"
10328: "community number\n"
10329: "Do not send outside local AS (well-known community)\n"
10330: "Do not advertise to any peer (well-known community)\n"
10331: "Do not export to next AS (well-known community)\n"
10332: "community number\n"
10333: "Do not send outside local AS (well-known community)\n"
10334: "Do not advertise to any peer (well-known community)\n"
10335: "Do not export to next AS (well-known community)\n")
10336:
10337: ALIAS (show_bgp_view_afi_safi_community,
10338: show_bgp_view_afi_safi_community3_cmd,
10339: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10340: SHOW_STR
10341: BGP_STR
10342: "BGP view\n"
10343: "View name\n"
10344: "Address family\n"
10345: "Address family\n"
10346: "Address family modifier\n"
10347: "Address family modifier\n"
10348: "Display routes matching the communities\n"
10349: "community number\n"
10350: "Do not send outside local AS (well-known community)\n"
10351: "Do not advertise to any peer (well-known community)\n"
10352: "Do not export to next AS (well-known community)\n"
10353: "community number\n"
10354: "Do not send outside local AS (well-known community)\n"
10355: "Do not advertise to any peer (well-known community)\n"
10356: "Do not export to next AS (well-known community)\n"
10357: "community number\n"
10358: "Do not send outside local AS (well-known community)\n"
10359: "Do not advertise to any peer (well-known community)\n"
10360: "Do not export to next AS (well-known community)\n")
10361:
10362: ALIAS (show_bgp_view_afi_safi_community,
10363: show_bgp_view_afi_safi_community4_cmd,
10364: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10365: SHOW_STR
10366: BGP_STR
10367: "BGP view\n"
10368: "View name\n"
10369: "Address family\n"
10370: "Address family\n"
10371: "Address family modifier\n"
10372: "Address family modifier\n"
10373: "Display routes matching the communities\n"
10374: "community number\n"
10375: "Do not send outside local AS (well-known community)\n"
10376: "Do not advertise to any peer (well-known community)\n"
10377: "Do not export to next AS (well-known community)\n"
10378: "community number\n"
10379: "Do not send outside local AS (well-known community)\n"
10380: "Do not advertise to any peer (well-known community)\n"
10381: "Do not export to next AS (well-known community)\n"
10382: "community number\n"
10383: "Do not send outside local AS (well-known community)\n"
10384: "Do not advertise to any peer (well-known community)\n"
10385: "Do not export to next AS (well-known community)\n"
10386: "community number\n"
10387: "Do not send outside local AS (well-known community)\n"
10388: "Do not advertise to any peer (well-known community)\n"
10389: "Do not export to next AS (well-known community)\n")
10390:
10391: DEFUN (show_bgp_ipv4_community_exact,
10392: show_bgp_ipv4_community_exact_cmd,
10393: "show bgp ipv4 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
10394: SHOW_STR
10395: BGP_STR
10396: IP_STR
10397: "Display routes matching the communities\n"
10398: "community number\n"
10399: "Do not send outside local AS (well-known community)\n"
10400: "Do not advertise to any peer (well-known community)\n"
10401: "Do not export to next AS (well-known community)\n"
10402: "Exact match of the communities")
10403: {
10404: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
10405: }
10406:
10407: ALIAS (show_bgp_ipv4_community_exact,
10408: show_bgp_ipv4_community2_exact_cmd,
10409: "show bgp ipv4 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
10410: SHOW_STR
10411: BGP_STR
10412: IP_STR
10413: "Display routes matching the communities\n"
10414: "community number\n"
10415: "Do not send outside local AS (well-known community)\n"
10416: "Do not advertise to any peer (well-known community)\n"
10417: "Do not export to next AS (well-known community)\n"
10418: "community number\n"
10419: "Do not send outside local AS (well-known community)\n"
10420: "Do not advertise to any peer (well-known community)\n"
10421: "Do not export to next AS (well-known community)\n"
10422: "Exact match of the communities")
10423:
10424: ALIAS (show_bgp_ipv4_community_exact,
10425: show_bgp_ipv4_community3_exact_cmd,
10426: "show bgp ipv4 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",
10427: SHOW_STR
10428: BGP_STR
10429: IP_STR
10430: "Display routes matching the communities\n"
10431: "community number\n"
10432: "Do not send outside local AS (well-known community)\n"
10433: "Do not advertise to any peer (well-known community)\n"
10434: "Do not export to next AS (well-known community)\n"
10435: "community number\n"
10436: "Do not send outside local AS (well-known community)\n"
10437: "Do not advertise to any peer (well-known community)\n"
10438: "Do not export to next AS (well-known community)\n"
10439: "community number\n"
10440: "Do not send outside local AS (well-known community)\n"
10441: "Do not advertise to any peer (well-known community)\n"
10442: "Do not export to next AS (well-known community)\n"
10443: "Exact match of the communities")
10444:
10445: ALIAS (show_bgp_ipv4_community_exact,
10446: show_bgp_ipv4_community4_exact_cmd,
10447: "show bgp ipv4 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",
10448: SHOW_STR
10449: BGP_STR
10450: IP_STR
10451: "Display routes matching the communities\n"
10452: "community number\n"
10453: "Do not send outside local AS (well-known community)\n"
10454: "Do not advertise to any peer (well-known community)\n"
10455: "Do not export to next AS (well-known community)\n"
10456: "community number\n"
10457: "Do not send outside local AS (well-known community)\n"
10458: "Do not advertise to any peer (well-known community)\n"
10459: "Do not export to next AS (well-known community)\n"
10460: "community number\n"
10461: "Do not send outside local AS (well-known community)\n"
10462: "Do not advertise to any peer (well-known community)\n"
10463: "Do not export to next AS (well-known community)\n"
10464: "community number\n"
10465: "Do not send outside local AS (well-known community)\n"
10466: "Do not advertise to any peer (well-known community)\n"
10467: "Do not export to next AS (well-known community)\n"
10468: "Exact match of the communities")
10469:
10470: DEFUN (show_bgp_ipv4_safi_community4_exact,
10471: show_bgp_ipv4_safi_community_exact_cmd,
10472: "show bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
10473: SHOW_STR
10474: BGP_STR
10475: "Address family\n"
10476: "Address Family modifier\n"
10477: "Address Family modifier\n"
10478: "Display routes matching the communities\n"
10479: "community number\n"
10480: "Do not send outside local AS (well-known community)\n"
10481: "Do not advertise to any peer (well-known community)\n"
10482: "Do not export to next AS (well-known community)\n"
10483: "Exact match of the communities")
10484: {
10485: if (strncmp (argv[0], "m", 1) == 0)
10486: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
10487:
10488: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
10489: }
10490:
10491: ALIAS (show_bgp_ipv4_safi_community4_exact,
10492: show_bgp_ipv4_safi_community2_exact_cmd,
10493: "show bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
10494: SHOW_STR
10495: BGP_STR
10496: "Address family\n"
10497: "Address Family modifier\n"
10498: "Address Family modifier\n"
10499: "Display routes matching the communities\n"
10500: "community number\n"
10501: "Do not send outside local AS (well-known community)\n"
10502: "Do not advertise to any peer (well-known community)\n"
10503: "Do not export to next AS (well-known community)\n"
10504: "community number\n"
10505: "Do not send outside local AS (well-known community)\n"
10506: "Do not advertise to any peer (well-known community)\n"
10507: "Do not export to next AS (well-known community)\n"
10508: "Exact match of the communities")
10509:
10510: ALIAS (show_bgp_ipv4_safi_community4_exact,
10511: show_bgp_ipv4_safi_community3_exact_cmd,
10512: "show 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",
10513: SHOW_STR
10514: BGP_STR
10515: "Address family\n"
10516: "Address Family modifier\n"
10517: "Address Family modifier\n"
10518: "Display routes matching the communities\n"
10519: "community number\n"
10520: "Do not send outside local AS (well-known community)\n"
10521: "Do not advertise to any peer (well-known community)\n"
10522: "Do not export to next AS (well-known community)\n"
10523: "community number\n"
10524: "Do not send outside local AS (well-known community)\n"
10525: "Do not advertise to any peer (well-known community)\n"
10526: "Do not export to next AS (well-known community)\n"
10527: "community number\n"
10528: "Do not send outside local AS (well-known community)\n"
10529: "Do not advertise to any peer (well-known community)\n"
10530: "Do not export to next AS (well-known community)\n"
10531: "Exact match of the communities")
10532:
10533: ALIAS (show_bgp_ipv4_safi_community4_exact,
10534: show_bgp_ipv4_safi_community4_exact_cmd,
10535: "show 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",
10536: SHOW_STR
10537: BGP_STR
10538: "Address family\n"
10539: "Address Family modifier\n"
10540: "Address Family modifier\n"
10541: "Display routes matching the communities\n"
10542: "community number\n"
10543: "Do not send outside local AS (well-known community)\n"
10544: "Do not advertise to any peer (well-known community)\n"
10545: "Do not export to next AS (well-known community)\n"
10546: "community number\n"
10547: "Do not send outside local AS (well-known community)\n"
10548: "Do not advertise to any peer (well-known community)\n"
10549: "Do not export to next AS (well-known community)\n"
10550: "community number\n"
10551: "Do not send outside local AS (well-known community)\n"
10552: "Do not advertise to any peer (well-known community)\n"
10553: "Do not export to next AS (well-known community)\n"
10554: "community number\n"
10555: "Do not send outside local AS (well-known community)\n"
10556: "Do not advertise to any peer (well-known community)\n"
10557: "Do not export to next AS (well-known community)\n"
10558: "Exact match of the communities")
10559:
10560: DEFUN (show_bgp_ipv6_safi_community,
10561: show_bgp_ipv6_safi_community_cmd,
10562: "show bgp ipv6 (encap|multicast|unicast|vpn) community (AA:NN|local-AS|no-advertise|no-export)",
10563: SHOW_STR
10564: BGP_STR
10565: "Address family\n"
10566: "Address family modifier\n"
10567: "Address family modifier\n"
10568: "Address family modifier\n"
10569: "Address family modifier\n"
10570: "Display routes matching the communities\n"
10571: "community number\n"
10572: "Do not send outside local AS (well-known community)\n"
10573: "Do not advertise to any peer (well-known community)\n"
10574: "Do not export to next AS (well-known community)\n")
10575: {
10576: safi_t safi;
10577:
10578: if (bgp_parse_safi(argv[0], &safi)) {
10579: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
10580: return CMD_WARNING;
10581: }
10582: return bgp_show_community (vty, NULL, argc-1, argv+1, 0, AFI_IP6, safi);
10583: }
10584:
10585: ALIAS (show_bgp_ipv6_safi_community,
10586: show_bgp_ipv6_safi_community2_cmd,
10587: "show bgp ipv6 (encap|multicast|unicast|vpn) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
10588: SHOW_STR
10589: BGP_STR
10590: "Address family\n"
10591: "Address family modifier\n"
10592: "Address family modifier\n"
10593: "Address family modifier\n"
10594: "Address family modifier\n"
10595: "Display routes matching the communities\n"
10596: "community number\n"
10597: "Do not send outside local AS (well-known community)\n"
10598: "Do not advertise to any peer (well-known community)\n"
10599: "Do not export to next AS (well-known community)\n"
10600: "community number\n"
10601: "Do not send outside local AS (well-known community)\n"
10602: "Do not advertise to any peer (well-known community)\n"
10603: "Do not export to next AS (well-known community)\n")
10604:
10605: ALIAS (show_bgp_ipv6_safi_community,
10606: show_bgp_ipv6_safi_community3_cmd,
10607: "show bgp ipv6 (encap|multicast|unicast|vpn) 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)",
10608: SHOW_STR
10609: BGP_STR
10610: "Address family\n"
10611: "Address family modifier\n"
10612: "Address family modifier\n"
10613: "Address family modifier\n"
10614: "Address family modifier\n"
10615: "Display routes matching the communities\n"
10616: "community number\n"
10617: "Do not send outside local AS (well-known community)\n"
10618: "Do not advertise to any peer (well-known community)\n"
10619: "Do not export to next AS (well-known community)\n"
10620: "community number\n"
10621: "Do not send outside local AS (well-known community)\n"
10622: "Do not advertise to any peer (well-known community)\n"
10623: "Do not export to next AS (well-known community)\n"
10624: "community number\n"
10625: "Do not send outside local AS (well-known community)\n"
10626: "Do not advertise to any peer (well-known community)\n"
10627: "Do not export to next AS (well-known community)\n")
10628:
10629: ALIAS (show_bgp_ipv6_safi_community,
10630: show_bgp_ipv6_safi_community4_cmd,
10631: "show bgp ipv6 (encap|multicast|unicast|vpn) 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)",
10632: SHOW_STR
10633: BGP_STR
10634: "Address family\n"
10635: "Address family modifier\n"
10636: "Address family modifier\n"
10637: "Address family modifier\n"
10638: "Address family modifier\n"
10639: "Display routes matching the communities\n"
10640: "community number\n"
10641: "Do not send outside local AS (well-known community)\n"
10642: "Do not advertise to any peer (well-known community)\n"
10643: "Do not export to next AS (well-known community)\n"
10644: "community number\n"
10645: "Do not send outside local AS (well-known community)\n"
10646: "Do not advertise to any peer (well-known community)\n"
10647: "Do not export to next AS (well-known community)\n"
10648: "community number\n"
10649: "Do not send outside local AS (well-known community)\n"
10650: "Do not advertise to any peer (well-known community)\n"
10651: "Do not export to next AS (well-known community)\n"
10652: "community number\n"
10653: "Do not send outside local AS (well-known community)\n"
10654: "Do not advertise to any peer (well-known community)\n"
10655: "Do not export to next AS (well-known community)\n")
10656:
10657:
10658: DEFUN (show_bgp_ipv6_safi_community_exact,
10659: show_bgp_ipv6_safi_community_exact_cmd,
10660: "show bgp ipv6 (encap|multicast|unicast|vpn) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
10661: SHOW_STR
10662: BGP_STR
10663: "Address family\n"
10664: "Address family modifier\n"
10665: "Address family modifier\n"
10666: "Address family modifier\n"
10667: "Address family modifier\n"
10668: "Display routes matching the communities\n"
10669: "community number\n"
10670: "Do not send outside local AS (well-known community)\n"
10671: "Do not advertise to any peer (well-known community)\n"
10672: "Do not export to next AS (well-known community)\n"
10673: "Exact match of the communities")
10674: {
10675: safi_t safi;
10676:
10677: if (bgp_parse_safi(argv[0], &safi)) {
10678: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
10679: return CMD_WARNING;
10680: }
10681: return bgp_show_community (vty, NULL, argc-1, argv+1, 1, AFI_IP6, safi);
10682: }
10683:
10684:
10685: ALIAS (show_bgp_community_exact,
10686: show_bgp_ipv6_safi_community2_exact_cmd,
10687: "show bgp ipv6 (encap|multicast|unicast|vpn) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
10688: SHOW_STR
10689: BGP_STR
10690: "Address family\n"
10691: "Address family modifier\n"
10692: "Address family modifier\n"
10693: "Address family modifier\n"
10694: "Address family modifier\n"
10695: "Display routes matching the communities\n"
10696: "community number\n"
10697: "Do not send outside local AS (well-known community)\n"
10698: "Do not advertise to any peer (well-known community)\n"
10699: "Do not export to next AS (well-known community)\n"
10700: "community number\n"
10701: "Do not send outside local AS (well-known community)\n"
10702: "Do not advertise to any peer (well-known community)\n"
10703: "Do not export to next AS (well-known community)\n"
10704: "Exact match of the communities")
10705:
10706: ALIAS (show_bgp_community_exact,
10707: show_bgp_ipv6_safi_community3_exact_cmd,
10708: "show bgp ipv6 (encap|multicast|unicast|vpn) 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",
10709: SHOW_STR
10710: BGP_STR
10711: "Address family\n"
10712: "Address family modifier\n"
10713: "Address family modifier\n"
10714: "Address family modifier\n"
10715: "Address family modifier\n"
10716: "Display routes matching the communities\n"
10717: "community number\n"
10718: "Do not send outside local AS (well-known community)\n"
10719: "Do not advertise to any peer (well-known community)\n"
10720: "Do not export to next AS (well-known community)\n"
10721: "community number\n"
10722: "Do not send outside local AS (well-known community)\n"
10723: "Do not advertise to any peer (well-known community)\n"
10724: "Do not export to next AS (well-known community)\n"
10725: "community number\n"
10726: "Do not send outside local AS (well-known community)\n"
10727: "Do not advertise to any peer (well-known community)\n"
10728: "Do not export to next AS (well-known community)\n"
10729: "Exact match of the communities")
10730:
10731: ALIAS (show_bgp_community_exact,
10732: show_bgp_ipv6_safi_community4_exact_cmd,
10733: "show bgp ipv6 (encap|multicast|unicast|vpn) 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",
10734: SHOW_STR
10735: BGP_STR
10736: "Address family\n"
10737: "Address family modifier\n"
10738: "Address family modifier\n"
10739: "Address family modifier\n"
10740: "Address family modifier\n"
10741: "Display routes matching the communities\n"
10742: "community number\n"
10743: "Do not send outside local AS (well-known community)\n"
10744: "Do not advertise to any peer (well-known community)\n"
10745: "Do not export to next AS (well-known community)\n"
10746: "community number\n"
10747: "Do not send outside local AS (well-known community)\n"
10748: "Do not advertise to any peer (well-known community)\n"
10749: "Do not export to next AS (well-known community)\n"
10750: "community number\n"
10751: "Do not send outside local AS (well-known community)\n"
10752: "Do not advertise to any peer (well-known community)\n"
10753: "Do not export to next AS (well-known community)\n"
10754: "community number\n"
10755: "Do not send outside local AS (well-known community)\n"
10756: "Do not advertise to any peer (well-known community)\n"
10757: "Do not export to next AS (well-known community)\n"
10758: "Exact match of the communities")
10759:
10760: static int
10761: bgp_show_community_list (struct vty *vty, const char *com, int exact,
10762: afi_t afi, safi_t safi)
10763: {
10764: struct community_list *list;
10765:
10766: list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
10767: if (list == NULL)
10768: {
10769: vty_out (vty, "%% %s is not a valid community-list name%s", com,
10770: VTY_NEWLINE);
10771: return CMD_WARNING;
10772: }
10773:
10774: return bgp_show (vty, NULL, afi, safi,
10775: (exact ? bgp_show_type_community_list_exact :
10776: bgp_show_type_community_list), list);
10777: }
10778:
10779: DEFUN (show_ip_bgp_community_list,
10780: show_ip_bgp_community_list_cmd,
10781: "show ip bgp community-list (<1-500>|WORD)",
10782: SHOW_STR
10783: IP_STR
10784: BGP_STR
10785: "Display routes matching the community-list\n"
10786: "community-list number\n"
10787: "community-list name\n")
10788: {
10789: return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
10790: }
10791:
10792: DEFUN (show_ip_bgp_ipv4_community_list,
10793: show_ip_bgp_ipv4_community_list_cmd,
10794: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
10795: SHOW_STR
10796: IP_STR
10797: BGP_STR
10798: "Address family\n"
10799: "Address Family modifier\n"
10800: "Address Family modifier\n"
10801: "Display routes matching the community-list\n"
10802: "community-list number\n"
10803: "community-list name\n")
10804: {
10805: if (strncmp (argv[0], "m", 1) == 0)
10806: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
10807:
10808: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
10809: }
10810:
10811: DEFUN (show_ip_bgp_community_list_exact,
10812: show_ip_bgp_community_list_exact_cmd,
10813: "show ip bgp community-list (<1-500>|WORD) exact-match",
10814: SHOW_STR
10815: IP_STR
10816: BGP_STR
10817: "Display routes matching the community-list\n"
10818: "community-list number\n"
10819: "community-list name\n"
10820: "Exact match of the communities\n")
10821: {
10822: return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
10823: }
10824:
10825: DEFUN (show_ip_bgp_ipv4_community_list_exact,
10826: show_ip_bgp_ipv4_community_list_exact_cmd,
10827: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
10828: SHOW_STR
10829: IP_STR
10830: BGP_STR
10831: "Address family\n"
10832: "Address Family modifier\n"
10833: "Address Family modifier\n"
10834: "Display routes matching the community-list\n"
10835: "community-list number\n"
10836: "community-list name\n"
10837: "Exact match of the communities\n")
10838: {
10839: if (strncmp (argv[0], "m", 1) == 0)
10840: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
10841:
10842: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
10843: }
10844:
10845: DEFUN (show_bgp_community_list,
10846: show_bgp_community_list_cmd,
10847: "show bgp community-list (<1-500>|WORD)",
10848: SHOW_STR
10849: BGP_STR
10850: "Display routes matching the community-list\n"
10851: "community-list number\n"
10852: "community-list name\n")
10853: {
10854: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
10855: }
10856:
10857: ALIAS (show_bgp_community_list,
10858: show_bgp_ipv6_community_list_cmd,
10859: "show bgp ipv6 community-list (<1-500>|WORD)",
10860: SHOW_STR
10861: BGP_STR
10862: "Address family\n"
10863: "Display routes matching the community-list\n"
10864: "community-list number\n"
10865: "community-list name\n")
10866:
10867: /* old command */
10868: DEFUN (show_ipv6_bgp_community_list,
10869: show_ipv6_bgp_community_list_cmd,
10870: "show ipv6 bgp community-list WORD",
10871: SHOW_STR
10872: IPV6_STR
10873: BGP_STR
10874: "Display routes matching the community-list\n"
10875: "community-list name\n")
10876: {
10877: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
10878: }
10879:
10880: /* old command */
10881: DEFUN (show_ipv6_mbgp_community_list,
10882: show_ipv6_mbgp_community_list_cmd,
10883: "show ipv6 mbgp community-list WORD",
10884: SHOW_STR
10885: IPV6_STR
10886: MBGP_STR
10887: "Display routes matching the community-list\n"
10888: "community-list name\n")
10889: {
10890: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
10891: }
10892:
10893: DEFUN (show_bgp_community_list_exact,
10894: show_bgp_community_list_exact_cmd,
10895: "show bgp community-list (<1-500>|WORD) exact-match",
10896: SHOW_STR
10897: BGP_STR
10898: "Display routes matching the community-list\n"
10899: "community-list number\n"
10900: "community-list name\n"
10901: "Exact match of the communities\n")
10902: {
10903: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
10904: }
10905:
10906: ALIAS (show_bgp_community_list_exact,
10907: show_bgp_ipv6_community_list_exact_cmd,
10908: "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
10909: SHOW_STR
10910: BGP_STR
10911: "Address family\n"
10912: "Display routes matching the community-list\n"
10913: "community-list number\n"
10914: "community-list name\n"
10915: "Exact match of the communities\n")
10916:
10917: /* old command */
10918: DEFUN (show_ipv6_bgp_community_list_exact,
10919: show_ipv6_bgp_community_list_exact_cmd,
10920: "show ipv6 bgp community-list WORD exact-match",
10921: SHOW_STR
10922: IPV6_STR
10923: BGP_STR
10924: "Display routes matching the community-list\n"
10925: "community-list name\n"
10926: "Exact match of the communities\n")
10927: {
10928: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
10929: }
10930:
10931: /* old command */
10932: DEFUN (show_ipv6_mbgp_community_list_exact,
10933: show_ipv6_mbgp_community_list_exact_cmd,
10934: "show ipv6 mbgp community-list WORD exact-match",
10935: SHOW_STR
10936: IPV6_STR
10937: MBGP_STR
10938: "Display routes matching the community-list\n"
10939: "community-list name\n"
10940: "Exact match of the communities\n")
10941: {
10942: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
10943: }
10944:
10945: DEFUN (show_bgp_ipv4_community_list,
10946: show_bgp_ipv4_community_list_cmd,
10947: "show bgp ipv4 community-list (<1-500>|WORD)",
10948: SHOW_STR
10949: BGP_STR
10950: IP_STR
10951: "Display routes matching the community-list\n"
10952: "community-list number\n"
10953: "community-list name\n")
10954: {
10955: return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
10956: }
10957:
10958: DEFUN (show_bgp_ipv4_safi_community_list,
10959: show_bgp_ipv4_safi_community_list_cmd,
10960: "show bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
10961: SHOW_STR
10962: BGP_STR
10963: "Address family\n"
10964: "Address Family modifier\n"
10965: "Address Family modifier\n"
10966: "Display routes matching the community-list\n"
10967: "community-list number\n"
10968: "community-list name\n")
10969: {
10970: if (strncmp (argv[0], "m", 1) == 0)
10971: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
10972:
10973: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
10974: }
10975:
10976: DEFUN (show_bgp_ipv4_community_list_exact,
10977: show_bgp_ipv4_community_list_exact_cmd,
10978: "show bgp ipv4 community-list (<1-500>|WORD) exact-match",
10979: SHOW_STR
10980: BGP_STR
10981: IP_STR
10982: "Display routes matching the community-list\n"
10983: "community-list number\n"
10984: "community-list name\n"
10985: "Exact match of the communities\n")
10986: {
10987: return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
10988: }
10989:
10990: DEFUN (show_bgp_ipv4_safi_community_list_exact,
10991: show_bgp_ipv4_safi_community_list_exact_cmd,
10992: "show bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
10993: SHOW_STR
10994: BGP_STR
10995: "Address family\n"
10996: "Address Family modifier\n"
10997: "Address Family modifier\n"
10998: "Display routes matching the community-list\n"
10999: "community-list number\n"
11000: "community-list name\n"
11001: "Exact match of the communities\n")
11002: {
11003: if (strncmp (argv[0], "m", 1) == 0)
11004: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
11005:
11006: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
11007: }
11008:
11009: DEFUN (show_bgp_ipv6_safi_community_list,
11010: show_bgp_ipv6_safi_community_list_cmd,
11011: "show bgp ipv6 (encap|multicast|unicast|vpn) community-list (<1-500>|WORD)",
11012: SHOW_STR
11013: BGP_STR
11014: "Address family\n"
11015: "Address family modifier\n"
11016: "Address family modifier\n"
11017: "Address family modifier\n"
11018: "Address family modifier\n"
11019: "Display routes matching the community-list\n"
11020: "community-list number\n"
11021: "community-list name\n")
11022: {
11023: safi_t safi;
11024:
11025: if (bgp_parse_safi(argv[0], &safi)) {
11026: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11027: return CMD_WARNING;
11028: }
11029: return bgp_show_community_list (vty, argv[1], 0, AFI_IP6, safi);
11030: }
11031:
11032: DEFUN (show_bgp_ipv6_safi_community_list_exact,
11033: show_bgp_ipv6_safi_community_list_exact_cmd,
11034: "show bgp ipv6 (encap|multicast|unicast|vpn) community-list (<1-500>|WORD) exact-match",
11035: SHOW_STR
11036: BGP_STR
11037: "Address family\n"
11038: "Address family modifier\n"
11039: "Address family modifier\n"
11040: "Address family modifier\n"
11041: "Address family modifier\n"
11042: "Display routes matching the community-list\n"
11043: "community-list number\n"
11044: "community-list name\n"
11045: "Exact match of the communities\n")
11046: {
11047: safi_t safi;
11048:
11049: if (bgp_parse_safi(argv[0], &safi)) {
11050: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11051: return CMD_WARNING;
11052: }
11053: return bgp_show_community_list (vty, argv[1], 1, AFI_IP6, safi);
11054: }
11055:
11056: static int
11057: bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
11058: safi_t safi, enum bgp_show_type type)
11059: {
11060: int ret;
11061: struct prefix *p;
11062:
11063: p = prefix_new();
11064:
11065: ret = str2prefix (prefix, p);
11066: if (! ret)
11067: {
11068: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
11069: return CMD_WARNING;
11070: }
11071:
11072: ret = bgp_show (vty, NULL, afi, safi, type, p);
11073: prefix_free(p);
11074: return ret;
11075: }
11076:
11077: DEFUN (show_ip_bgp_prefix_longer,
11078: show_ip_bgp_prefix_longer_cmd,
11079: "show ip bgp A.B.C.D/M longer-prefixes",
11080: SHOW_STR
11081: IP_STR
11082: BGP_STR
11083: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11084: "Display route and more specific routes\n")
11085: {
11086: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
11087: bgp_show_type_prefix_longer);
11088: }
11089:
11090: DEFUN (show_ip_bgp_flap_prefix_longer,
11091: show_ip_bgp_flap_prefix_longer_cmd,
11092: "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
11093: SHOW_STR
11094: IP_STR
11095: BGP_STR
11096: "Display flap statistics of routes\n"
11097: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11098: "Display route and more specific routes\n")
11099: {
11100: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
11101: bgp_show_type_flap_prefix_longer);
11102: }
11103:
11104: ALIAS (show_ip_bgp_flap_prefix_longer,
11105: show_ip_bgp_damp_flap_prefix_longer_cmd,
11106: "show ip bgp dampening flap-statistics A.B.C.D/M longer-prefixes",
11107: SHOW_STR
11108: IP_STR
11109: BGP_STR
11110: "Display detailed information about dampening\n"
11111: "Display flap statistics of routes\n"
11112: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11113: "Display route and more specific routes\n")
11114:
11115: DEFUN (show_ip_bgp_ipv4_prefix_longer,
11116: show_ip_bgp_ipv4_prefix_longer_cmd,
11117: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
11118: SHOW_STR
11119: IP_STR
11120: BGP_STR
11121: "Address family\n"
11122: "Address Family modifier\n"
11123: "Address Family modifier\n"
11124: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11125: "Display route and more specific routes\n")
11126: {
11127: if (strncmp (argv[0], "m", 1) == 0)
11128: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
11129: bgp_show_type_prefix_longer);
11130:
11131: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
11132: bgp_show_type_prefix_longer);
11133: }
11134:
11135: DEFUN (show_ip_bgp_flap_address,
11136: show_ip_bgp_flap_address_cmd,
11137: "show ip bgp flap-statistics A.B.C.D",
11138: SHOW_STR
11139: IP_STR
11140: BGP_STR
11141: "Display flap statistics of routes\n"
11142: "Network in the BGP routing table to display\n")
11143: {
11144: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
11145: bgp_show_type_flap_address);
11146: }
11147:
11148: ALIAS (show_ip_bgp_flap_address,
11149: show_ip_bgp_damp_flap_address_cmd,
11150: "show ip bgp dampening flap-statistics A.B.C.D",
11151: SHOW_STR
11152: IP_STR
11153: BGP_STR
11154: "Display detailed information about dampening\n"
11155: "Display flap statistics of routes\n"
11156: "Network in the BGP routing table to display\n")
11157:
11158: DEFUN (show_ip_bgp_flap_prefix,
11159: show_ip_bgp_flap_prefix_cmd,
11160: "show ip bgp flap-statistics A.B.C.D/M",
11161: SHOW_STR
11162: IP_STR
11163: BGP_STR
11164: "Display flap statistics of routes\n"
11165: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11166: {
11167: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
11168: bgp_show_type_flap_prefix);
11169: }
11170:
11171: ALIAS (show_ip_bgp_flap_prefix,
11172: show_ip_bgp_damp_flap_prefix_cmd,
11173: "show ip bgp dampening flap-statistics A.B.C.D/M",
11174: SHOW_STR
11175: IP_STR
11176: BGP_STR
11177: "Display detailed information about dampening\n"
11178: "Display flap statistics of routes\n"
11179: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11180:
11181: DEFUN (show_bgp_prefix_longer,
11182: show_bgp_prefix_longer_cmd,
11183: "show bgp X:X::X:X/M longer-prefixes",
11184: SHOW_STR
11185: BGP_STR
11186: "IPv6 prefix <network>/<length>\n"
11187: "Display route and more specific routes\n")
11188: {
11189: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
11190: bgp_show_type_prefix_longer);
11191: }
11192:
11193: /* old command */
11194: DEFUN (show_ipv6_bgp_prefix_longer,
11195: show_ipv6_bgp_prefix_longer_cmd,
11196: "show ipv6 bgp X:X::X:X/M longer-prefixes",
11197: SHOW_STR
11198: IPV6_STR
11199: BGP_STR
11200: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
11201: "Display route and more specific routes\n")
11202: {
11203: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
11204: bgp_show_type_prefix_longer);
11205: }
11206:
11207: /* old command */
11208: DEFUN (show_ipv6_mbgp_prefix_longer,
11209: show_ipv6_mbgp_prefix_longer_cmd,
11210: "show ipv6 mbgp X:X::X:X/M longer-prefixes",
11211: SHOW_STR
11212: IPV6_STR
11213: MBGP_STR
11214: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
11215: "Display route and more specific routes\n")
11216: {
11217: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
11218: bgp_show_type_prefix_longer);
11219: }
11220:
11221: DEFUN (show_bgp_ipv4_prefix_longer,
11222: show_bgp_ipv4_prefix_longer_cmd,
11223: "show bgp ipv4 A.B.C.D/M longer-prefixes",
11224: SHOW_STR
11225: BGP_STR
11226: IP_STR
11227: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11228: "Display route and more specific routes\n")
11229: {
11230: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
11231: bgp_show_type_prefix_longer);
11232: }
11233:
11234: DEFUN (show_bgp_ipv4_safi_flap_prefix_longer,
11235: show_bgp_ipv4_safi_flap_prefix_longer_cmd,
11236: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics A.B.C.D/M longer-prefixes",
11237: SHOW_STR
11238: BGP_STR
11239: "Address family\n"
11240: "Address Family modifier\n"
11241: "Address Family modifier\n"
11242: "Address Family modifier\n"
11243: "Address Family modifier\n"
11244: "Display flap statistics of routes\n"
11245: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11246: "Display route and more specific routes\n")
11247: {
11248: safi_t safi;
11249:
11250: if (bgp_parse_safi(argv[0], &safi)) {
11251: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11252: return CMD_WARNING;
11253: }
11254: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, safi,
11255: bgp_show_type_flap_prefix_longer);
11256: }
11257:
11258: ALIAS (show_bgp_ipv4_safi_flap_prefix_longer,
11259: show_bgp_ipv4_safi_damp_flap_prefix_longer_cmd,
11260: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics A.B.C.D/M longer-prefixes",
11261: SHOW_STR
11262: BGP_STR
11263: "Address family\n"
11264: "Address Family modifier\n"
11265: "Address Family modifier\n"
11266: "Address Family modifier\n"
11267: "Address Family modifier\n"
11268: "Display detailed information about dampening\n"
11269: "Display flap statistics of routes\n"
11270: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11271: "Display route and more specific routes\n")
11272:
11273: DEFUN (show_bgp_ipv6_safi_flap_prefix_longer,
11274: show_bgp_ipv6_safi_flap_prefix_longer_cmd,
11275: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics X:X::X:X/M longer-prefixes",
11276: SHOW_STR
11277: BGP_STR
11278: "Address family\n"
11279: "Address Family modifier\n"
11280: "Address Family modifier\n"
11281: "Address Family modifier\n"
11282: "Address Family modifier\n"
11283: "Display flap statistics of routes\n"
11284: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11285: "Display route and more specific routes\n")
11286: {
11287: safi_t safi;
11288:
11289: if (bgp_parse_safi(argv[0], &safi)) {
11290: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11291: return CMD_WARNING;
11292: }
11293: return bgp_show_prefix_longer (vty, argv[1], AFI_IP6, safi,
11294: bgp_show_type_flap_prefix_longer);
11295: }
11296: ALIAS (show_bgp_ipv6_safi_flap_prefix_longer,
11297: show_bgp_ipv6_safi_damp_flap_prefix_longer_cmd,
11298: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics X:X::X:X/M longer-prefixes",
11299: SHOW_STR
11300: BGP_STR
11301: "Address family\n"
11302: "Address Family modifier\n"
11303: "Address Family modifier\n"
11304: "Address Family modifier\n"
11305: "Address Family modifier\n"
11306: "Display detailed information about dampening\n"
11307: "Display flap statistics of routes\n"
11308: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11309: "Display route and more specific routes\n")
11310:
11311: DEFUN (show_bgp_ipv4_safi_prefix_longer,
11312: show_bgp_ipv4_safi_prefix_longer_cmd,
11313: "show bgp ipv4 (encap|multicast|unicast|vpn) A.B.C.D/M longer-prefixes",
11314: SHOW_STR
11315: BGP_STR
11316: "Address family\n"
11317: "Address Family modifier\n"
11318: "Address Family modifier\n"
11319: "Address Family modifier\n"
11320: "Address Family modifier\n"
11321: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11322: "Display route and more specific routes\n")
11323: {
11324: safi_t safi;
11325:
11326: if (bgp_parse_safi(argv[0], &safi)) {
11327: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11328: return CMD_WARNING;
11329: }
11330:
11331: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, safi,
11332: bgp_show_type_prefix_longer);
11333: }
11334:
11335: DEFUN (show_bgp_ipv6_safi_prefix_longer,
11336: show_bgp_ipv6_safi_prefix_longer_cmd,
11337: "show bgp ipv6 (encap|multicast|unicast|vpn) X:X::X:X/M longer-prefixes",
11338: SHOW_STR
11339: BGP_STR
11340: "Address family\n"
11341: "Address Family modifier\n"
11342: "Address Family modifier\n"
11343: "Address Family modifier\n"
11344: "Address Family modifier\n"
11345: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
11346: "Display route and more specific routes\n")
11347: {
11348: safi_t safi;
11349:
11350: if (bgp_parse_safi(argv[0], &safi)) {
11351: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11352: return CMD_WARNING;
11353: }
11354:
11355: return bgp_show_prefix_longer (vty, argv[1], AFI_IP6, safi,
11356: bgp_show_type_prefix_longer);
11357: }
11358:
11359: DEFUN (show_bgp_ipv4_safi_flap_address,
11360: show_bgp_ipv4_safi_flap_address_cmd,
11361: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics A.B.C.D",
11362: SHOW_STR
11363: BGP_STR
11364: "Address family\n"
11365: "Address Family modifier\n"
11366: "Address Family modifier\n"
11367: "Address Family modifier\n"
11368: "Address Family modifier\n"
11369: "Display flap statistics of routes\n"
11370: "Network in the BGP routing table to display\n")
11371: {
11372: safi_t safi;
11373:
11374: if (bgp_parse_safi(argv[0], &safi)) {
11375: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
11376: return CMD_WARNING;
11377: }
11378: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, safi,
11379: bgp_show_type_flap_address);
11380: }
11381: ALIAS (show_bgp_ipv4_safi_flap_address,
11382: show_bgp_ipv4_safi_damp_flap_address_cmd,
11383: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics A.B.C.D",
11384: SHOW_STR
11385: BGP_STR
11386: "Address family\n"
11387: "Address Family modifier\n"
11388: "Address Family modifier\n"
11389: "Address Family modifier\n"
11390: "Address Family modifier\n"
11391: "Display detailed information about dampening\n"
11392: "Display flap statistics of routes\n"
11393: "Network in the BGP routing table to display\n")
11394:
11395: DEFUN (show_bgp_ipv6_flap_address,
11396: show_bgp_ipv6_flap_address_cmd,
11397: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics A.B.C.D",
11398: SHOW_STR
11399: BGP_STR
11400: "Address family\n"
11401: "Address Family modifier\n"
11402: "Address Family modifier\n"
11403: "Address Family modifier\n"
11404: "Address Family modifier\n"
11405: "Display flap statistics of routes\n"
11406: "Network in the BGP routing table to display\n")
11407: {
11408: safi_t safi;
11409:
11410: if (bgp_parse_safi(argv[0], &safi)) {
11411: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
11412: return CMD_WARNING;
11413: }
11414: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, safi,
11415: bgp_show_type_flap_address);
11416: }
11417: ALIAS (show_bgp_ipv6_flap_address,
11418: show_bgp_ipv6_damp_flap_address_cmd,
11419: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics A.B.C.D",
11420: SHOW_STR
11421: BGP_STR
11422: "Address family\n"
11423: "Address Family modifier\n"
11424: "Address Family modifier\n"
11425: "Address Family modifier\n"
11426: "Address Family modifier\n"
11427: "Display detailed information about dampening\n"
11428: "Display flap statistics of routes\n"
11429: "Network in the BGP routing table to display\n")
11430:
11431: DEFUN (show_bgp_ipv4_safi_flap_prefix,
11432: show_bgp_ipv4_safi_flap_prefix_cmd,
11433: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics A.B.C.D/M",
11434: SHOW_STR
11435: BGP_STR
11436: "Address family\n"
11437: "Address Family modifier\n"
11438: "Address Family modifier\n"
11439: "Address Family modifier\n"
11440: "Address Family modifier\n"
11441: "Display flap statistics of routes\n"
11442: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11443: {
11444: safi_t safi;
11445:
11446: if (bgp_parse_safi(argv[0], &safi)) {
11447: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
11448: return CMD_WARNING;
11449: }
11450: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, safi,
11451: bgp_show_type_flap_prefix);
11452: }
11453:
11454: ALIAS (show_bgp_ipv4_safi_flap_prefix,
11455: show_bgp_ipv4_safi_damp_flap_prefix_cmd,
11456: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics A.B.C.D/M",
11457: SHOW_STR
11458: BGP_STR
11459: "Address family\n"
11460: "Address Family modifier\n"
11461: "Address Family modifier\n"
11462: "Address Family modifier\n"
11463: "Address Family modifier\n"
11464: "Display detailed information about dampening\n"
11465: "Display flap statistics of routes\n"
11466: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11467:
11468: DEFUN (show_bgp_ipv6_safi_flap_prefix,
11469: show_bgp_ipv6_safi_flap_prefix_cmd,
11470: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics X:X::X:X/M",
11471: SHOW_STR
11472: BGP_STR
11473: "Address family\n"
11474: "Address Family modifier\n"
11475: "Address Family modifier\n"
11476: "Address Family modifier\n"
11477: "Address Family modifier\n"
11478: "Display flap statistics of routes\n"
11479: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11480: {
11481: safi_t safi;
11482:
11483: if (bgp_parse_safi(argv[0], &safi)) {
11484: vty_out (vty, "Error: Bad SAFI: %s%s", argv[1], VTY_NEWLINE);
11485: return CMD_WARNING;
11486: }
11487: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, safi,
11488: bgp_show_type_flap_prefix);
11489: }
11490:
11491: ALIAS (show_bgp_ipv6_safi_flap_prefix,
11492: show_bgp_ipv6_safi_damp_flap_prefix_cmd,
11493: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics X:X::X:X/M",
11494: SHOW_STR
11495: BGP_STR
11496: "Address family\n"
11497: "Address Family modifier\n"
11498: "Address Family modifier\n"
11499: "Address Family modifier\n"
11500: "Address Family modifier\n"
11501: "Display detailed information about dampening\n"
11502: "Display flap statistics of routes\n"
11503: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
11504:
11505: DEFUN (show_bgp_ipv6_prefix_longer,
11506: show_bgp_ipv6_prefix_longer_cmd,
11507: "show bgp ipv6 X:X::X:X/M longer-prefixes",
11508: SHOW_STR
11509: BGP_STR
11510: "Address family\n"
11511: "IPv6 prefix <network>/<length>\n"
11512: "Display route and more specific routes\n")
11513: {
11514: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
11515: bgp_show_type_prefix_longer);
11516: }
11517:
11518: static struct peer *
11519: peer_lookup_in_view (struct vty *vty, const char *view_name,
11520: const char *ip_str)
11521: {
11522: int ret;
11523: struct bgp *bgp;
11524: struct peer *peer;
11525: union sockunion su;
11526:
11527: /* BGP structure lookup. */
11528: if (view_name)
11529: {
11530: bgp = bgp_lookup_by_name (view_name);
11531: if (! bgp)
11532: {
11533: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11534: return NULL;
11535: }
11536: }
11537: else
11538: {
11539: bgp = bgp_get_default ();
11540: if (! bgp)
11541: {
11542: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11543: return NULL;
11544: }
11545: }
11546:
11547: /* Get peer sockunion. */
11548: ret = str2sockunion (ip_str, &su);
11549: if (ret < 0)
11550: {
11551: vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
11552: return NULL;
11553: }
11554:
11555: /* Peer structure lookup. */
11556: peer = peer_lookup (bgp, &su);
11557: if (! peer)
11558: {
11559: vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
11560: return NULL;
11561: }
11562:
11563: return peer;
11564: }
11565:
11566: enum bgp_stats
11567: {
11568: BGP_STATS_MAXBITLEN = 0,
11569: BGP_STATS_RIB,
11570: BGP_STATS_PREFIXES,
11571: BGP_STATS_TOTPLEN,
11572: BGP_STATS_UNAGGREGATEABLE,
11573: BGP_STATS_MAX_AGGREGATEABLE,
11574: BGP_STATS_AGGREGATES,
11575: BGP_STATS_SPACE,
11576: BGP_STATS_ASPATH_COUNT,
11577: BGP_STATS_ASPATH_MAXHOPS,
11578: BGP_STATS_ASPATH_TOTHOPS,
11579: BGP_STATS_ASPATH_MAXSIZE,
11580: BGP_STATS_ASPATH_TOTSIZE,
11581: BGP_STATS_ASN_HIGHEST,
11582: BGP_STATS_MAX,
11583: };
11584:
11585: static const char *table_stats_strs[] =
11586: {
11587: [BGP_STATS_PREFIXES] = "Total Prefixes",
11588: [BGP_STATS_TOTPLEN] = "Average prefix length",
11589: [BGP_STATS_RIB] = "Total Advertisements",
11590: [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
11591: [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
11592: [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
11593: [BGP_STATS_SPACE] = "Address space advertised",
11594: [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
11595: [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
11596: [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
11597: [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
11598: [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
11599: [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
11600: [BGP_STATS_MAX] = NULL,
11601: };
11602:
11603: struct bgp_table_stats
11604: {
11605: struct bgp_table *table;
11606: unsigned long long counts[BGP_STATS_MAX];
11607: };
11608:
11609: #if 0
11610: #define TALLY_SIGFIG 100000
11611: static unsigned long
11612: ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
11613: {
11614: unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
11615: unsigned long res = (newtot * TALLY_SIGFIG) / count;
11616: unsigned long ret = newtot / count;
11617:
11618: if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
11619: return ret + 1;
11620: else
11621: return ret;
11622: }
11623: #endif
11624:
11625: static int
11626: bgp_table_stats_walker (struct thread *t)
11627: {
11628: struct bgp_node *rn;
11629: struct bgp_node *top;
11630: struct bgp_table_stats *ts = THREAD_ARG (t);
11631: unsigned int space = 0;
11632:
11633: if (!(top = bgp_table_top (ts->table)))
11634: return 0;
11635:
11636: switch (top->p.family)
11637: {
11638: case AF_INET:
11639: space = IPV4_MAX_BITLEN;
11640: break;
11641: case AF_INET6:
11642: space = IPV6_MAX_BITLEN;
11643: break;
11644: }
11645:
11646: ts->counts[BGP_STATS_MAXBITLEN] = space;
11647:
11648: for (rn = top; rn; rn = bgp_route_next (rn))
11649: {
11650: struct bgp_info *ri;
11651: struct bgp_node *prn = bgp_node_parent_nolock (rn);
11652: unsigned int rinum = 0;
11653:
11654: if (rn == top)
11655: continue;
11656:
11657: if (!rn->info)
11658: continue;
11659:
11660: ts->counts[BGP_STATS_PREFIXES]++;
11661: ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
11662:
11663: #if 0
11664: ts->counts[BGP_STATS_AVGPLEN]
11665: = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
11666: ts->counts[BGP_STATS_AVGPLEN],
11667: rn->p.prefixlen);
11668: #endif
11669:
11670: /* check if the prefix is included by any other announcements */
11671: while (prn && !prn->info)
11672: prn = bgp_node_parent_nolock (prn);
11673:
11674: if (prn == NULL || prn == top)
11675: {
11676: ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
11677: /* announced address space */
11678: if (space)
11679: ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
11680: }
11681: else if (prn->info)
11682: ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
11683:
11684: for (ri = rn->info; ri; ri = ri->next)
11685: {
11686: rinum++;
11687: ts->counts[BGP_STATS_RIB]++;
11688:
11689: if (ri->attr &&
11690: (CHECK_FLAG (ri->attr->flag,
11691: ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
11692: ts->counts[BGP_STATS_AGGREGATES]++;
11693:
11694: /* as-path stats */
11695: if (ri->attr && ri->attr->aspath)
11696: {
11697: unsigned int hops = aspath_count_hops (ri->attr->aspath);
11698: unsigned int size = aspath_size (ri->attr->aspath);
11699: as_t highest = aspath_highest (ri->attr->aspath);
11700:
11701: ts->counts[BGP_STATS_ASPATH_COUNT]++;
11702:
11703: if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
11704: ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
11705:
11706: if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
11707: ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
11708:
11709: ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
11710: ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
11711: #if 0
11712: ts->counts[BGP_STATS_ASPATH_AVGHOPS]
11713: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
11714: ts->counts[BGP_STATS_ASPATH_AVGHOPS],
11715: hops);
11716: ts->counts[BGP_STATS_ASPATH_AVGSIZE]
11717: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
11718: ts->counts[BGP_STATS_ASPATH_AVGSIZE],
11719: size);
11720: #endif
11721: if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
11722: ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
11723: }
11724: }
11725: }
11726: return 0;
11727: }
11728:
11729: static int
11730: bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
11731: {
11732: struct bgp_table_stats ts;
11733: unsigned int i;
11734:
11735: if (!bgp->rib[afi][safi])
11736: {
11737: vty_out (vty, "%% No RIB exists for the AFI/SAFI%s", VTY_NEWLINE);
11738: return CMD_WARNING;
11739: }
11740:
11741: memset (&ts, 0, sizeof (ts));
11742: ts.table = bgp->rib[afi][safi];
11743: thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
11744:
11745: vty_out (vty, "BGP %s RIB statistics%s%s",
11746: afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
11747:
11748: for (i = 0; i < BGP_STATS_MAX; i++)
11749: {
11750: if (!table_stats_strs[i])
11751: continue;
11752:
11753: switch (i)
11754: {
11755: #if 0
11756: case BGP_STATS_ASPATH_AVGHOPS:
11757: case BGP_STATS_ASPATH_AVGSIZE:
11758: case BGP_STATS_AVGPLEN:
11759: vty_out (vty, "%-30s: ", table_stats_strs[i]);
11760: vty_out (vty, "%12.2f",
11761: (float)ts.counts[i] / (float)TALLY_SIGFIG);
11762: break;
11763: #endif
11764: case BGP_STATS_ASPATH_TOTHOPS:
11765: case BGP_STATS_ASPATH_TOTSIZE:
11766: vty_out (vty, "%-30s: ", table_stats_strs[i]);
11767: vty_out (vty, "%12.2f",
11768: ts.counts[i] ?
11769: (float)ts.counts[i] /
11770: (float)ts.counts[BGP_STATS_ASPATH_COUNT]
11771: : 0);
11772: break;
11773: case BGP_STATS_TOTPLEN:
11774: vty_out (vty, "%-30s: ", table_stats_strs[i]);
11775: vty_out (vty, "%12.2f",
11776: ts.counts[i] ?
11777: (float)ts.counts[i] /
11778: (float)ts.counts[BGP_STATS_PREFIXES]
11779: : 0);
11780: break;
11781: case BGP_STATS_SPACE:
11782: vty_out (vty, "%-30s: ", table_stats_strs[i]);
11783: vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
11784: if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
11785: break;
11786: vty_out (vty, "%30s: ", "%% announced ");
11787: vty_out (vty, "%12.2f%s",
11788: 100 * (float)ts.counts[BGP_STATS_SPACE] /
11789: (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
11790: VTY_NEWLINE);
11791: vty_out (vty, "%30s: ", "/8 equivalent ");
11792: vty_out (vty, "%12.2f%s",
11793: (float)ts.counts[BGP_STATS_SPACE] /
11794: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
11795: VTY_NEWLINE);
11796: if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
11797: break;
11798: vty_out (vty, "%30s: ", "/24 equivalent ");
11799: vty_out (vty, "%12.2f",
11800: (float)ts.counts[BGP_STATS_SPACE] /
11801: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
11802: break;
11803: default:
11804: vty_out (vty, "%-30s: ", table_stats_strs[i]);
11805: vty_out (vty, "%12llu", ts.counts[i]);
11806: }
11807:
11808: vty_out (vty, "%s", VTY_NEWLINE);
11809: }
11810: return CMD_SUCCESS;
11811: }
11812:
11813: static int
11814: bgp_table_stats_vty (struct vty *vty, const char *name,
11815: const char *afi_str, const char *safi_str)
11816: {
11817: struct bgp *bgp;
11818: afi_t afi;
11819: safi_t safi;
11820:
11821: if (name)
11822: bgp = bgp_lookup_by_name (name);
11823: else
11824: bgp = bgp_get_default ();
11825:
11826: if (!bgp)
11827: {
11828: vty_out (vty, "%% No such BGP instance exists%s", VTY_NEWLINE);
11829: return CMD_WARNING;
11830: }
11831: if (strncmp (afi_str, "ipv", 3) == 0)
11832: {
11833: if (strncmp (afi_str, "ipv4", 4) == 0)
11834: afi = AFI_IP;
11835: else if (strncmp (afi_str, "ipv6", 4) == 0)
11836: afi = AFI_IP6;
11837: else
11838: {
11839: vty_out (vty, "%% Invalid address family %s%s",
11840: afi_str, VTY_NEWLINE);
11841: return CMD_WARNING;
11842: }
11843: switch (safi_str[0]) {
11844: case 'm':
11845: safi = SAFI_MULTICAST;
11846: break;
11847: case 'u':
11848: safi = SAFI_UNICAST;
11849: break;
11850: case 'v':
11851: safi = SAFI_MPLS_LABELED_VPN;
11852: break;
11853: case 'e':
11854: safi = SAFI_ENCAP;
11855: break;
11856: default:
11857: vty_out (vty, "%% Invalid subsequent address family %s%s",
11858: safi_str, VTY_NEWLINE);
11859: return CMD_WARNING;
11860: }
11861: }
11862: else
11863: {
11864: vty_out (vty, "%% Invalid address family \"%s\"%s",
11865: afi_str, VTY_NEWLINE);
11866: return CMD_WARNING;
11867: }
11868:
11869: return bgp_table_stats (vty, bgp, afi, safi);
11870: }
11871:
11872: DEFUN (show_bgp_statistics,
11873: show_bgp_statistics_cmd,
11874: "show bgp (ipv4|ipv6) (encap|multicast|unicast|vpn) statistics",
11875: SHOW_STR
11876: BGP_STR
11877: "Address family\n"
11878: "Address family\n"
11879: "Address Family modifier\n"
11880: "Address Family modifier\n"
11881: "Address Family modifier\n"
11882: "Address Family modifier\n"
11883: "BGP RIB advertisement statistics\n")
11884: {
11885: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
11886: }
11887:
11888: ALIAS (show_bgp_statistics,
11889: show_bgp_statistics_vpnv4_cmd,
11890: "show bgp (ipv4) (vpnv4) statistics",
11891: SHOW_STR
11892: BGP_STR
11893: "Address family\n"
11894: "Address Family modifier\n"
11895: "BGP RIB advertisement statistics\n")
11896:
11897: DEFUN (show_bgp_statistics_view,
11898: show_bgp_statistics_view_cmd,
11899: "show bgp view WORD (ipv4|ipv6) (encap|multicast|unicast|vpn) statistics",
11900: SHOW_STR
11901: BGP_STR
11902: "BGP view\n"
11903: "Address family\n"
11904: "Address family\n"
11905: "Address Family modifier\n"
11906: "Address Family modifier\n"
11907: "Address Family modifier\n"
11908: "Address Family modifier\n"
11909: "BGP RIB advertisement statistics\n")
11910: {
11911: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
11912: }
11913:
11914: ALIAS (show_bgp_statistics_view,
11915: show_bgp_statistics_view_vpnv4_cmd,
11916: "show bgp view WORD (ipv4) (vpnv4) statistics",
11917: SHOW_STR
11918: BGP_STR
11919: "BGP view\n"
11920: "Address family\n"
11921: "Address Family modifier\n"
11922: "BGP RIB advertisement statistics\n")
11923:
11924: enum bgp_pcounts
11925: {
11926: PCOUNT_ADJ_IN = 0,
11927: PCOUNT_DAMPED,
11928: PCOUNT_REMOVED,
11929: PCOUNT_HISTORY,
11930: PCOUNT_STALE,
11931: PCOUNT_VALID,
11932: PCOUNT_ALL,
11933: PCOUNT_COUNTED,
11934: PCOUNT_PFCNT, /* the figure we display to users */
11935: PCOUNT_MAX,
11936: };
11937:
11938: static const char *pcount_strs[] =
11939: {
11940: [PCOUNT_ADJ_IN] = "Adj-in",
11941: [PCOUNT_DAMPED] = "Damped",
11942: [PCOUNT_REMOVED] = "Removed",
11943: [PCOUNT_HISTORY] = "History",
11944: [PCOUNT_STALE] = "Stale",
11945: [PCOUNT_VALID] = "Valid",
11946: [PCOUNT_ALL] = "All RIB",
11947: [PCOUNT_COUNTED] = "PfxCt counted",
11948: [PCOUNT_PFCNT] = "Useable",
11949: [PCOUNT_MAX] = NULL,
11950: };
11951:
11952: struct peer_pcounts
11953: {
11954: unsigned int count[PCOUNT_MAX];
11955: const struct peer *peer;
11956: const struct bgp_table *table;
11957: };
11958:
11959: static int
11960: bgp_peer_count_walker (struct thread *t)
11961: {
11962: struct bgp_node *rn;
11963: struct peer_pcounts *pc = THREAD_ARG (t);
11964: const struct peer *peer = pc->peer;
11965:
11966: for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
11967: {
11968: struct bgp_adj_in *ain;
11969: struct bgp_info *ri;
11970:
11971: for (ain = rn->adj_in; ain; ain = ain->next)
11972: if (ain->peer == peer)
11973: pc->count[PCOUNT_ADJ_IN]++;
11974:
11975: for (ri = rn->info; ri; ri = ri->next)
11976: {
11977: char buf[SU_ADDRSTRLEN];
11978:
11979: if (ri->peer != peer)
11980: continue;
11981:
11982: pc->count[PCOUNT_ALL]++;
11983:
11984: if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
11985: pc->count[PCOUNT_DAMPED]++;
11986: if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
11987: pc->count[PCOUNT_HISTORY]++;
11988: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
11989: pc->count[PCOUNT_REMOVED]++;
11990: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
11991: pc->count[PCOUNT_STALE]++;
11992: if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
11993: pc->count[PCOUNT_VALID]++;
11994: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
11995: pc->count[PCOUNT_PFCNT]++;
11996:
11997: if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
11998: {
11999: pc->count[PCOUNT_COUNTED]++;
12000: if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
12001: plog_warn (peer->log,
12002: "%s [pcount] %s/%d is counted but flags 0x%x",
12003: peer->host,
12004: inet_ntop(rn->p.family, &rn->p.u.prefix,
12005: buf, SU_ADDRSTRLEN),
12006: rn->p.prefixlen,
12007: ri->flags);
12008: }
12009: else
12010: {
12011: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
12012: plog_warn (peer->log,
12013: "%s [pcount] %s/%d not counted but flags 0x%x",
12014: peer->host,
12015: inet_ntop(rn->p.family, &rn->p.u.prefix,
12016: buf, SU_ADDRSTRLEN),
12017: rn->p.prefixlen,
12018: ri->flags);
12019: }
12020: }
12021: }
12022: return 0;
12023: }
12024:
12025: static int
12026: bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
12027: {
12028: struct peer_pcounts pcounts = { .peer = peer };
12029: unsigned int i;
12030:
12031: if (!peer || !peer->bgp || !peer->afc[afi][safi]
12032: || !peer->bgp->rib[afi][safi])
12033: {
12034: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
12035: return CMD_WARNING;
12036: }
12037:
12038: memset (&pcounts, 0, sizeof(pcounts));
12039: pcounts.peer = peer;
12040: pcounts.table = peer->bgp->rib[afi][safi];
12041:
12042: /* in-place call via thread subsystem so as to record execution time
12043: * stats for the thread-walk (i.e. ensure this can't be blamed on
12044: * on just vty_read()).
12045: */
12046: thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
12047:
12048: vty_out (vty, "Prefix counts for %s, %s%s",
12049: peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
12050: vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
12051: vty_out (vty, "%sCounts from RIB table walk:%s%s",
12052: VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
12053:
12054: for (i = 0; i < PCOUNT_MAX; i++)
12055: vty_out (vty, "%20s: %-10d%s",
12056: pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
12057:
12058: if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
12059: {
12060: vty_out (vty, "%s [pcount] PfxCt drift!%s",
12061: peer->host, VTY_NEWLINE);
12062: vty_out (vty, "Please report this bug, with the above command output%s",
12063: VTY_NEWLINE);
12064: }
12065:
12066: return CMD_SUCCESS;
12067: }
12068:
12069: DEFUN (show_ip_bgp_neighbor_prefix_counts,
12070: show_ip_bgp_neighbor_prefix_counts_cmd,
12071: "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12072: SHOW_STR
12073: IP_STR
12074: BGP_STR
12075: "Detailed information on TCP and BGP neighbor connections\n"
12076: "Neighbor to display information about\n"
12077: "Neighbor to display information about\n"
12078: "Display detailed prefix count information\n")
12079: {
12080: struct peer *peer;
12081:
12082: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12083: if (! peer)
12084: return CMD_WARNING;
12085:
12086: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
12087: }
12088:
12089: DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
12090: show_bgp_ipv6_neighbor_prefix_counts_cmd,
12091: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12092: SHOW_STR
12093: BGP_STR
12094: "Address family\n"
12095: "Detailed information on TCP and BGP neighbor connections\n"
12096: "Neighbor to display information about\n"
12097: "Neighbor to display information about\n"
12098: "Display detailed prefix count information\n")
12099: {
12100: struct peer *peer;
12101:
12102: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12103: if (! peer)
12104: return CMD_WARNING;
12105:
12106: return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
12107: }
12108:
12109: DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
12110: show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
12111: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12112: SHOW_STR
12113: IP_STR
12114: BGP_STR
12115: "Address family\n"
12116: "Address Family modifier\n"
12117: "Address Family modifier\n"
12118: "Detailed information on TCP and BGP neighbor connections\n"
12119: "Neighbor to display information about\n"
12120: "Neighbor to display information about\n"
12121: "Display detailed prefix count information\n")
12122: {
12123: struct peer *peer;
12124:
12125: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12126: if (! peer)
12127: return CMD_WARNING;
12128:
12129: if (strncmp (argv[0], "m", 1) == 0)
12130: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
12131:
12132: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
12133: }
12134:
12135: DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
12136: show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
12137: "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12138: SHOW_STR
12139: IP_STR
12140: BGP_STR
12141: "Address family\n"
12142: "Address Family modifier\n"
12143: "Address Family modifier\n"
12144: "Detailed information on TCP and BGP neighbor connections\n"
12145: "Neighbor to display information about\n"
12146: "Neighbor to display information about\n"
12147: "Display detailed prefix count information\n")
12148: {
12149: struct peer *peer;
12150:
12151: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12152: if (! peer)
12153: return CMD_WARNING;
12154:
12155: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
12156: }
12157:
12158: DEFUN (show_bgp_ipv4_safi_neighbor_prefix_counts,
12159: show_bgp_ipv4_safi_neighbor_prefix_counts_cmd,
12160: "show bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12161: SHOW_STR
12162: BGP_STR
12163: "Address family\n"
12164: "Address Family modifier\n"
12165: "Address Family modifier\n"
12166: "Address Family modifier\n"
12167: "Address Family modifier\n"
12168: "Detailed information on TCP and BGP neighbor connections\n"
12169: "Neighbor to display information about\n"
12170: "Neighbor to display information about\n"
12171: "Display detailed prefix count information\n")
12172: {
12173: struct peer *peer;
12174: safi_t safi;
12175:
12176: if (bgp_parse_safi(argv[0], &safi)) {
12177: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12178: return CMD_WARNING;
12179: }
12180:
12181: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12182: if (! peer)
12183: return CMD_WARNING;
12184:
12185: return bgp_peer_counts (vty, peer, AFI_IP, safi);
12186: }
12187:
12188: DEFUN (show_bgp_ipv6_safi_neighbor_prefix_counts,
12189: show_bgp_ipv6_safi_neighbor_prefix_counts_cmd,
12190: "show bgp ipv6 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12191: SHOW_STR
12192: BGP_STR
12193: "Address family\n"
12194: "Address Family modifier\n"
12195: "Address Family modifier\n"
12196: "Address Family modifier\n"
12197: "Address Family modifier\n"
12198: "Detailed information on TCP and BGP neighbor connections\n"
12199: "Neighbor to display information about\n"
12200: "Neighbor to display information about\n"
12201: "Display detailed prefix count information\n")
12202: {
12203: struct peer *peer;
12204: safi_t safi;
12205:
12206: if (bgp_parse_safi(argv[0], &safi)) {
12207: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12208: return CMD_WARNING;
12209: }
12210:
12211: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12212: if (! peer)
12213: return CMD_WARNING;
12214:
12215: return bgp_peer_counts (vty, peer, AFI_IP6, safi);
12216: }
12217:
12218: DEFUN (show_ip_bgp_encap_neighbor_prefix_counts,
12219: show_ip_bgp_encap_neighbor_prefix_counts_cmd,
12220: "show ip bgp encap all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
12221: SHOW_STR
12222: IP_STR
12223: BGP_STR
12224: "Address family\n"
12225: "Address Family modifier\n"
12226: "Address Family modifier\n"
12227: "Detailed information on TCP and BGP neighbor connections\n"
12228: "Neighbor to display information about\n"
12229: "Neighbor to display information about\n"
12230: "Display detailed prefix count information\n")
12231: {
12232: struct peer *peer;
12233:
12234: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12235: if (! peer)
12236: return CMD_WARNING;
12237:
12238: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_ENCAP);
12239: }
12240:
12241:
12242: static void
12243: show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
12244: int in)
12245: {
12246: struct bgp_table *table;
12247: struct bgp_adj_in *ain;
12248: struct bgp_adj_out *adj;
12249: unsigned long output_count;
12250: struct bgp_node *rn;
12251: int header1 = 1;
12252: struct bgp *bgp;
12253: int header2 = 1;
12254:
12255: bgp = peer->bgp;
12256:
12257: if (! bgp)
12258: return;
12259:
12260: table = bgp->rib[afi][safi];
12261:
12262: output_count = 0;
12263:
12264: if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
12265: PEER_STATUS_DEFAULT_ORIGINATE))
12266: {
12267: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
12268: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12269: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12270:
12271: vty_out (vty, "Originating default network 0.0.0.0%s%s",
12272: VTY_NEWLINE, VTY_NEWLINE);
12273: header1 = 0;
12274: }
12275:
12276: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
12277: if (in)
12278: {
12279: for (ain = rn->adj_in; ain; ain = ain->next)
12280: if (ain->peer == peer)
12281: {
12282: if (header1)
12283: {
12284: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
12285: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12286: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12287: header1 = 0;
12288: }
12289: if (header2)
12290: {
12291: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
12292: header2 = 0;
12293: }
12294: if (ain->attr)
12295: {
12296: route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
12297: output_count++;
12298: }
12299: }
12300: }
12301: else
12302: {
12303: for (adj = rn->adj_out; adj; adj = adj->next)
12304: if (adj->peer == peer)
12305: {
12306: if (header1)
12307: {
12308: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
12309: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12310: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
12311: header1 = 0;
12312: }
12313: if (header2)
12314: {
12315: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
12316: header2 = 0;
12317: }
12318: if (adj->attr)
12319: {
12320: route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
12321: output_count++;
12322: }
12323: }
12324: }
12325:
12326: if (output_count != 0)
12327: vty_out (vty, "%sTotal number of prefixes %ld%s",
12328: VTY_NEWLINE, output_count, VTY_NEWLINE);
12329: }
12330:
12331: static int
12332: peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
12333: {
12334: if (! peer || ! peer->afc[afi][safi])
12335: {
12336: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
12337: return CMD_WARNING;
12338: }
12339:
12340: if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
12341: {
12342: vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
12343: VTY_NEWLINE);
12344: return CMD_WARNING;
12345: }
12346:
12347: show_adj_route (vty, peer, afi, safi, in);
12348:
12349: return CMD_SUCCESS;
12350: }
12351:
12352: DEFUN (show_ip_bgp_view_neighbor_advertised_route,
12353: show_ip_bgp_view_neighbor_advertised_route_cmd,
12354: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12355: SHOW_STR
12356: IP_STR
12357: BGP_STR
12358: "BGP view\n"
12359: "View name\n"
12360: "Detailed information on TCP and BGP neighbor connections\n"
12361: "Neighbor to display information about\n"
12362: "Neighbor to display information about\n"
12363: "Display the routes advertised to a BGP neighbor\n")
12364: {
12365: struct peer *peer;
12366:
12367: if (argc == 2)
12368: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12369: else
12370: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12371:
12372: if (! peer)
12373: return CMD_WARNING;
12374:
12375: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
12376: }
12377:
12378: ALIAS (show_ip_bgp_view_neighbor_advertised_route,
12379: show_ip_bgp_neighbor_advertised_route_cmd,
12380: "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12381: SHOW_STR
12382: IP_STR
12383: BGP_STR
12384: "Detailed information on TCP and BGP neighbor connections\n"
12385: "Neighbor to display information about\n"
12386: "Neighbor to display information about\n"
12387: "Display the routes advertised to a BGP neighbor\n")
12388:
12389: DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
12390: show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
12391: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12392: SHOW_STR
12393: IP_STR
12394: BGP_STR
12395: "Address family\n"
12396: "Address Family modifier\n"
12397: "Address Family modifier\n"
12398: "Detailed information on TCP and BGP neighbor connections\n"
12399: "Neighbor to display information about\n"
12400: "Neighbor to display information about\n"
12401: "Display the routes advertised to a BGP neighbor\n")
12402: {
12403: struct peer *peer;
12404:
12405: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12406: if (! peer)
12407: return CMD_WARNING;
12408:
12409: if (strncmp (argv[0], "m", 1) == 0)
12410: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
12411:
12412: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
12413: }
12414:
12415: DEFUN (show_bgp_view_neighbor_advertised_route,
12416: show_bgp_view_neighbor_advertised_route_cmd,
12417: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12418: SHOW_STR
12419: BGP_STR
12420: "BGP view\n"
12421: "View name\n"
12422: "Detailed information on TCP and BGP neighbor connections\n"
12423: "Neighbor to display information about\n"
12424: "Neighbor to display information about\n"
12425: "Display the routes advertised to a BGP neighbor\n")
12426: {
12427: struct peer *peer;
12428:
12429: if (argc == 2)
12430: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12431: else
12432: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12433:
12434: if (! peer)
12435: return CMD_WARNING;
12436:
12437: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
12438: }
12439:
12440: DEFUN (show_bgp_view_neighbor_received_routes,
12441: show_bgp_view_neighbor_received_routes_cmd,
12442: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
12443: SHOW_STR
12444: BGP_STR
12445: "BGP view\n"
12446: "View name\n"
12447: "Detailed information on TCP and BGP neighbor connections\n"
12448: "Neighbor to display information about\n"
12449: "Neighbor to display information about\n"
12450: "Display the received routes from neighbor\n")
12451: {
12452: struct peer *peer;
12453:
12454: if (argc == 2)
12455: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12456: else
12457: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12458:
12459: if (! peer)
12460: return CMD_WARNING;
12461:
12462: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
12463: }
12464:
12465: ALIAS (show_bgp_view_neighbor_advertised_route,
12466: show_bgp_neighbor_advertised_route_cmd,
12467: "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12468: SHOW_STR
12469: BGP_STR
12470: "Detailed information on TCP and BGP neighbor connections\n"
12471: "Neighbor to display information about\n"
12472: "Neighbor to display information about\n"
12473: "Display the routes advertised to a BGP neighbor\n")
12474:
12475: ALIAS (show_bgp_view_neighbor_advertised_route,
12476: show_bgp_ipv6_neighbor_advertised_route_cmd,
12477: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12478: SHOW_STR
12479: BGP_STR
12480: "Address family\n"
12481: "Detailed information on TCP and BGP neighbor connections\n"
12482: "Neighbor to display information about\n"
12483: "Neighbor to display information about\n"
12484: "Display the routes advertised to a BGP neighbor\n")
12485:
12486: /* old command */
12487: ALIAS (show_bgp_view_neighbor_advertised_route,
12488: ipv6_bgp_neighbor_advertised_route_cmd,
12489: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12490: SHOW_STR
12491: IPV6_STR
12492: BGP_STR
12493: "Detailed information on TCP and BGP neighbor connections\n"
12494: "Neighbor to display information about\n"
12495: "Neighbor to display information about\n"
12496: "Display the routes advertised to a BGP neighbor\n")
12497:
12498: /* old command */
12499: DEFUN (ipv6_mbgp_neighbor_advertised_route,
12500: ipv6_mbgp_neighbor_advertised_route_cmd,
12501: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12502: SHOW_STR
12503: IPV6_STR
12504: MBGP_STR
12505: "Detailed information on TCP and BGP neighbor connections\n"
12506: "Neighbor to display information about\n"
12507: "Neighbor to display information about\n"
12508: "Display the routes advertised to a BGP neighbor\n")
12509: {
12510: struct peer *peer;
12511:
12512: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12513: if (! peer)
12514: return CMD_WARNING;
12515:
12516: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
12517: }
12518:
12519: DEFUN (show_ip_bgp_view_neighbor_received_routes,
12520: show_ip_bgp_view_neighbor_received_routes_cmd,
12521: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
12522: SHOW_STR
12523: IP_STR
12524: BGP_STR
12525: "BGP view\n"
12526: "View name\n"
12527: "Detailed information on TCP and BGP neighbor connections\n"
12528: "Neighbor to display information about\n"
12529: "Neighbor to display information about\n"
12530: "Display the received routes from neighbor\n")
12531: {
12532: struct peer *peer;
12533:
12534: if (argc == 2)
12535: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12536: else
12537: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12538:
12539: if (! peer)
12540: return CMD_WARNING;
12541:
12542: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
12543: }
12544:
12545: ALIAS (show_ip_bgp_view_neighbor_received_routes,
12546: show_ip_bgp_neighbor_received_routes_cmd,
12547: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
12548: SHOW_STR
12549: IP_STR
12550: BGP_STR
12551: "Detailed information on TCP and BGP neighbor connections\n"
12552: "Neighbor to display information about\n"
12553: "Neighbor to display information about\n"
12554: "Display the received routes from neighbor\n")
12555:
12556: ALIAS (show_bgp_view_neighbor_received_routes,
12557: show_bgp_ipv6_neighbor_received_routes_cmd,
12558: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
12559: SHOW_STR
12560: BGP_STR
12561: "Address family\n"
12562: "Detailed information on TCP and BGP neighbor connections\n"
12563: "Neighbor to display information about\n"
12564: "Neighbor to display information about\n"
12565: "Display the received routes from neighbor\n")
12566:
12567: DEFUN (show_bgp_neighbor_received_prefix_filter,
12568: show_bgp_neighbor_received_prefix_filter_cmd,
12569: "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
12570: SHOW_STR
12571: BGP_STR
12572: "Detailed information on TCP and BGP neighbor connections\n"
12573: "Neighbor to display information about\n"
12574: "Neighbor to display information about\n"
12575: "Display information received from a BGP neighbor\n"
12576: "Display the prefixlist filter\n")
12577: {
12578: char name[BUFSIZ];
12579: union sockunion su;
12580: struct peer *peer;
12581: int count, ret;
12582:
12583: ret = str2sockunion (argv[0], &su);
12584: if (ret < 0)
12585: {
12586: vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
12587: return CMD_WARNING;
12588: }
12589:
12590: peer = peer_lookup (NULL, &su);
12591: if (! peer)
12592: return CMD_WARNING;
12593:
12594: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
12595: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
12596: if (count)
12597: {
12598: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
12599: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
12600: }
12601:
12602: return CMD_SUCCESS;
12603: }
12604:
12605: /* old command */
12606: ALIAS (show_bgp_view_neighbor_received_routes,
12607: ipv6_bgp_neighbor_received_routes_cmd,
12608: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
12609: SHOW_STR
12610: IPV6_STR
12611: BGP_STR
12612: "Detailed information on TCP and BGP neighbor connections\n"
12613: "Neighbor to display information about\n"
12614: "Neighbor to display information about\n"
12615: "Display the received routes from neighbor\n")
12616:
12617: /* old command */
12618: DEFUN (ipv6_mbgp_neighbor_received_routes,
12619: ipv6_mbgp_neighbor_received_routes_cmd,
12620: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
12621: SHOW_STR
12622: IPV6_STR
12623: MBGP_STR
12624: "Detailed information on TCP and BGP neighbor connections\n"
12625: "Neighbor to display information about\n"
12626: "Neighbor to display information about\n"
12627: "Display the received routes from neighbor\n")
12628: {
12629: struct peer *peer;
12630:
12631: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12632: if (! peer)
12633: return CMD_WARNING;
12634:
12635: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
12636: }
12637:
12638: DEFUN (show_bgp_view_neighbor_received_prefix_filter,
12639: show_bgp_view_neighbor_received_prefix_filter_cmd,
12640: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
12641: SHOW_STR
12642: BGP_STR
12643: "BGP view\n"
12644: "View name\n"
12645: "Detailed information on TCP and BGP neighbor connections\n"
12646: "Neighbor to display information about\n"
12647: "Neighbor to display information about\n"
12648: "Display information received from a BGP neighbor\n"
12649: "Display the prefixlist filter\n")
12650: {
12651: char name[BUFSIZ];
12652: union sockunion su;
12653: struct peer *peer;
12654: struct bgp *bgp;
12655: int count, ret;
12656:
12657: /* BGP structure lookup. */
12658: bgp = bgp_lookup_by_name (argv[0]);
12659: if (bgp == NULL)
12660: {
12661: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
12662: return CMD_WARNING;
12663: }
12664:
12665: ret = str2sockunion (argv[1], &su);
12666: if (ret < 0)
12667: {
12668: vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
12669: return CMD_WARNING;
12670: }
12671:
12672: peer = peer_lookup (bgp, &su);
12673: if (! peer)
12674: return CMD_WARNING;
12675:
12676: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
12677: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
12678: if (count)
12679: {
12680: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
12681: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
12682: }
12683:
12684: return CMD_SUCCESS;
12685: }
12686:
12687:
12688: DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
12689: show_ip_bgp_ipv4_neighbor_received_routes_cmd,
12690: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
12691: SHOW_STR
12692: IP_STR
12693: BGP_STR
12694: "Address family\n"
12695: "Address Family modifier\n"
12696: "Address Family modifier\n"
12697: "Detailed information on TCP and BGP neighbor connections\n"
12698: "Neighbor to display information about\n"
12699: "Neighbor to display information about\n"
12700: "Display the received routes from neighbor\n")
12701: {
12702: struct peer *peer;
12703:
12704: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12705: if (! peer)
12706: return CMD_WARNING;
12707:
12708: if (strncmp (argv[0], "m", 1) == 0)
12709: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
12710:
12711: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
12712: }
12713:
12714: DEFUN (show_bgp_ipv4_safi_neighbor_advertised_route,
12715: show_bgp_ipv4_safi_neighbor_advertised_route_cmd,
12716: "show bgp ipv4 (multicast|unicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12717: SHOW_STR
12718: BGP_STR
12719: "Address Family modifier\n"
12720: "Address Family modifier\n"
12721: "Detailed information on TCP and BGP neighbor connections\n"
12722: "Neighbor to display information about\n"
12723: "Neighbor to display information about\n"
12724: "Display the routes advertised to a BGP neighbor\n")
12725: {
12726: struct peer *peer;
12727: safi_t safi;
12728:
12729: if (bgp_parse_safi(argv[0], &safi)) {
12730: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12731: return CMD_WARNING;
12732: }
12733:
12734: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12735: if (! peer)
12736: return CMD_WARNING;
12737:
12738: return peer_adj_routes (vty, peer, AFI_IP, safi, 0);
12739: }
12740:
12741: DEFUN (show_bgp_ipv6_safi_neighbor_advertised_route,
12742: show_bgp_ipv6_safi_neighbor_advertised_route_cmd,
12743: "show bgp ipv6 (multicast|unicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12744: SHOW_STR
12745: BGP_STR
12746: "Address Family modifier\n"
12747: "Address Family modifier\n"
12748: "Address Family modifier\n"
12749: "Detailed information on TCP and BGP neighbor connections\n"
12750: "Neighbor to display information about\n"
12751: "Neighbor to display information about\n"
12752: "Display the routes advertised to a BGP neighbor\n")
12753: {
12754: struct peer *peer;
12755: safi_t safi;
12756:
12757: if (bgp_parse_safi(argv[0], &safi)) {
12758: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12759: return CMD_WARNING;
12760: }
12761:
12762: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12763: if (! peer)
12764: return CMD_WARNING;
12765:
12766: return peer_adj_routes (vty, peer, AFI_IP6, safi, 0);
12767: }
12768:
12769: DEFUN (show_bgp_view_ipv6_neighbor_advertised_route,
12770: show_bgp_view_ipv6_neighbor_advertised_route_cmd,
12771: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
12772: SHOW_STR
12773: BGP_STR
12774: "BGP view\n"
12775: "View name\n"
12776: "Address family\n"
12777: "Detailed information on TCP and BGP neighbor connections\n"
12778: "Neighbor to display information about\n"
12779: "Neighbor to display information about\n"
12780: "Display the routes advertised to a BGP neighbor\n")
12781: {
12782: struct peer *peer;
12783:
12784: if (argc == 2)
12785: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12786: else
12787: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12788:
12789: if (! peer)
12790: return CMD_WARNING;
12791:
12792: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
12793: }
12794:
12795: DEFUN (show_bgp_view_ipv6_neighbor_received_routes,
12796: show_bgp_view_ipv6_neighbor_received_routes_cmd,
12797: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
12798: SHOW_STR
12799: BGP_STR
12800: "BGP view\n"
12801: "View name\n"
12802: "Address family\n"
12803: "Detailed information on TCP and BGP neighbor connections\n"
12804: "Neighbor to display information about\n"
12805: "Neighbor to display information about\n"
12806: "Display the received routes from neighbor\n")
12807: {
12808: struct peer *peer;
12809:
12810: if (argc == 2)
12811: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
12812: else
12813: peer = peer_lookup_in_view (vty, NULL, argv[0]);
12814:
12815: if (! peer)
12816: return CMD_WARNING;
12817:
12818: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
12819: }
12820:
12821: DEFUN (show_bgp_ipv4_safi_neighbor_received_routes,
12822: show_bgp_ipv4_safi_neighbor_received_routes_cmd,
12823: "show bgp ipv4 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) received-routes",
12824: SHOW_STR
12825: BGP_STR
12826: "Address family\n"
12827: "Address Family modifier\n"
12828: "Address Family modifier\n"
12829: "Address Family modifier\n"
12830: "Address Family modifier\n"
12831: "Detailed information on TCP and BGP neighbor connections\n"
12832: "Neighbor to display information about\n"
12833: "Neighbor to display information about\n"
12834: "Display the received routes from neighbor\n")
12835: {
12836: struct peer *peer;
12837: safi_t safi;
12838:
12839: if (bgp_parse_safi(argv[0], &safi)) {
12840: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12841: return CMD_WARNING;
12842: }
12843:
12844: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12845: if (! peer)
12846: return CMD_WARNING;
12847:
12848: return peer_adj_routes (vty, peer, AFI_IP, safi, 1);
12849: }
12850:
12851: DEFUN (show_bgp_ipv6_safi_neighbor_received_routes,
12852: show_bgp_ipv6_safi_neighbor_received_routes_cmd,
12853: "show bgp ipv6 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) received-routes",
12854: SHOW_STR
12855: BGP_STR
12856: "Address family\n"
12857: "Address Family modifier\n"
12858: "Address Family modifier\n"
12859: "Address Family modifier\n"
12860: "Address Family modifier\n"
12861: "Detailed information on TCP and BGP neighbor connections\n"
12862: "Neighbor to display information about\n"
12863: "Neighbor to display information about\n"
12864: "Display the received routes from neighbor\n")
12865: {
12866: struct peer *peer;
12867: safi_t safi;
12868:
12869: if (bgp_parse_safi(argv[0], &safi)) {
12870: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
12871: return CMD_WARNING;
12872: }
12873:
12874: peer = peer_lookup_in_view (vty, NULL, argv[1]);
12875: if (! peer)
12876: return CMD_WARNING;
12877:
12878: return peer_adj_routes (vty, peer, AFI_IP6, safi, 1);
12879: }
12880:
12881: DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
12882: show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
12883: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
12884: SHOW_STR
12885: BGP_STR
12886: "BGP view\n"
12887: "View name\n"
12888: "Address family\n"
12889: "Address family\n"
12890: "Address family modifier\n"
12891: "Address family modifier\n"
12892: "Detailed information on TCP and BGP neighbor connections\n"
12893: "Neighbor to display information about\n"
12894: "Neighbor to display information about\n"
12895: "Display the advertised routes to neighbor\n"
12896: "Display the received routes from neighbor\n")
12897: {
12898: int afi;
12899: int safi;
12900: int in;
12901: struct peer *peer;
12902:
12903: peer = peer_lookup_in_view (vty, argv[0], argv[3]);
12904:
12905: if (! peer)
12906: return CMD_WARNING;
12907:
12908: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
12909: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
12910: in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
12911:
12912: return peer_adj_routes (vty, peer, afi, safi, in);
12913: }
12914:
12915: DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
12916: show_ip_bgp_neighbor_received_prefix_filter_cmd,
12917: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
12918: SHOW_STR
12919: IP_STR
12920: BGP_STR
12921: "Detailed information on TCP and BGP neighbor connections\n"
12922: "Neighbor to display information about\n"
12923: "Neighbor to display information about\n"
12924: "Display information received from a BGP neighbor\n"
12925: "Display the prefixlist filter\n")
12926: {
12927: char name[BUFSIZ];
12928: union sockunion su;
12929: struct peer *peer;
12930: int count, ret;
12931:
12932: ret = str2sockunion (argv[0], &su);
12933: if (ret < 0)
12934: {
12935: vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
12936: return CMD_WARNING;
12937: }
12938:
12939: peer = peer_lookup (NULL, &su);
12940: if (! peer)
12941: return CMD_WARNING;
12942:
12943: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
12944: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
12945: if (count)
12946: {
12947: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
12948: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
12949: }
12950:
12951: return CMD_SUCCESS;
12952: }
12953:
12954: DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
12955: show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
12956: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
12957: SHOW_STR
12958: IP_STR
12959: BGP_STR
12960: "Address family\n"
12961: "Address Family modifier\n"
12962: "Address Family modifier\n"
12963: "Detailed information on TCP and BGP neighbor connections\n"
12964: "Neighbor to display information about\n"
12965: "Neighbor to display information about\n"
12966: "Display information received from a BGP neighbor\n"
12967: "Display the prefixlist filter\n")
12968: {
12969: char name[BUFSIZ];
12970: union sockunion su;
12971: struct peer *peer;
12972: int count, ret;
12973:
12974: ret = str2sockunion (argv[1], &su);
12975: if (ret < 0)
12976: {
12977: vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
12978: return CMD_WARNING;
12979: }
12980:
12981: peer = peer_lookup (NULL, &su);
12982: if (! peer)
12983: return CMD_WARNING;
12984:
12985: if (strncmp (argv[0], "m", 1) == 0)
12986: {
12987: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
12988: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
12989: if (count)
12990: {
12991: vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
12992: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
12993: }
12994: }
12995: else
12996: {
12997: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
12998: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
12999: if (count)
13000: {
13001: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
13002: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
13003: }
13004: }
13005:
13006: return CMD_SUCCESS;
13007: }
13008:
13009: ALIAS (show_bgp_view_neighbor_received_routes,
13010: show_bgp_neighbor_received_routes_cmd,
13011: "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
13012: SHOW_STR
13013: BGP_STR
13014: "Detailed information on TCP and BGP neighbor connections\n"
13015: "Neighbor to display information about\n"
13016: "Neighbor to display information about\n"
13017: "Display the received routes from neighbor\n")
13018:
13019: DEFUN (show_bgp_ipv4_safi_neighbor_received_prefix_filter,
13020: show_bgp_ipv4_safi_neighbor_received_prefix_filter_cmd,
13021: "show bgp ipv4 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
13022: SHOW_STR
13023: BGP_STR
13024: IP_STR
13025: "Address Family modifier\n"
13026: "Address Family modifier\n"
13027: "Address Family modifier\n"
13028: "Address Family modifier\n"
13029: "Detailed information on TCP and BGP neighbor connections\n"
13030: "Neighbor to display information about\n"
13031: "Neighbor to display information about\n"
13032: "Display information received from a BGP neighbor\n"
13033: "Display the prefixlist filter\n")
13034: {
13035: char name[BUFSIZ];
13036: union sockunion su;
13037: struct peer *peer;
13038: int count, ret;
13039: safi_t safi;
13040:
13041: if (bgp_parse_safi(argv[0], &safi)) {
13042: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13043: return CMD_WARNING;
13044: }
13045:
13046: ret = str2sockunion (argv[1], &su);
13047: if (ret < 0)
13048: {
13049: vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
13050: return CMD_WARNING;
13051: }
13052:
13053: peer = peer_lookup (NULL, &su);
13054: if (! peer)
13055: return CMD_WARNING;
13056:
13057: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, safi);
13058: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
13059: if (count) {
13060: vty_out (vty, "Address family: IPv4 %s%s", safi2str(safi), VTY_NEWLINE);
13061: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
13062: }
13063:
13064: return CMD_SUCCESS;
13065: }
13066:
13067: DEFUN (show_bgp_ipv6_safi_neighbor_received_prefix_filter,
13068: show_bgp_ipv6_safi_neighbor_received_prefix_filter_cmd,
13069: "show bgp ipv6 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
13070: SHOW_STR
13071: BGP_STR
13072: IP_STR
13073: "Address Family modifier\n"
13074: "Address Family modifier\n"
13075: "Address Family modifier\n"
13076: "Address Family modifier\n"
13077: "Detailed information on TCP and BGP neighbor connections\n"
13078: "Neighbor to display information about\n"
13079: "Neighbor to display information about\n"
13080: "Display information received from a BGP neighbor\n"
13081: "Display the prefixlist filter\n")
13082: {
13083: char name[BUFSIZ];
13084: union sockunion su;
13085: struct peer *peer;
13086: int count, ret;
13087: safi_t safi;
13088:
13089: if (bgp_parse_safi(argv[0], &safi)) {
13090: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13091: return CMD_WARNING;
13092: }
13093:
13094: ret = str2sockunion (argv[1], &su);
13095: if (ret < 0)
13096: {
13097: vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
13098: return CMD_WARNING;
13099: }
13100:
13101: peer = peer_lookup (NULL, &su);
13102: if (! peer)
13103: return CMD_WARNING;
13104:
13105: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, safi);
13106: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
13107: if (count) {
13108: vty_out (vty, "Address family: IPv6 %s%s", safi2str(safi), VTY_NEWLINE);
13109: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
13110: }
13111:
13112: return CMD_SUCCESS;
13113: }
13114:
13115: DEFUN (show_bgp_ipv6_neighbor_received_prefix_filter,
13116: show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
13117: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
13118: SHOW_STR
13119: BGP_STR
13120: "Address family\n"
13121: "Detailed information on TCP and BGP neighbor connections\n"
13122: "Neighbor to display information about\n"
13123: "Neighbor to display information about\n"
13124: "Display information received from a BGP neighbor\n"
13125: "Display the prefixlist filter\n")
13126: {
13127: char name[BUFSIZ];
13128: union sockunion su;
13129: struct peer *peer;
13130: int count, ret;
13131:
13132: ret = str2sockunion (argv[0], &su);
13133: if (ret < 0)
13134: {
13135: vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
13136: return CMD_WARNING;
13137: }
13138:
13139: peer = peer_lookup (NULL, &su);
13140: if (! peer)
13141: return CMD_WARNING;
13142:
13143: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
13144: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
13145: if (count)
13146: {
13147: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
13148: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
13149: }
13150:
13151: return CMD_SUCCESS;
13152: }
13153:
13154: DEFUN (show_bgp_view_ipv6_neighbor_received_prefix_filter,
13155: show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
13156: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
13157: SHOW_STR
13158: BGP_STR
13159: "BGP view\n"
13160: "View name\n"
13161: "Address family\n"
13162: "Detailed information on TCP and BGP neighbor connections\n"
13163: "Neighbor to display information about\n"
13164: "Neighbor to display information about\n"
13165: "Display information received from a BGP neighbor\n"
13166: "Display the prefixlist filter\n")
13167: {
13168: char name[BUFSIZ];
13169: union sockunion su;
13170: struct peer *peer;
13171: struct bgp *bgp;
13172: int count, ret;
13173:
13174: /* BGP structure lookup. */
13175: bgp = bgp_lookup_by_name (argv[0]);
13176: if (bgp == NULL)
13177: {
13178: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
13179: return CMD_WARNING;
13180: }
13181:
13182: ret = str2sockunion (argv[1], &su);
13183: if (ret < 0)
13184: {
13185: vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
13186: return CMD_WARNING;
13187: }
13188:
13189: peer = peer_lookup (bgp, &su);
13190: if (! peer)
13191: return CMD_WARNING;
13192:
13193: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
13194: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
13195: if (count)
13196: {
13197: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
13198: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
13199: }
13200:
13201: return CMD_SUCCESS;
13202: }
13203:
13204: static int
13205: bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
13206: safi_t safi, enum bgp_show_type type)
13207: {
13208: if (! peer || ! peer->afc[afi][safi])
13209: {
13210: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
13211: return CMD_WARNING;
13212: }
13213:
13214: return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
13215: }
13216: DEFUN (show_ip_bgp_neighbor_routes,
13217: show_ip_bgp_neighbor_routes_cmd,
13218: "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
13219: SHOW_STR
13220: IP_STR
13221: BGP_STR
13222: "Detailed information on TCP and BGP neighbor connections\n"
13223: "Neighbor to display information about\n"
13224: "Neighbor to display information about\n"
13225: "Display routes learned from neighbor\n")
13226: {
13227: struct peer *peer;
13228:
13229: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13230: if (! peer)
13231: return CMD_WARNING;
13232:
13233: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
13234: bgp_show_type_neighbor);
13235: }
13236:
13237: DEFUN (show_ip_bgp_neighbor_flap,
13238: show_ip_bgp_neighbor_flap_cmd,
13239: "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
13240: SHOW_STR
13241: IP_STR
13242: BGP_STR
13243: "Detailed information on TCP and BGP neighbor connections\n"
13244: "Neighbor to display information about\n"
13245: "Neighbor to display information about\n"
13246: "Display flap statistics of the routes learned from neighbor\n")
13247: {
13248: struct peer *peer;
13249:
13250: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13251: if (! peer)
13252: return CMD_WARNING;
13253:
13254: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
13255: bgp_show_type_flap_neighbor);
13256: }
13257:
13258: DEFUN (show_ip_bgp_neighbor_damp,
13259: show_ip_bgp_neighbor_damp_cmd,
13260: "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
13261: SHOW_STR
13262: IP_STR
13263: BGP_STR
13264: "Detailed information on TCP and BGP neighbor connections\n"
13265: "Neighbor to display information about\n"
13266: "Neighbor to display information about\n"
13267: "Display the dampened routes received from neighbor\n")
13268: {
13269: struct peer *peer;
13270:
13271: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13272: if (! peer)
13273: return CMD_WARNING;
13274:
13275: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
13276: bgp_show_type_damp_neighbor);
13277: }
13278:
13279: DEFUN (show_ip_bgp_ipv4_neighbor_routes,
13280: show_ip_bgp_ipv4_neighbor_routes_cmd,
13281: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
13282: SHOW_STR
13283: IP_STR
13284: BGP_STR
13285: "Address family\n"
13286: "Address Family modifier\n"
13287: "Address Family modifier\n"
13288: "Detailed information on TCP and BGP neighbor connections\n"
13289: "Neighbor to display information about\n"
13290: "Neighbor to display information about\n"
13291: "Display routes learned from neighbor\n")
13292: {
13293: struct peer *peer;
13294:
13295: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13296: if (! peer)
13297: return CMD_WARNING;
13298:
13299: if (strncmp (argv[0], "m", 1) == 0)
13300: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
13301: bgp_show_type_neighbor);
13302:
13303: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
13304: bgp_show_type_neighbor);
13305: }
13306:
13307: DEFUN (show_ip_bgp_view_rsclient,
13308: show_ip_bgp_view_rsclient_cmd,
13309: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
13310: SHOW_STR
13311: IP_STR
13312: BGP_STR
13313: "BGP view\n"
13314: "View name\n"
13315: "Information about Route Server Client\n"
13316: NEIGHBOR_ADDR_STR)
13317: {
13318: struct bgp_table *table;
13319: struct peer *peer;
13320:
13321: if (argc == 2)
13322: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13323: else
13324: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13325:
13326: if (! peer)
13327: return CMD_WARNING;
13328:
13329: if (! peer->afc[AFI_IP][SAFI_UNICAST])
13330: {
13331: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13332: VTY_NEWLINE);
13333: return CMD_WARNING;
13334: }
13335:
13336: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
13337: PEER_FLAG_RSERVER_CLIENT))
13338: {
13339: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13340: VTY_NEWLINE);
13341: return CMD_WARNING;
13342: }
13343:
13344: table = peer->rib[AFI_IP][SAFI_UNICAST];
13345:
13346: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
13347: }
13348:
13349: ALIAS (show_ip_bgp_view_rsclient,
13350: show_ip_bgp_rsclient_cmd,
13351: "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
13352: SHOW_STR
13353: IP_STR
13354: BGP_STR
13355: "Information about Route Server Client\n"
13356: NEIGHBOR_ADDR_STR)
13357:
13358: DEFUN (show_bgp_view_ipv4_safi_rsclient,
13359: show_bgp_view_ipv4_safi_rsclient_cmd,
13360: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
13361: SHOW_STR
13362: BGP_STR
13363: "BGP view\n"
13364: "View name\n"
13365: "Address family\n"
13366: "Address Family modifier\n"
13367: "Address Family modifier\n"
13368: "Information about Route Server Client\n"
13369: NEIGHBOR_ADDR_STR)
13370: {
13371: struct bgp_table *table;
13372: struct peer *peer;
13373: safi_t safi;
13374:
13375: if (argc == 3) {
13376: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
13377: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13378: } else {
13379: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13380: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13381: }
13382:
13383: if (! peer)
13384: return CMD_WARNING;
13385:
13386: if (! peer->afc[AFI_IP][safi])
13387: {
13388: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13389: VTY_NEWLINE);
13390: return CMD_WARNING;
13391: }
13392:
13393: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
13394: PEER_FLAG_RSERVER_CLIENT))
13395: {
13396: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13397: VTY_NEWLINE);
13398: return CMD_WARNING;
13399: }
13400:
13401: table = peer->rib[AFI_IP][safi];
13402:
13403: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
13404: }
13405:
13406: ALIAS (show_bgp_view_ipv4_safi_rsclient,
13407: show_bgp_ipv4_safi_rsclient_cmd,
13408: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
13409: SHOW_STR
13410: BGP_STR
13411: "Address family\n"
13412: "Address Family modifier\n"
13413: "Address Family modifier\n"
13414: "Information about Route Server Client\n"
13415: NEIGHBOR_ADDR_STR)
13416:
13417: DEFUN (show_ip_bgp_view_rsclient_route,
13418: show_ip_bgp_view_rsclient_route_cmd,
13419: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
13420: SHOW_STR
13421: IP_STR
13422: BGP_STR
13423: "BGP view\n"
13424: "View name\n"
13425: "Information about Route Server Client\n"
13426: NEIGHBOR_ADDR_STR
13427: "Network in the BGP routing table to display\n")
13428: {
13429: struct bgp *bgp;
13430: struct peer *peer;
13431:
13432: /* BGP structure lookup. */
13433: if (argc == 3)
13434: {
13435: bgp = bgp_lookup_by_name (argv[0]);
13436: if (bgp == NULL)
13437: {
13438: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
13439: return CMD_WARNING;
13440: }
13441: }
13442: else
13443: {
13444: bgp = bgp_get_default ();
13445: if (bgp == NULL)
13446: {
13447: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
13448: return CMD_WARNING;
13449: }
13450: }
13451:
13452: if (argc == 3)
13453: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13454: else
13455: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13456:
13457: if (! peer)
13458: return CMD_WARNING;
13459:
13460: if (! peer->afc[AFI_IP][SAFI_UNICAST])
13461: {
13462: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13463: VTY_NEWLINE);
13464: return CMD_WARNING;
13465: }
13466:
13467: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
13468: PEER_FLAG_RSERVER_CLIENT))
13469: {
13470: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13471: VTY_NEWLINE);
13472: return CMD_WARNING;
13473: }
13474:
13475: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
13476: (argc == 3) ? argv[2] : argv[1],
13477: AFI_IP, SAFI_UNICAST, NULL, 0);
13478: }
13479:
13480: ALIAS (show_ip_bgp_view_rsclient_route,
13481: show_ip_bgp_rsclient_route_cmd,
13482: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
13483: SHOW_STR
13484: IP_STR
13485: BGP_STR
13486: "Information about Route Server Client\n"
13487: NEIGHBOR_ADDR_STR
13488: "Network in the BGP routing table to display\n")
13489:
13490: DEFUN (show_bgp_ipv4_safi_neighbor_flap,
13491: show_bgp_ipv4_safi_neighbor_flap_cmd,
13492: "show bgp ipv4 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) flap-statistics",
13493: SHOW_STR
13494: BGP_STR
13495: "Address Family Modifier\n"
13496: "Address Family Modifier\n"
13497: "Address Family Modifier\n"
13498: "Address Family Modifier\n"
13499: "Detailed information on TCP and BGP neighbor connections\n"
13500: "Neighbor to display information about\n"
13501: "Neighbor to display information about\n"
13502: "Display flap statistics of the routes learned from neighbor\n")
13503: {
13504: struct peer *peer;
13505: safi_t safi;
13506:
13507: if (bgp_parse_safi(argv[0], &safi)) {
13508: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13509: return CMD_WARNING;
13510: }
13511:
13512: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13513: if (! peer)
13514: return CMD_WARNING;
13515:
13516: return bgp_show_neighbor_route (vty, peer, AFI_IP, safi,
13517: bgp_show_type_flap_neighbor);
13518: }
13519:
13520: DEFUN (show_bgp_ipv6_safi_neighbor_flap,
13521: show_bgp_ipv6_safi_neighbor_flap_cmd,
13522: "show bgp ipv6 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) flap-statistics",
13523: SHOW_STR
13524: BGP_STR
13525: "Address Family Modifier\n"
13526: "Address Family Modifier\n"
13527: "Address Family Modifier\n"
13528: "Address Family Modifier\n"
13529: "Detailed information on TCP and BGP neighbor connections\n"
13530: "Neighbor to display information about\n"
13531: "Neighbor to display information about\n"
13532: "Display flap statistics of the routes learned from neighbor\n")
13533: {
13534: struct peer *peer;
13535: safi_t safi;
13536:
13537: if (bgp_parse_safi(argv[0], &safi)) {
13538: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13539: return CMD_WARNING;
13540: }
13541:
13542: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13543: if (! peer)
13544: return CMD_WARNING;
13545:
13546: return bgp_show_neighbor_route (vty, peer, AFI_IP6, safi,
13547: bgp_show_type_flap_neighbor);
13548: }
13549:
13550: DEFUN (show_bgp_ipv4_safi_neighbor_damp,
13551: show_bgp_ipv4_safi_neighbor_damp_cmd,
13552: "show bgp ipv4 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) dampened-routes",
13553: SHOW_STR
13554: BGP_STR
13555: "Address Family Modifier\n"
13556: "Address Family Modifier\n"
13557: "Address Family Modifier\n"
13558: "Address Family Modifier\n"
13559: "Detailed information on TCP and BGP neighbor connections\n"
13560: "Neighbor to display information about\n"
13561: "Neighbor to display information about\n"
13562: "Display the dampened routes received from neighbor\n")
13563: {
13564: struct peer *peer;
13565: safi_t safi;
13566:
13567: if (bgp_parse_safi(argv[0], &safi)) {
13568: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13569: return CMD_WARNING;
13570: }
13571:
13572: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13573: if (! peer)
13574: return CMD_WARNING;
13575:
13576: return bgp_show_neighbor_route (vty, peer, AFI_IP, safi,
13577: bgp_show_type_damp_neighbor);
13578: }
13579:
13580: DEFUN (show_bgp_ipv6_safi_neighbor_damp,
13581: show_bgp_ipv6_safi_neighbor_damp_cmd,
13582: "show bgp ipv6 (encap|multicast|unicast|vpn) neighbors (A.B.C.D|X:X::X:X) dampened-routes",
13583: SHOW_STR
13584: BGP_STR
13585: "Address Family Modifier\n"
13586: "Address Family Modifier\n"
13587: "Address Family Modifier\n"
13588: "Address Family Modifier\n"
13589: "Detailed information on TCP and BGP neighbor connections\n"
13590: "Neighbor to display information about\n"
13591: "Neighbor to display information about\n"
13592: "Display the dampened routes received from neighbor\n")
13593: {
13594: struct peer *peer;
13595: safi_t safi;
13596:
13597: if (bgp_parse_safi(argv[0], &safi)) {
13598: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13599: return CMD_WARNING;
13600: }
13601:
13602: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13603: if (! peer)
13604: return CMD_WARNING;
13605:
13606: return bgp_show_neighbor_route (vty, peer, AFI_IP6, safi,
13607: bgp_show_type_damp_neighbor);
13608: }
13609:
13610: DEFUN (show_bgp_ipv4_safi_neighbor_routes,
13611: show_bgp_ipv4_safi_neighbor_routes_cmd,
13612: "show bgp ipv4 (multicast|unicast) neighbors (A.B.C.D|X:X::X:X) routes",
13613: SHOW_STR
13614: BGP_STR
13615: "Address family\n"
13616: "Address Family modifier\n"
13617: "Address Family modifier\n"
13618: "Detailed information on TCP and BGP neighbor connections\n"
13619: "Neighbor to display information about\n"
13620: "Neighbor to display information about\n"
13621: "Display routes learned from neighbor\n")
13622: {
13623: struct peer *peer;
13624: safi_t safi;
13625:
13626: if (bgp_parse_safi(argv[0], &safi)) {
13627: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13628: return CMD_WARNING;
13629: }
13630:
13631: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13632: if (! peer)
13633: return CMD_WARNING;
13634:
13635: return bgp_show_neighbor_route (vty, peer, AFI_IP, safi,
13636: bgp_show_type_neighbor);
13637: }
13638:
13639: DEFUN (show_bgp_ipv6_safi_neighbor_routes,
13640: show_bgp_ipv6_safi_neighbor_routes_cmd,
13641: "show bgp ipv6 (multicast|unicast) neighbors (A.B.C.D|X:X::X:X) routes",
13642: SHOW_STR
13643: BGP_STR
13644: "Address family\n"
13645: "Address Family modifier\n"
13646: "Address Family modifier\n"
13647: "Detailed information on TCP and BGP neighbor connections\n"
13648: NEIGHBOR_ADDR_STR
13649: NEIGHBOR_ADDR_STR
13650: "Display routes learned from neighbor\n")
13651: {
13652: struct peer *peer;
13653: safi_t safi;
13654:
13655: if (bgp_parse_safi(argv[0], &safi)) {
13656: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
13657: return CMD_WARNING;
13658: }
13659:
13660: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13661: if (! peer)
13662: return CMD_WARNING;
13663:
13664: return bgp_show_neighbor_route (vty, peer, AFI_IP6, safi,
13665: bgp_show_type_neighbor);
13666: }
13667:
13668: DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
13669: show_bgp_view_ipv4_safi_rsclient_route_cmd,
13670: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
13671: SHOW_STR
13672: BGP_STR
13673: "BGP view\n"
13674: "View name\n"
13675: "Address family\n"
13676: "Address Family modifier\n"
13677: "Address Family modifier\n"
13678: "Information about Route Server Client\n"
13679: NEIGHBOR_ADDR_STR
13680: "Network in the BGP routing table to display\n")
13681: {
13682: struct bgp *bgp;
13683: struct peer *peer;
13684: safi_t safi;
13685:
13686: /* BGP structure lookup. */
13687: if (argc == 4)
13688: {
13689: bgp = bgp_lookup_by_name (argv[0]);
13690: if (bgp == NULL)
13691: {
13692: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
13693: return CMD_WARNING;
13694: }
13695: }
13696: else
13697: {
13698: bgp = bgp_get_default ();
13699: if (bgp == NULL)
13700: {
13701: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
13702: return CMD_WARNING;
13703: }
13704: }
13705:
13706: if (argc == 4) {
13707: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
13708: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13709: } else {
13710: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13711: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13712: }
13713:
13714: if (! peer)
13715: return CMD_WARNING;
13716:
13717: if (! peer->afc[AFI_IP][safi])
13718: {
13719: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13720: VTY_NEWLINE);
13721: return CMD_WARNING;
13722: }
13723:
13724: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
13725: PEER_FLAG_RSERVER_CLIENT))
13726: {
13727: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13728: VTY_NEWLINE);
13729: return CMD_WARNING;
13730: }
13731:
13732: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
13733: (argc == 4) ? argv[3] : argv[2],
13734: AFI_IP, safi, NULL, 0);
13735: }
13736:
13737: ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
13738: show_bgp_ipv4_safi_rsclient_route_cmd,
13739: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
13740: SHOW_STR
13741: BGP_STR
13742: "Address family\n"
13743: "Address Family modifier\n"
13744: "Address Family modifier\n"
13745: "Information about Route Server Client\n"
13746: NEIGHBOR_ADDR_STR
13747: "Network in the BGP routing table to display\n")
13748:
13749:
13750: DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
13751: show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
13752: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
13753: SHOW_STR
13754: BGP_STR
13755: "BGP view\n"
13756: "View name\n"
13757: "Address family\n"
13758: "Address Family modifier\n"
13759: "Address Family modifier\n"
13760: "Information about Route Server Client\n"
13761: NEIGHBOR_ADDR_STR
13762: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
13763: {
13764: struct bgp *bgp;
13765: struct peer *peer;
13766: safi_t safi;
13767:
13768: /* BGP structure lookup. */
13769: if (argc == 4)
13770: {
13771: bgp = bgp_lookup_by_name (argv[0]);
13772: if (bgp == NULL)
13773: {
13774: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
13775: return CMD_WARNING;
13776: }
13777: }
13778: else
13779: {
13780: bgp = bgp_get_default ();
13781: if (bgp == NULL)
13782: {
13783: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
13784: return CMD_WARNING;
13785: }
13786: }
13787:
13788: if (argc == 4) {
13789: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
13790: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13791: } else {
13792: peer = peer_lookup_in_view (vty, NULL, argv[1]);
13793: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
13794: }
13795:
13796: if (! peer)
13797: return CMD_WARNING;
13798:
13799: if (! peer->afc[AFI_IP][safi])
13800: {
13801: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13802: VTY_NEWLINE);
13803: return CMD_WARNING;
13804: }
13805:
13806: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
13807: PEER_FLAG_RSERVER_CLIENT))
13808: {
13809: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13810: VTY_NEWLINE);
13811: return CMD_WARNING;
13812: }
13813:
13814: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
13815: (argc == 4) ? argv[3] : argv[2],
13816: AFI_IP, safi, NULL, 1);
13817: }
13818:
13819: DEFUN (show_ip_bgp_view_rsclient_prefix,
13820: show_ip_bgp_view_rsclient_prefix_cmd,
13821: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
13822: SHOW_STR
13823: IP_STR
13824: BGP_STR
13825: "BGP view\n"
13826: "View name\n"
13827: "Information about Route Server Client\n"
13828: NEIGHBOR_ADDR_STR
13829: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
13830: {
13831: struct bgp *bgp;
13832: struct peer *peer;
13833:
13834: /* BGP structure lookup. */
13835: if (argc == 3)
13836: {
13837: bgp = bgp_lookup_by_name (argv[0]);
13838: if (bgp == NULL)
13839: {
13840: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
13841: return CMD_WARNING;
13842: }
13843: }
13844: else
13845: {
13846: bgp = bgp_get_default ();
13847: if (bgp == NULL)
13848: {
13849: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
13850: return CMD_WARNING;
13851: }
13852: }
13853:
13854: if (argc == 3)
13855: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13856: else
13857: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13858:
13859: if (! peer)
13860: return CMD_WARNING;
13861:
13862: if (! peer->afc[AFI_IP][SAFI_UNICAST])
13863: {
13864: vty_out (vty, "%% Activate the neighbor for the address family first%s",
13865: VTY_NEWLINE);
13866: return CMD_WARNING;
13867: }
13868:
13869: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
13870: PEER_FLAG_RSERVER_CLIENT))
13871: {
13872: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
13873: VTY_NEWLINE);
13874: return CMD_WARNING;
13875: }
13876:
13877: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
13878: (argc == 3) ? argv[2] : argv[1],
13879: AFI_IP, SAFI_UNICAST, NULL, 1);
13880: }
13881:
13882: ALIAS (show_ip_bgp_view_rsclient_prefix,
13883: show_ip_bgp_rsclient_prefix_cmd,
13884: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
13885: SHOW_STR
13886: IP_STR
13887: BGP_STR
13888: "Information about Route Server Client\n"
13889: NEIGHBOR_ADDR_STR
13890: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
13891:
13892: ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
13893: show_bgp_ipv4_safi_rsclient_prefix_cmd,
13894: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
13895: SHOW_STR
13896: BGP_STR
13897: "Address family\n"
13898: "Address Family modifier\n"
13899: "Address Family modifier\n"
13900: "Information about Route Server Client\n"
13901: NEIGHBOR_ADDR_STR
13902: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
13903:
13904: DEFUN (show_bgp_view_ipv6_neighbor_routes,
13905: show_bgp_view_ipv6_neighbor_routes_cmd,
13906: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
13907: SHOW_STR
13908: BGP_STR
13909: "BGP view\n"
13910: "View name\n"
13911: "Address family\n"
13912: "Detailed information on TCP and BGP neighbor connections\n"
13913: "Neighbor to display information about\n"
13914: "Neighbor to display information about\n"
13915: "Display routes learned from neighbor\n")
13916: {
13917: struct peer *peer;
13918:
13919: if (argc == 2)
13920: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13921: else
13922: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13923:
13924: if (! peer)
13925: return CMD_WARNING;
13926:
13927: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
13928: bgp_show_type_neighbor);
13929: }
13930:
13931: DEFUN (show_bgp_view_neighbor_damp,
13932: show_bgp_view_neighbor_damp_cmd,
13933: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
13934: SHOW_STR
13935: BGP_STR
13936: "BGP view\n"
13937: "View name\n"
13938: "Detailed information on TCP and BGP neighbor connections\n"
13939: "Neighbor to display information about\n"
13940: "Neighbor to display information about\n"
13941: "Display the dampened routes received from neighbor\n")
13942: {
13943: struct peer *peer;
13944:
13945: if (argc == 2)
13946: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13947: else
13948: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13949:
13950: if (! peer)
13951: return CMD_WARNING;
13952:
13953: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
13954: bgp_show_type_damp_neighbor);
13955: }
13956:
13957: DEFUN (show_bgp_view_ipv6_neighbor_damp,
13958: show_bgp_view_ipv6_neighbor_damp_cmd,
13959: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
13960: SHOW_STR
13961: BGP_STR
13962: "BGP view\n"
13963: "View name\n"
13964: "Address family\n"
13965: "Detailed information on TCP and BGP neighbor connections\n"
13966: "Neighbor to display information about\n"
13967: "Neighbor to display information about\n"
13968: "Display the dampened routes received from neighbor\n")
13969: {
13970: struct peer *peer;
13971:
13972: if (argc == 2)
13973: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
13974: else
13975: peer = peer_lookup_in_view (vty, NULL, argv[0]);
13976:
13977: if (! peer)
13978: return CMD_WARNING;
13979:
13980: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
13981: bgp_show_type_damp_neighbor);
13982: }
13983:
13984: DEFUN (show_bgp_view_ipv6_neighbor_flap,
13985: show_bgp_view_ipv6_neighbor_flap_cmd,
13986: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
13987: SHOW_STR
13988: BGP_STR
13989: "BGP view\n"
13990: "View name\n"
13991: "Address family\n"
13992: "Detailed information on TCP and BGP neighbor connections\n"
13993: "Neighbor to display information about\n"
13994: "Neighbor to display information about\n"
13995: "Display the dampened routes received from neighbor\n")
13996: {
13997: struct peer *peer;
13998:
13999: if (argc == 2)
14000: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14001: else
14002: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14003:
14004: if (! peer)
14005: return CMD_WARNING;
14006:
14007: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
14008: bgp_show_type_flap_neighbor);
14009: }
14010:
14011: DEFUN (show_bgp_view_neighbor_flap,
14012: show_bgp_view_neighbor_flap_cmd,
14013: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
14014: SHOW_STR
14015: BGP_STR
14016: "BGP view\n"
14017: "View name\n"
14018: "Detailed information on TCP and BGP neighbor connections\n"
14019: "Neighbor to display information about\n"
14020: "Neighbor to display information about\n"
14021: "Display flap statistics of the routes learned from neighbor\n")
14022: {
14023: struct peer *peer;
14024:
14025: if (argc == 2)
14026: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14027: else
14028: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14029:
14030: if (! peer)
14031: return CMD_WARNING;
14032:
14033: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
14034: bgp_show_type_flap_neighbor);
14035: }
14036:
14037: ALIAS (show_bgp_view_neighbor_flap,
14038: show_bgp_neighbor_flap_cmd,
14039: "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
14040: SHOW_STR
14041: BGP_STR
14042: "Detailed information on TCP and BGP neighbor connections\n"
14043: "Neighbor to display information about\n"
14044: "Neighbor to display information about\n"
14045: "Display flap statistics of the routes learned from neighbor\n")
14046:
14047: ALIAS (show_bgp_view_neighbor_damp,
14048: show_bgp_neighbor_damp_cmd,
14049: "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
14050: SHOW_STR
14051: BGP_STR
14052: "Detailed information on TCP and BGP neighbor connections\n"
14053: "Neighbor to display information about\n"
14054: "Neighbor to display information about\n"
14055: "Display the dampened routes received from neighbor\n")
14056:
14057: DEFUN (show_bgp_view_neighbor_routes,
14058: show_bgp_view_neighbor_routes_cmd,
14059: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
14060: SHOW_STR
14061: BGP_STR
14062: "BGP view\n"
14063: "View name\n"
14064: "Detailed information on TCP and BGP neighbor connections\n"
14065: "Neighbor to display information about\n"
14066: "Neighbor to display information about\n"
14067: "Display routes learned from neighbor\n")
14068: {
14069: struct peer *peer;
14070:
14071: if (argc == 2)
14072: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14073: else
14074: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14075:
14076: if (! peer)
14077: return CMD_WARNING;
14078:
14079: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
14080: bgp_show_type_neighbor);
14081: }
14082:
14083: ALIAS (show_bgp_view_neighbor_routes,
14084: show_bgp_neighbor_routes_cmd,
14085: "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
14086: SHOW_STR
14087: BGP_STR
14088: "Detailed information on TCP and BGP neighbor connections\n"
14089: "Neighbor to display information about\n"
14090: "Neighbor to display information about\n"
14091: "Display routes learned from neighbor\n")
14092:
14093: ALIAS (show_bgp_view_neighbor_routes,
14094: show_bgp_ipv6_neighbor_routes_cmd,
14095: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
14096: SHOW_STR
14097: BGP_STR
14098: "Address family\n"
14099: "Detailed information on TCP and BGP neighbor connections\n"
14100: "Neighbor to display information about\n"
14101: "Neighbor to display information about\n"
14102: "Display routes learned from neighbor\n")
14103:
14104: /* old command */
14105: ALIAS (show_bgp_view_neighbor_routes,
14106: ipv6_bgp_neighbor_routes_cmd,
14107: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
14108: SHOW_STR
14109: IPV6_STR
14110: BGP_STR
14111: "Detailed information on TCP and BGP neighbor connections\n"
14112: "Neighbor to display information about\n"
14113: "Neighbor to display information about\n"
14114: "Display routes learned from neighbor\n")
14115:
14116: /* old command */
14117: DEFUN (ipv6_mbgp_neighbor_routes,
14118: ipv6_mbgp_neighbor_routes_cmd,
14119: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
14120: SHOW_STR
14121: IPV6_STR
14122: MBGP_STR
14123: "Detailed information on TCP and BGP neighbor connections\n"
14124: "Neighbor to display information about\n"
14125: "Neighbor to display information about\n"
14126: "Display routes learned from neighbor\n")
14127: {
14128: struct peer *peer;
14129:
14130: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14131: if (! peer)
14132: return CMD_WARNING;
14133:
14134: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
14135: bgp_show_type_neighbor);
14136: }
14137:
14138: ALIAS (show_bgp_view_neighbor_flap,
14139: show_bgp_ipv6_neighbor_flap_cmd,
14140: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
14141: SHOW_STR
14142: BGP_STR
14143: "Address family\n"
14144: "Detailed information on TCP and BGP neighbor connections\n"
14145: "Neighbor to display information about\n"
14146: "Neighbor to display information about\n"
14147: "Display flap statistics of the routes learned from neighbor\n")
14148:
14149: ALIAS (show_bgp_view_neighbor_damp,
14150: show_bgp_ipv6_neighbor_damp_cmd,
14151: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
14152: SHOW_STR
14153: BGP_STR
14154: "Address family\n"
14155: "Detailed information on TCP and BGP neighbor connections\n"
14156: "Neighbor to display information about\n"
14157: "Neighbor to display information about\n"
14158: "Display the dampened routes received from neighbor\n")
14159:
14160: DEFUN (show_bgp_view_rsclient,
14161: show_bgp_view_rsclient_cmd,
14162: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
14163: SHOW_STR
14164: BGP_STR
14165: "BGP view\n"
14166: "View name\n"
14167: "Information about Route Server Client\n"
14168: NEIGHBOR_ADDR_STR)
14169: {
14170: struct bgp_table *table;
14171: struct peer *peer;
14172:
14173: if (argc == 2)
14174: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14175: else
14176: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14177:
14178: if (! peer)
14179: return CMD_WARNING;
14180:
14181: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14182: {
14183: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14184: VTY_NEWLINE);
14185: return CMD_WARNING;
14186: }
14187:
14188: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14189: PEER_FLAG_RSERVER_CLIENT))
14190: {
14191: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14192: VTY_NEWLINE);
14193: return CMD_WARNING;
14194: }
14195:
14196: table = peer->rib[AFI_IP6][SAFI_UNICAST];
14197:
14198: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
14199: }
14200:
14201: ALIAS (show_bgp_view_rsclient,
14202: show_bgp_rsclient_cmd,
14203: "show bgp rsclient (A.B.C.D|X:X::X:X)",
14204: SHOW_STR
14205: BGP_STR
14206: "Information about Route Server Client\n"
14207: NEIGHBOR_ADDR_STR)
14208:
14209: DEFUN (show_bgp_view_ipv4_rsclient,
14210: show_bgp_view_ipv4_rsclient_cmd,
14211: "show bgp view WORD ipv4 rsclient (A.B.C.D|X:X::X:X)",
14212: SHOW_STR
14213: BGP_STR
14214: "BGP view\n"
14215: "View name\n"
14216: "Address Family\n"
14217: "Information about Route Server Client\n"
14218: NEIGHBOR_ADDR_STR2)
14219: {
14220: struct bgp_table *table;
14221: struct peer *peer;
14222:
14223: if (argc == 2)
14224: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14225: else
14226: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14227:
14228: if (! peer)
14229: return CMD_WARNING;
14230:
14231: if (! peer->afc[AFI_IP][SAFI_UNICAST])
14232: {
14233: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14234: VTY_NEWLINE);
14235: return CMD_WARNING;
14236: }
14237:
14238: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
14239: PEER_FLAG_RSERVER_CLIENT))
14240: {
14241: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14242: VTY_NEWLINE);
14243: return CMD_WARNING;
14244: }
14245:
14246: table = peer->rib[AFI_IP][SAFI_UNICAST];
14247:
14248: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
14249: }
14250: DEFUN (show_bgp_view_ipv6_rsclient,
14251: show_bgp_view_ipv6_rsclient_cmd,
14252: "show bgp view WORD ipv6 rsclient (A.B.C.D|X:X::X:X)",
14253: SHOW_STR
14254: BGP_STR
14255: "BGP view\n"
14256: "BGP view name\n"
14257: "Address Family\n"
14258: "Information about Route Server Client\n"
14259: NEIGHBOR_ADDR_STR2)
14260: {
14261: struct bgp_table *table;
14262: struct peer *peer;
14263:
14264: if (argc == 2)
14265: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14266: else
14267: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14268:
14269: if (! peer)
14270: return CMD_WARNING;
14271:
14272: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14273: {
14274: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14275: VTY_NEWLINE);
14276: return CMD_WARNING;
14277: }
14278:
14279: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14280: PEER_FLAG_RSERVER_CLIENT))
14281: {
14282: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14283: VTY_NEWLINE);
14284: return CMD_WARNING;
14285: }
14286:
14287: table = peer->rib[AFI_IP6][SAFI_UNICAST];
14288:
14289: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
14290: }
14291:
14292: ALIAS (show_bgp_view_ipv4_rsclient,
14293: show_bgp_ipv4_rsclient_cmd,
14294: "show bgp ipv4 rsclient (A.B.C.D|X:X::X:X)",
14295: SHOW_STR
14296: BGP_STR
14297: "Address Family\n"
14298: "Information about Route Server Client\n"
14299: NEIGHBOR_ADDR_STR2)
14300:
14301: ALIAS (show_bgp_view_ipv6_rsclient,
14302: show_bgp_ipv6_rsclient_cmd,
14303: "show bgp ipv6 rsclient (A.B.C.D|X:X::X:X)",
14304: SHOW_STR
14305: BGP_STR
14306: "Address Family\n"
14307: "Information about Route Server Client\n"
14308: NEIGHBOR_ADDR_STR2)
14309:
14310: DEFUN (show_bgp_view_ipv6_safi_rsclient,
14311: show_bgp_view_ipv6_safi_rsclient_cmd,
14312: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
14313: SHOW_STR
14314: BGP_STR
14315: "BGP view\n"
14316: "View name\n"
14317: "Address family\n"
14318: "Address Family modifier\n"
14319: "Address Family modifier\n"
14320: "Information about Route Server Client\n"
14321: NEIGHBOR_ADDR_STR)
14322: {
14323: struct bgp_table *table;
14324: struct peer *peer;
14325: safi_t safi;
14326:
14327: if (argc == 3) {
14328: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
14329: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14330: } else {
14331: peer = peer_lookup_in_view (vty, NULL, argv[1]);
14332: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14333: }
14334:
14335: if (! peer)
14336: return CMD_WARNING;
14337:
14338: if (! peer->afc[AFI_IP6][safi])
14339: {
14340: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14341: VTY_NEWLINE);
14342: return CMD_WARNING;
14343: }
14344:
14345: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
14346: PEER_FLAG_RSERVER_CLIENT))
14347: {
14348: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14349: VTY_NEWLINE);
14350: return CMD_WARNING;
14351: }
14352:
14353: table = peer->rib[AFI_IP6][safi];
14354:
14355: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
14356: }
14357:
14358: ALIAS (show_bgp_view_ipv6_safi_rsclient,
14359: show_bgp_ipv6_safi_rsclient_cmd,
14360: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
14361: SHOW_STR
14362: BGP_STR
14363: "Address family\n"
14364: "Address Family modifier\n"
14365: "Address Family modifier\n"
14366: "Information about Route Server Client\n"
14367: NEIGHBOR_ADDR_STR)
14368:
14369: DEFUN (show_bgp_view_rsclient_route,
14370: show_bgp_view_rsclient_route_cmd,
14371: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14372: SHOW_STR
14373: BGP_STR
14374: "BGP view\n"
14375: "View name\n"
14376: "Information about Route Server Client\n"
14377: NEIGHBOR_ADDR_STR
14378: "Network in the BGP routing table to display\n")
14379: {
14380: struct bgp *bgp;
14381: struct peer *peer;
14382:
14383: /* BGP structure lookup. */
14384: if (argc == 3)
14385: {
14386: bgp = bgp_lookup_by_name (argv[0]);
14387: if (bgp == NULL)
14388: {
14389: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14390: return CMD_WARNING;
14391: }
14392: }
14393: else
14394: {
14395: bgp = bgp_get_default ();
14396: if (bgp == NULL)
14397: {
14398: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14399: return CMD_WARNING;
14400: }
14401: }
14402:
14403: if (argc == 3)
14404: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14405: else
14406: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14407:
14408: if (! peer)
14409: return CMD_WARNING;
14410:
14411: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14412: {
14413: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14414: VTY_NEWLINE);
14415: return CMD_WARNING;
14416: }
14417:
14418: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14419: PEER_FLAG_RSERVER_CLIENT))
14420: {
14421: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14422: VTY_NEWLINE);
14423: return CMD_WARNING;
14424: }
14425:
14426: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
14427: (argc == 3) ? argv[2] : argv[1],
14428: AFI_IP6, SAFI_UNICAST, NULL, 0);
14429: }
14430:
14431: DEFUN (show_bgp_view_ipv6_rsclient_route,
14432: show_bgp_view_ipv6_rsclient_route_cmd,
14433: "show bgp view WORD ipv6 rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14434: SHOW_STR
14435: BGP_STR
14436: "BGP view\n"
14437: "BGP view name\n"
14438: "IP6_STR"
14439: "Information about Route Server Client\n"
14440: NEIGHBOR_ADDR_STR
14441: "Network in the BGP routing table to display\n")
14442: {
14443: struct bgp *bgp;
14444: struct peer *peer;
14445:
14446: /* BGP structure lookup. */
14447: if (argc == 3)
14448: {
14449: bgp = bgp_lookup_by_name (argv[0]);
14450: if (bgp == NULL)
14451: {
14452: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14453: return CMD_WARNING;
14454: }
14455: }
14456: else
14457: {
14458: bgp = bgp_get_default ();
14459: if (bgp == NULL)
14460: {
14461: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14462: return CMD_WARNING;
14463: }
14464: }
14465:
14466: if (argc == 3)
14467: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14468: else
14469: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14470:
14471: if (! peer)
14472: return CMD_WARNING;
14473:
14474: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14475: {
14476: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14477: VTY_NEWLINE);
14478: return CMD_WARNING;
14479: }
14480:
14481: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14482: PEER_FLAG_RSERVER_CLIENT))
14483: {
14484: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14485: VTY_NEWLINE);
14486: return CMD_WARNING;
14487: }
14488:
14489: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
14490: (argc == 3) ? argv[2] : argv[1],
14491: AFI_IP6, SAFI_UNICAST, NULL, 0);
14492: }
14493:
14494: ALIAS (show_bgp_view_ipv6_rsclient_route,
14495: show_bgp_rsclient_route_cmd,
14496: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14497: SHOW_STR
14498: BGP_STR
14499: "Information about Route Server Client\n"
14500: NEIGHBOR_ADDR_STR
14501: "Network in the BGP routing table to display\n")
14502:
14503: ALIAS (show_bgp_view_ipv6_rsclient_route,
14504: show_bgp_ipv6_rsclient_route_cmd,
14505: "show bgp ipv6 rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14506: SHOW_STR
14507: BGP_STR
14508: IP6_STR
14509: "Information about Route Server Client\n"
14510: NEIGHBOR_ADDR_STR
14511: "Network in the BGP routing table to display\n")
14512:
14513: DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
14514: show_bgp_view_ipv6_safi_rsclient_route_cmd,
14515: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14516: SHOW_STR
14517: BGP_STR
14518: "BGP view\n"
14519: "View name\n"
14520: "Address family\n"
14521: "Address Family modifier\n"
14522: "Address Family modifier\n"
14523: "Information about Route Server Client\n"
14524: NEIGHBOR_ADDR_STR
14525: "Network in the BGP routing table to display\n")
14526: {
14527: struct bgp *bgp;
14528: struct peer *peer;
14529: safi_t safi;
14530:
14531: /* BGP structure lookup. */
14532: if (argc == 4)
14533: {
14534: bgp = bgp_lookup_by_name (argv[0]);
14535: if (bgp == NULL)
14536: {
14537: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14538: return CMD_WARNING;
14539: }
14540: }
14541: else
14542: {
14543: bgp = bgp_get_default ();
14544: if (bgp == NULL)
14545: {
14546: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14547: return CMD_WARNING;
14548: }
14549: }
14550:
14551: if (argc == 4) {
14552: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
14553: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14554: } else {
14555: peer = peer_lookup_in_view (vty, NULL, argv[1]);
14556: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14557: }
14558:
14559: if (! peer)
14560: return CMD_WARNING;
14561:
14562: if (! peer->afc[AFI_IP6][safi])
14563: {
14564: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14565: VTY_NEWLINE);
14566: return CMD_WARNING;
14567: }
14568:
14569: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
14570: PEER_FLAG_RSERVER_CLIENT))
14571: {
14572: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14573: VTY_NEWLINE);
14574: return CMD_WARNING;
14575: }
14576:
14577: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
14578: (argc == 4) ? argv[3] : argv[2],
14579: AFI_IP6, safi, NULL, 0);
14580: }
14581:
14582: ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
14583: show_bgp_ipv6_safi_rsclient_route_cmd,
14584: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
14585: SHOW_STR
14586: BGP_STR
14587: "Address family\n"
14588: "Address Family modifier\n"
14589: "Address Family modifier\n"
14590: "Information about Route Server Client\n"
14591: NEIGHBOR_ADDR_STR
14592: "Network in the BGP routing table to display\n")
14593:
14594:
14595: DEFUN (show_bgp_view_rsclient_prefix,
14596: show_bgp_view_rsclient_prefix_cmd,
14597: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14598: SHOW_STR
14599: BGP_STR
14600: "BGP view\n"
14601: "View name\n"
14602: "Information about Route Server Client\n"
14603: NEIGHBOR_ADDR_STR
14604: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
14605: {
14606: struct bgp *bgp;
14607: struct peer *peer;
14608:
14609: /* BGP structure lookup. */
14610: if (argc == 3)
14611: {
14612: bgp = bgp_lookup_by_name (argv[0]);
14613: if (bgp == NULL)
14614: {
14615: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14616: return CMD_WARNING;
14617: }
14618: }
14619: else
14620: {
14621: bgp = bgp_get_default ();
14622: if (bgp == NULL)
14623: {
14624: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14625: return CMD_WARNING;
14626: }
14627: }
14628:
14629: if (argc == 3)
14630: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14631: else
14632: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14633:
14634: if (! peer)
14635: return CMD_WARNING;
14636:
14637: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14638: {
14639: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14640: VTY_NEWLINE);
14641: return CMD_WARNING;
14642: }
14643:
14644: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14645: PEER_FLAG_RSERVER_CLIENT))
14646: {
14647: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14648: VTY_NEWLINE);
14649: return CMD_WARNING;
14650: }
14651:
14652: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
14653: (argc == 3) ? argv[2] : argv[1],
14654: AFI_IP6, SAFI_UNICAST, NULL, 1);
14655: }
14656:
14657: DEFUN (show_bgp_view_ipv6_rsclient_prefix,
14658: show_bgp_view_ipv6_rsclient_prefix_cmd,
14659: "show bgp view WORD ipv6 rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14660: SHOW_STR
14661: BGP_STR
14662: "BGP view\n"
14663: "View name\n"
14664: IP6_STR
14665: "Information about Route Server Client\n"
14666: NEIGHBOR_ADDR_STR
14667: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
14668: {
14669: struct bgp *bgp;
14670: struct peer *peer;
14671:
14672: /* BGP structure lookup. */
14673: if (argc == 3)
14674: {
14675: bgp = bgp_lookup_by_name (argv[0]);
14676: if (bgp == NULL)
14677: {
14678: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14679: return CMD_WARNING;
14680: }
14681: }
14682: else
14683: {
14684: bgp = bgp_get_default ();
14685: if (bgp == NULL)
14686: {
14687: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14688: return CMD_WARNING;
14689: }
14690: }
14691:
14692: if (argc == 3)
14693: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
14694: else
14695: peer = peer_lookup_in_view (vty, NULL, argv[0]);
14696:
14697: if (! peer)
14698: return CMD_WARNING;
14699:
14700: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
14701: {
14702: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14703: VTY_NEWLINE);
14704: return CMD_WARNING;
14705: }
14706:
14707: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
14708: PEER_FLAG_RSERVER_CLIENT))
14709: {
14710: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14711: VTY_NEWLINE);
14712: return CMD_WARNING;
14713: }
14714:
14715: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
14716: (argc == 3) ? argv[2] : argv[1],
14717: AFI_IP6, SAFI_UNICAST, NULL, 1);
14718: }
14719:
14720: ALIAS (show_bgp_view_ipv6_rsclient_prefix,
14721: show_bgp_rsclient_prefix_cmd,
14722: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14723: SHOW_STR
14724: BGP_STR
14725: "Information about Route Server Client\n"
14726: NEIGHBOR_ADDR_STR
14727: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
14728:
14729: ALIAS (show_bgp_view_ipv6_rsclient_prefix,
14730: show_bgp_ipv6_rsclient_prefix_cmd,
14731: "show bgp ipv6 rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14732: SHOW_STR
14733: BGP_STR
14734: "Information about Route Server Client\n"
14735: NEIGHBOR_ADDR_STR
14736: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
14737:
14738: DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
14739: show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
14740: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14741: SHOW_STR
14742: BGP_STR
14743: "BGP view\n"
14744: "View name\n"
14745: "Address family\n"
14746: "Address Family modifier\n"
14747: "Address Family modifier\n"
14748: "Information about Route Server Client\n"
14749: NEIGHBOR_ADDR_STR
14750: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
14751: {
14752: struct bgp *bgp;
14753: struct peer *peer;
14754: safi_t safi;
14755:
14756: /* BGP structure lookup. */
14757: if (argc == 4)
14758: {
14759: bgp = bgp_lookup_by_name (argv[0]);
14760: if (bgp == NULL)
14761: {
14762: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
14763: return CMD_WARNING;
14764: }
14765: }
14766: else
14767: {
14768: bgp = bgp_get_default ();
14769: if (bgp == NULL)
14770: {
14771: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
14772: return CMD_WARNING;
14773: }
14774: }
14775:
14776: if (argc == 4) {
14777: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
14778: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14779: } else {
14780: peer = peer_lookup_in_view (vty, NULL, argv[1]);
14781: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
14782: }
14783:
14784: if (! peer)
14785: return CMD_WARNING;
14786:
14787: if (! peer->afc[AFI_IP6][safi])
14788: {
14789: vty_out (vty, "%% Activate the neighbor for the address family first%s",
14790: VTY_NEWLINE);
14791: return CMD_WARNING;
14792: }
14793:
14794: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
14795: PEER_FLAG_RSERVER_CLIENT))
14796: {
14797: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
14798: VTY_NEWLINE);
14799: return CMD_WARNING;
14800: }
14801:
14802: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
14803: (argc == 4) ? argv[3] : argv[2],
14804: AFI_IP6, safi, NULL, 1);
14805: }
14806:
14807: ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
14808: show_bgp_ipv6_safi_rsclient_prefix_cmd,
14809: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
14810: SHOW_STR
14811: BGP_STR
14812: "Address family\n"
14813: "Address Family modifier\n"
14814: "Address Family modifier\n"
14815: "Information about Route Server Client\n"
14816: NEIGHBOR_ADDR_STR
14817: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
14818:
14819: struct bgp_table *bgp_distance_table;
14820:
14821: struct bgp_distance
14822: {
14823: /* Distance value for the IP source prefix. */
14824: u_char distance;
14825:
14826: /* Name of the access-list to be matched. */
14827: char *access_list;
14828: };
14829:
14830: static struct bgp_distance *
14831: bgp_distance_new (void)
14832: {
14833: return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
14834: }
14835:
14836: static void
14837: bgp_distance_free (struct bgp_distance *bdistance)
14838: {
14839: XFREE (MTYPE_BGP_DISTANCE, bdistance);
14840: }
14841:
14842: static int
14843: bgp_distance_set (struct vty *vty, const char *distance_str,
14844: const char *ip_str, const char *access_list_str)
14845: {
14846: int ret;
14847: struct prefix_ipv4 p;
14848: u_char distance;
14849: struct bgp_node *rn;
14850: struct bgp_distance *bdistance;
14851:
14852: ret = str2prefix_ipv4 (ip_str, &p);
14853: if (ret == 0)
14854: {
14855: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
14856: return CMD_WARNING;
14857: }
14858:
14859: distance = atoi (distance_str);
14860:
14861: /* Get BGP distance node. */
14862: rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
14863: if (rn->info)
14864: {
14865: bdistance = rn->info;
14866: bgp_unlock_node (rn);
14867: }
14868: else
14869: {
14870: bdistance = bgp_distance_new ();
14871: rn->info = bdistance;
14872: }
14873:
14874: /* Set distance value. */
14875: bdistance->distance = distance;
14876:
14877: /* Reset access-list configuration. */
14878: if (bdistance->access_list)
14879: {
14880: free (bdistance->access_list);
14881: bdistance->access_list = NULL;
14882: }
14883: if (access_list_str)
14884: bdistance->access_list = strdup (access_list_str);
14885:
14886: return CMD_SUCCESS;
14887: }
14888:
14889: static int
14890: bgp_distance_unset (struct vty *vty, const char *distance_str,
14891: const char *ip_str, const char *access_list_str)
14892: {
14893: int ret;
14894: struct prefix_ipv4 p;
14895: u_char distance;
14896: struct bgp_node *rn;
14897: struct bgp_distance *bdistance;
14898:
14899: ret = str2prefix_ipv4 (ip_str, &p);
14900: if (ret == 0)
14901: {
14902: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
14903: return CMD_WARNING;
14904: }
14905:
14906: distance = atoi (distance_str);
14907:
14908: rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
14909: if (! rn)
14910: {
14911: vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
14912: return CMD_WARNING;
14913: }
14914:
14915: bdistance = rn->info;
14916:
14917: if (bdistance->distance != distance)
14918: {
14919: vty_out (vty, "Distance does not match configured%s", VTY_NEWLINE);
14920: return CMD_WARNING;
14921: }
14922:
14923: if (bdistance->access_list)
14924: free (bdistance->access_list);
14925: bgp_distance_free (bdistance);
14926:
14927: rn->info = NULL;
14928: bgp_unlock_node (rn);
14929: bgp_unlock_node (rn);
14930:
14931: return CMD_SUCCESS;
14932: }
14933:
14934: /* Apply BGP information to distance method. */
14935: u_char
14936: bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
14937: {
14938: struct bgp_node *rn;
14939: struct prefix_ipv4 q;
14940: struct peer *peer;
14941: struct bgp_distance *bdistance;
14942: struct access_list *alist;
14943: struct bgp_static *bgp_static;
14944:
14945: if (! bgp)
14946: return 0;
14947:
14948: if (p->family != AF_INET)
14949: return 0;
14950:
14951: peer = rinfo->peer;
14952:
14953: if (peer->su.sa.sa_family != AF_INET)
14954: return 0;
14955:
14956: memset (&q, 0, sizeof (struct prefix_ipv4));
14957: q.family = AF_INET;
14958: q.prefix = peer->su.sin.sin_addr;
14959: q.prefixlen = IPV4_MAX_BITLEN;
14960:
14961: /* Check source address. */
14962: rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
14963: if (rn)
14964: {
14965: bdistance = rn->info;
14966: bgp_unlock_node (rn);
14967:
14968: if (bdistance->access_list)
14969: {
14970: alist = access_list_lookup (AFI_IP, bdistance->access_list);
14971: if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
14972: return bdistance->distance;
14973: }
14974: else
14975: return bdistance->distance;
14976: }
14977:
14978: /* Backdoor check. */
14979: rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
14980: if (rn)
14981: {
14982: bgp_static = rn->info;
14983: bgp_unlock_node (rn);
14984:
14985: if (bgp_static->backdoor)
14986: {
14987: if (bgp->distance_local)
14988: return bgp->distance_local;
14989: else
14990: return ZEBRA_IBGP_DISTANCE_DEFAULT;
14991: }
14992: }
14993:
14994: if (peer->sort == BGP_PEER_EBGP)
14995: {
14996: if (bgp->distance_ebgp)
14997: return bgp->distance_ebgp;
14998: return ZEBRA_EBGP_DISTANCE_DEFAULT;
14999: }
15000: else
15001: {
15002: if (bgp->distance_ibgp)
15003: return bgp->distance_ibgp;
15004: return ZEBRA_IBGP_DISTANCE_DEFAULT;
15005: }
15006: }
15007:
15008: DEFUN (bgp_distance,
15009: bgp_distance_cmd,
15010: "distance bgp <1-255> <1-255> <1-255>",
15011: "Define an administrative distance\n"
15012: "BGP distance\n"
15013: "Distance for routes external to the AS\n"
15014: "Distance for routes internal to the AS\n"
15015: "Distance for local routes\n")
15016: {
15017: struct bgp *bgp;
15018:
15019: bgp = vty->index;
15020:
15021: bgp->distance_ebgp = atoi (argv[0]);
15022: bgp->distance_ibgp = atoi (argv[1]);
15023: bgp->distance_local = atoi (argv[2]);
15024: return CMD_SUCCESS;
15025: }
15026:
15027: DEFUN (no_bgp_distance,
15028: no_bgp_distance_cmd,
15029: "no distance bgp <1-255> <1-255> <1-255>",
15030: NO_STR
15031: "Define an administrative distance\n"
15032: "BGP distance\n"
15033: "Distance for routes external to the AS\n"
15034: "Distance for routes internal to the AS\n"
15035: "Distance for local routes\n")
15036: {
15037: struct bgp *bgp;
15038:
15039: bgp = vty->index;
15040:
15041: bgp->distance_ebgp= 0;
15042: bgp->distance_ibgp = 0;
15043: bgp->distance_local = 0;
15044: return CMD_SUCCESS;
15045: }
15046:
15047: ALIAS (no_bgp_distance,
15048: no_bgp_distance2_cmd,
15049: "no distance bgp",
15050: NO_STR
15051: "Define an administrative distance\n"
15052: "BGP distance\n")
15053:
15054: DEFUN (bgp_distance_source,
15055: bgp_distance_source_cmd,
15056: "distance <1-255> A.B.C.D/M",
15057: "Define an administrative distance\n"
15058: "Administrative distance\n"
15059: "IP source prefix\n")
15060: {
15061: bgp_distance_set (vty, argv[0], argv[1], NULL);
15062: return CMD_SUCCESS;
15063: }
15064:
15065: DEFUN (no_bgp_distance_source,
15066: no_bgp_distance_source_cmd,
15067: "no distance <1-255> A.B.C.D/M",
15068: NO_STR
15069: "Define an administrative distance\n"
15070: "Administrative distance\n"
15071: "IP source prefix\n")
15072: {
15073: bgp_distance_unset (vty, argv[0], argv[1], NULL);
15074: return CMD_SUCCESS;
15075: }
15076:
15077: DEFUN (bgp_distance_source_access_list,
15078: bgp_distance_source_access_list_cmd,
15079: "distance <1-255> A.B.C.D/M WORD",
15080: "Define an administrative distance\n"
15081: "Administrative distance\n"
15082: "IP source prefix\n"
15083: "Access list name\n")
15084: {
15085: bgp_distance_set (vty, argv[0], argv[1], argv[2]);
15086: return CMD_SUCCESS;
15087: }
15088:
15089: DEFUN (no_bgp_distance_source_access_list,
15090: no_bgp_distance_source_access_list_cmd,
15091: "no distance <1-255> A.B.C.D/M WORD",
15092: NO_STR
15093: "Define an administrative distance\n"
15094: "Administrative distance\n"
15095: "IP source prefix\n"
15096: "Access list name\n")
15097: {
15098: bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
15099: return CMD_SUCCESS;
15100: }
15101:
15102: DEFUN (bgp_damp_set,
15103: bgp_damp_set_cmd,
15104: "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
15105: "BGP Specific commands\n"
15106: "Enable route-flap dampening\n"
15107: "Half-life time for the penalty\n"
15108: "Value to start reusing a route\n"
15109: "Value to start suppressing a route\n"
15110: "Maximum duration to suppress a stable route\n")
15111: {
15112: struct bgp *bgp;
15113: int half = DEFAULT_HALF_LIFE * 60;
15114: int reuse = DEFAULT_REUSE;
15115: int suppress = DEFAULT_SUPPRESS;
15116: int max = 4 * half;
15117:
15118: if (argc == 4)
15119: {
15120: half = atoi (argv[0]) * 60;
15121: reuse = atoi (argv[1]);
15122: suppress = atoi (argv[2]);
15123: max = atoi (argv[3]) * 60;
15124: }
15125: else if (argc == 1)
15126: {
15127: half = atoi (argv[0]) * 60;
15128: max = 4 * half;
15129: }
15130:
15131: bgp = vty->index;
15132:
15133: if (suppress < reuse)
15134: {
15135: vty_out (vty, "Suppress value cannot be less than reuse value %s",
15136: VTY_NEWLINE);
15137: return 0;
15138: }
15139:
15140: return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
15141: half, reuse, suppress, max);
15142: }
15143:
15144: ALIAS (bgp_damp_set,
15145: bgp_damp_set2_cmd,
15146: "bgp dampening <1-45>",
15147: "BGP Specific commands\n"
15148: "Enable route-flap dampening\n"
15149: "Half-life time for the penalty\n")
15150:
15151: ALIAS (bgp_damp_set,
15152: bgp_damp_set3_cmd,
15153: "bgp dampening",
15154: "BGP Specific commands\n"
15155: "Enable route-flap dampening\n")
15156:
15157: DEFUN (bgp_damp_unset,
15158: bgp_damp_unset_cmd,
15159: "no bgp dampening",
15160: NO_STR
15161: "BGP Specific commands\n"
15162: "Enable route-flap dampening\n")
15163: {
15164: struct bgp *bgp;
15165:
15166: bgp = vty->index;
15167: return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
15168: }
15169:
15170: ALIAS (bgp_damp_unset,
15171: bgp_damp_unset2_cmd,
15172: "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
15173: NO_STR
15174: "BGP Specific commands\n"
15175: "Enable route-flap dampening\n"
15176: "Half-life time for the penalty\n"
15177: "Value to start reusing a route\n"
15178: "Value to start suppressing a route\n"
15179: "Maximum duration to suppress a stable route\n")
15180:
15181: DEFUN (show_ip_bgp_dampened_paths,
15182: show_ip_bgp_dampened_paths_cmd,
15183: "show ip bgp dampened-paths",
15184: SHOW_STR
15185: IP_STR
15186: BGP_STR
15187: "Display paths suppressed due to dampening\n")
15188: {
15189: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
15190: NULL);
15191: }
15192:
15193: ALIAS (show_ip_bgp_dampened_paths,
15194: show_ip_bgp_damp_dampened_paths_cmd,
15195: "show ip bgp dampening dampened-paths",
15196: SHOW_STR
15197: IP_STR
15198: BGP_STR
15199: "Display detailed information about dampening\n"
15200: "Display paths suppressed due to dampening\n")
15201:
15202: DEFUN (show_ip_bgp_flap_statistics,
15203: show_ip_bgp_flap_statistics_cmd,
15204: "show ip bgp flap-statistics",
15205: SHOW_STR
15206: IP_STR
15207: BGP_STR
15208: "Display flap statistics of routes\n")
15209: {
15210: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
15211: bgp_show_type_flap_statistics, NULL);
15212: }
15213:
15214: ALIAS (show_ip_bgp_flap_statistics,
15215: show_ip_bgp_damp_flap_statistics_cmd,
15216: "show ip bgp dampening flap-statistics",
15217: SHOW_STR
15218: IP_STR
15219: BGP_STR
15220: "Display detailed information about dampening\n"
15221: "Display flap statistics of routes\n")
15222:
15223: DEFUN (show_bgp_ipv4_safi_dampened_paths,
15224: show_bgp_ipv4_safi_dampened_paths_cmd,
15225: "show bgp ipv4 (encap|multicast|unicast|vpn) dampened-paths",
15226: SHOW_STR
15227: BGP_STR
15228: IP_STR
15229: "Address Family modifier\n"
15230: "Address Family modifier\n"
15231: "Address Family modifier\n"
15232: "Address Family modifier\n"
15233: "Display paths suppressed due to dampening\n")
15234: {
15235: safi_t safi;
15236:
15237: if (bgp_parse_safi(argv[0], &safi)) {
15238: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
15239: return CMD_WARNING;
15240: }
15241:
15242: return bgp_show (vty, NULL, AFI_IP, safi, bgp_show_type_dampend_paths, NULL);
15243: }
15244: ALIAS (show_bgp_ipv4_safi_dampened_paths,
15245: show_bgp_ipv4_safi_damp_dampened_paths_cmd,
15246: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening dampened-paths",
15247: SHOW_STR
15248: BGP_STR
15249: IP_STR
15250: "Address Family modifier\n"
15251: "Address Family modifier\n"
15252: "Address Family modifier\n"
15253: "Address Family modifier\n"
15254: "Display detailed information about dampening\n"
15255: "Display paths suppressed due to dampening\n")
15256:
15257: DEFUN (show_bgp_ipv6_safi_dampened_paths,
15258: show_bgp_ipv6_safi_dampened_paths_cmd,
15259: "show bgp ipv6 (encap|multicast|unicast|vpn) dampened-paths",
15260: SHOW_STR
15261: BGP_STR
15262: IPV6_STR
15263: "Address Family modifier\n"
15264: "Address Family modifier\n"
15265: "Address Family modifier\n"
15266: "Address Family modifier\n"
15267: "Display paths suppressed due to dampening\n")
15268: {
15269: safi_t safi;
15270:
15271: if (bgp_parse_safi(argv[0], &safi)) {
15272: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
15273: return CMD_WARNING;
15274: }
15275:
15276: return bgp_show (vty, NULL, AFI_IP6, safi, bgp_show_type_dampend_paths, NULL);
15277: }
15278: ALIAS (show_bgp_ipv6_safi_dampened_paths,
15279: show_bgp_ipv6_safi_damp_dampened_paths_cmd,
15280: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening dampened-paths",
15281: SHOW_STR
15282: BGP_STR
15283: IPV6_STR
15284: "Address Family modifier\n"
15285: "Address Family modifier\n"
15286: "Address Family modifier\n"
15287: "Address Family modifier\n"
15288: "Display detailed information about dampening\n"
15289: "Display paths suppressed due to dampening\n")
15290:
15291: DEFUN (show_bgp_ipv4_safi_flap_statistics,
15292: show_bgp_ipv4_safi_flap_statistics_cmd,
15293: "show bgp ipv4 (encap|multicast|unicast|vpn) flap-statistics",
15294: SHOW_STR
15295: BGP_STR
15296: "Address Family\n"
15297: "Address Family modifier\n"
15298: "Address Family modifier\n"
15299: "Address Family modifier\n"
15300: "Address Family modifier\n"
15301: "Display flap statistics of routes\n")
15302: {
15303: safi_t safi;
15304:
15305: if (bgp_parse_safi(argv[0], &safi)) {
15306: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
15307: return CMD_WARNING;
15308: }
15309:
15310: return bgp_show (vty, NULL, AFI_IP, safi, bgp_show_type_flap_statistics, NULL);
15311: }
15312: ALIAS (show_bgp_ipv4_safi_flap_statistics,
15313: show_bgp_ipv4_safi_damp_flap_statistics_cmd,
15314: "show bgp ipv4 (encap|multicast|unicast|vpn) dampening flap-statistics",
15315: SHOW_STR
15316: BGP_STR
15317: "Address Family\n"
15318: "Address Family modifier\n"
15319: "Address Family modifier\n"
15320: "Address Family modifier\n"
15321: "Address Family modifier\n"
15322: "Display detailed information about dampening\n"
15323: "Display flap statistics of routes\n")
15324:
15325: DEFUN (show_bgp_ipv6_safi_flap_statistics,
15326: show_bgp_ipv6_safi_flap_statistics_cmd,
15327: "show bgp ipv6 (encap|multicast|unicast|vpn) flap-statistics",
15328: SHOW_STR
15329: BGP_STR
15330: "Address Family\n"
15331: "Address Family modifier\n"
15332: "Address Family modifier\n"
15333: "Address Family modifier\n"
15334: "Address Family modifier\n"
15335: "Display flap statistics of routes\n")
15336: {
15337: safi_t safi;
15338:
15339: if (bgp_parse_safi(argv[0], &safi)) {
15340: vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE);
15341: return CMD_WARNING;
15342: }
15343:
15344: return bgp_show (vty, NULL, AFI_IP6, safi, bgp_show_type_flap_statistics, NULL);
15345: }
15346: ALIAS (show_bgp_ipv6_safi_flap_statistics,
15347: show_bgp_ipv6_safi_damp_flap_statistics_cmd,
15348: "show bgp ipv6 (encap|multicast|unicast|vpn) dampening flap-statistics",
15349: SHOW_STR
15350: BGP_STR
15351: "Address Family\n"
15352: "Address Family modifier\n"
15353: "Address Family modifier\n"
15354: "Address Family modifier\n"
15355: "Address Family modifier\n"
15356: "Display detailed information about dampening\n"
15357: "Display flap statistics of routes\n")
15358:
15359: /* Display specified route of BGP table. */
15360: static int
15361: bgp_clear_damp_route (struct vty *vty, const char *view_name,
15362: const char *ip_str, afi_t afi, safi_t safi,
15363: struct prefix_rd *prd, int prefix_check)
15364: {
15365: int ret;
15366: struct prefix match;
15367: struct bgp_node *rn;
15368: struct bgp_node *rm;
15369: struct bgp_info *ri;
15370: struct bgp_info *ri_temp;
15371: struct bgp *bgp;
15372: struct bgp_table *table;
15373:
15374: /* BGP structure lookup. */
15375: if (view_name)
15376: {
15377: bgp = bgp_lookup_by_name (view_name);
15378: if (bgp == NULL)
15379: {
15380: vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
15381: return CMD_WARNING;
15382: }
15383: }
15384: else
15385: {
15386: bgp = bgp_get_default ();
15387: if (bgp == NULL)
15388: {
15389: vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
15390: return CMD_WARNING;
15391: }
15392: }
15393:
15394: /* Check IP address argument. */
15395: ret = str2prefix (ip_str, &match);
15396: if (! ret)
15397: {
15398: vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
15399: return CMD_WARNING;
15400: }
15401:
15402: match.family = afi2family (afi);
15403:
15404: if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))
15405: {
15406: for (rn = bgp_table_top (bgp->rib[AFI_IP][safi]); rn; rn = bgp_route_next (rn))
15407: {
15408: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
15409: continue;
15410:
15411: if ((table = rn->info) != NULL)
15412: if ((rm = bgp_node_match (table, &match)) != NULL)
15413: {
15414: if (! prefix_check || rm->p.prefixlen == match.prefixlen)
15415: {
15416: ri = rm->info;
15417: while (ri)
15418: {
15419: if (ri->extra && ri->extra->damp_info)
15420: {
15421: ri_temp = ri->next;
15422: bgp_damp_info_free (ri->extra->damp_info, 1);
15423: ri = ri_temp;
15424: }
15425: else
15426: ri = ri->next;
15427: }
15428: }
15429:
15430: bgp_unlock_node (rm);
15431: }
15432: }
15433: }
15434: else
15435: {
15436: if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
15437: {
15438: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
15439: {
15440: ri = rn->info;
15441: while (ri)
15442: {
15443: if (ri->extra && ri->extra->damp_info)
15444: {
15445: ri_temp = ri->next;
15446: bgp_damp_info_free (ri->extra->damp_info, 1);
15447: ri = ri_temp;
15448: }
15449: else
15450: ri = ri->next;
15451: }
15452: }
15453:
15454: bgp_unlock_node (rn);
15455: }
15456: }
15457:
15458: return CMD_SUCCESS;
15459: }
15460:
15461: DEFUN (clear_ip_bgp_dampening,
15462: clear_ip_bgp_dampening_cmd,
15463: "clear ip bgp dampening",
15464: CLEAR_STR
15465: IP_STR
15466: BGP_STR
15467: "Clear route flap dampening information\n")
15468: {
15469: bgp_damp_info_clean ();
15470: return CMD_SUCCESS;
15471: }
15472:
15473: DEFUN (clear_ip_bgp_dampening_prefix,
15474: clear_ip_bgp_dampening_prefix_cmd,
15475: "clear ip bgp dampening A.B.C.D/M",
15476: CLEAR_STR
15477: IP_STR
15478: BGP_STR
15479: "Clear route flap dampening information\n"
15480: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
15481: {
15482: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
15483: SAFI_UNICAST, NULL, 1);
15484: }
15485:
15486: DEFUN (clear_ip_bgp_dampening_address,
15487: clear_ip_bgp_dampening_address_cmd,
15488: "clear ip bgp dampening A.B.C.D",
15489: CLEAR_STR
15490: IP_STR
15491: BGP_STR
15492: "Clear route flap dampening information\n"
15493: "Network to clear damping information\n")
15494: {
15495: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
15496: SAFI_UNICAST, NULL, 0);
15497: }
15498:
15499: DEFUN (clear_ip_bgp_dampening_address_mask,
15500: clear_ip_bgp_dampening_address_mask_cmd,
15501: "clear ip bgp dampening A.B.C.D A.B.C.D",
15502: CLEAR_STR
15503: IP_STR
15504: BGP_STR
15505: "Clear route flap dampening information\n"
15506: "Network to clear damping information\n"
15507: "Network mask\n")
15508: {
15509: int ret;
15510: char prefix_str[BUFSIZ];
15511:
15512: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
15513: if (! ret)
15514: {
15515: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
15516: return CMD_WARNING;
15517: }
15518:
15519: return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
15520: SAFI_UNICAST, NULL, 0);
15521: }
15522:
15523: /* also used for encap safi */
15524: static int
15525: bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
15526: afi_t afi, safi_t safi, int *write)
15527: {
15528: struct bgp_node *prn;
15529: struct bgp_node *rn;
15530: struct bgp_table *table;
15531: struct prefix *p;
15532: struct prefix_rd *prd;
15533: struct bgp_static *bgp_static;
15534: u_int32_t label;
15535: char buf[SU_ADDRSTRLEN];
15536: char rdbuf[RD_ADDRSTRLEN];
15537:
15538: /* Network configuration. */
15539: for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
15540: if ((table = prn->info) != NULL)
15541: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
15542: if ((bgp_static = rn->info) != NULL)
15543: {
15544: p = &rn->p;
15545: prd = (struct prefix_rd *) &prn->p;
15546:
15547: /* "address-family" display. */
15548: bgp_config_write_family_header (vty, afi, safi, write);
15549:
15550: /* "network" configuration display. */
15551: prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
15552: label = decode_label (bgp_static->tag);
15553:
15554: vty_out (vty, " network %s/%d rd %s tag %d",
15555: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
15556: p->prefixlen,
15557: rdbuf, label);
15558: vty_out (vty, "%s", VTY_NEWLINE);
15559: }
15560: return 0;
15561: }
15562:
15563: /* Configuration of static route announcement and aggregate
15564: information. */
15565: int
15566: bgp_config_write_network (struct vty *vty, struct bgp *bgp,
15567: afi_t afi, safi_t safi, int *write)
15568: {
15569: struct bgp_node *rn;
15570: struct prefix *p;
15571: struct bgp_static *bgp_static;
15572: struct bgp_aggregate *bgp_aggregate;
15573: char buf[SU_ADDRSTRLEN];
15574:
15575: if (afi == AFI_IP && ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)))
15576: return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
15577:
15578: /* Network configuration. */
15579: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
15580: if ((bgp_static = rn->info) != NULL)
15581: {
15582: p = &rn->p;
15583:
15584: /* "address-family" display. */
15585: bgp_config_write_family_header (vty, afi, safi, write);
15586:
15587: /* "network" configuration display. */
15588: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
15589: {
15590: u_int32_t destination;
15591: struct in_addr netmask;
15592:
15593: destination = ntohl (p->u.prefix4.s_addr);
15594: masklen2ip (p->prefixlen, &netmask);
15595: vty_out (vty, " network %s",
15596: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
15597:
15598: if ((IN_CLASSC (destination) && p->prefixlen == 24)
15599: || (IN_CLASSB (destination) && p->prefixlen == 16)
15600: || (IN_CLASSA (destination) && p->prefixlen == 8)
15601: || p->u.prefix4.s_addr == 0)
15602: {
15603: /* Natural mask is not display. */
15604: }
15605: else
15606: vty_out (vty, " mask %s", inet_ntoa (netmask));
15607: }
15608: else
15609: {
15610: vty_out (vty, " network %s/%d",
15611: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
15612: p->prefixlen);
15613: }
15614:
15615: if (bgp_static->rmap.name)
15616: vty_out (vty, " route-map %s", bgp_static->rmap.name);
15617: else
15618: {
15619: if (bgp_static->backdoor)
15620: vty_out (vty, " backdoor");
15621: }
15622:
15623: vty_out (vty, "%s", VTY_NEWLINE);
15624: }
15625:
15626: /* Aggregate-address configuration. */
15627: for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
15628: if ((bgp_aggregate = rn->info) != NULL)
15629: {
15630: p = &rn->p;
15631:
15632: /* "address-family" display. */
15633: bgp_config_write_family_header (vty, afi, safi, write);
15634:
15635: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
15636: {
15637: struct in_addr netmask;
15638:
15639: masklen2ip (p->prefixlen, &netmask);
15640: vty_out (vty, " aggregate-address %s %s",
15641: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
15642: inet_ntoa (netmask));
15643: }
15644: else
15645: {
15646: vty_out (vty, " aggregate-address %s/%d",
15647: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
15648: p->prefixlen);
15649: }
15650:
15651: if (bgp_aggregate->as_set)
15652: vty_out (vty, " as-set");
15653:
15654: if (bgp_aggregate->summary_only)
15655: vty_out (vty, " summary-only");
15656:
15657: vty_out (vty, "%s", VTY_NEWLINE);
15658: }
15659:
15660: return 0;
15661: }
15662:
15663: int
15664: bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
15665: {
15666: struct bgp_node *rn;
15667: struct bgp_distance *bdistance;
15668:
15669: /* Distance configuration. */
15670: if (bgp->distance_ebgp
15671: && bgp->distance_ibgp
15672: && bgp->distance_local
15673: && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
15674: || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
15675: || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
15676: vty_out (vty, " distance bgp %d %d %d%s",
15677: bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
15678: VTY_NEWLINE);
15679:
15680: for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
15681: if ((bdistance = rn->info) != NULL)
15682: {
15683: vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
15684: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
15685: bdistance->access_list ? bdistance->access_list : "",
15686: VTY_NEWLINE);
15687: }
15688:
15689: return 0;
15690: }
15691:
15692: /* Allocate routing table structure and install commands. */
15693: void
15694: bgp_route_init (void)
15695: {
15696: /* Init BGP distance table. */
15697: bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
15698:
15699: /* IPv4 BGP commands. */
15700: install_element (BGP_NODE, &bgp_network_cmd);
15701: install_element (BGP_NODE, &bgp_network_mask_cmd);
15702: install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
15703: install_element (BGP_NODE, &bgp_network_route_map_cmd);
15704: install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
15705: install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
15706: install_element (BGP_NODE, &bgp_network_backdoor_cmd);
15707: install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
15708: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
15709: install_element (BGP_NODE, &no_bgp_network_cmd);
15710: install_element (BGP_NODE, &no_bgp_network_mask_cmd);
15711: install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
15712: install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
15713: install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
15714: install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
15715: install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
15716: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
15717: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
15718:
15719: install_element (BGP_NODE, &aggregate_address_cmd);
15720: install_element (BGP_NODE, &aggregate_address_mask_cmd);
15721: install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
15722: install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
15723: install_element (BGP_NODE, &aggregate_address_as_set_cmd);
15724: install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
15725: install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
15726: install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
15727: install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
15728: install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
15729: install_element (BGP_NODE, &no_aggregate_address_cmd);
15730: install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
15731: install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
15732: install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
15733: install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
15734: install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
15735: install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
15736: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
15737: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
15738: install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
15739:
15740: /* IPv4 unicast configuration. */
15741: install_element (BGP_IPV4_NODE, &bgp_network_cmd);
15742: install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
15743: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
15744: install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
15745: install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
15746: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
15747: install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
15748: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
15749: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
15750: install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
15751: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
15752: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
15753:
15754: install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
15755: install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
15756: install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
15757: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
15758: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
15759: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
15760: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
15761: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
15762: install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
15763: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
15764: install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
15765: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
15766: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
15767: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
15768: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
15769: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
15770: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
15771: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
15772: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
15773: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
15774:
15775: /* IPv4 multicast configuration. */
15776: install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
15777: install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
15778: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
15779: install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
15780: install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
15781: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
15782: install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
15783: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
15784: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
15785: install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
15786: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
15787: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
15788: install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
15789: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
15790: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
15791: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
15792: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
15793: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
15794: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
15795: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
15796: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
15797: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
15798: install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
15799: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
15800: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
15801: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
15802: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
15803: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
15804: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
15805: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
15806: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
15807: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
15808:
15809: install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
15810: install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
15811: install_element (VIEW_NODE, &show_bgp_ipv4_vpn_route_cmd);
15812: install_element (VIEW_NODE, &show_bgp_ipv6_vpn_route_cmd);
15813: install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_route_cmd);
15814: install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_route_cmd);
15815: install_element (VIEW_NODE, &show_bgp_ipv4_encap_route_cmd);
15816: install_element (VIEW_NODE, &show_bgp_ipv6_encap_route_cmd);
15817: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rd_route_cmd);
15818: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rd_route_cmd);
15819: install_element (VIEW_NODE, &show_bgp_ipv4_prefix_cmd);
15820: install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
15821: install_element (VIEW_NODE, &show_bgp_ipv4_vpn_prefix_cmd);
15822: install_element (VIEW_NODE, &show_bgp_ipv6_vpn_prefix_cmd);
15823: install_element (VIEW_NODE, &show_bgp_ipv4_encap_prefix_cmd);
15824: install_element (VIEW_NODE, &show_bgp_ipv6_encap_prefix_cmd);
15825: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rd_prefix_cmd);
15826: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rd_prefix_cmd);
15827: install_element (VIEW_NODE, &show_bgp_afi_safi_view_cmd);
15828: install_element (VIEW_NODE, &show_bgp_view_afi_safi_route_cmd);
15829: install_element (VIEW_NODE, &show_bgp_view_afi_safi_prefix_cmd);
15830: install_element (VIEW_NODE, &show_bgp_ipv4_safi_regexp_cmd);
15831: install_element (VIEW_NODE, &show_bgp_ipv6_safi_regexp_cmd);
15832: install_element (VIEW_NODE, &show_bgp_ipv4_prefix_list_cmd);
15833: install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_list_cmd);
15834: install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_list_cmd);
15835: install_element (VIEW_NODE, &show_bgp_ipv4_filter_list_cmd);
15836: install_element (VIEW_NODE, &show_bgp_ipv4_safi_filter_list_cmd);
15837: install_element (VIEW_NODE, &show_bgp_ipv6_safi_filter_list_cmd);
15838: install_element (VIEW_NODE, &show_bgp_ipv4_route_map_cmd);
15839: install_element (VIEW_NODE, &show_bgp_ipv4_cidr_only_cmd);
15840: install_element (VIEW_NODE, &show_bgp_ipv4_safi_cidr_only_cmd);
15841: install_element (VIEW_NODE, &show_bgp_ipv4_community_cmd);
15842: install_element (VIEW_NODE, &show_bgp_ipv4_community2_cmd);
15843: install_element (VIEW_NODE, &show_bgp_ipv4_community3_cmd);
15844: install_element (VIEW_NODE, &show_bgp_ipv4_community4_cmd);
15845: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community_cmd);
15846: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community2_cmd);
15847: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community3_cmd);
15848: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community4_cmd);
15849: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
15850: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
15851: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
15852: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
15853: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
15854: install_element (VIEW_NODE, &show_bgp_ipv4_community_exact_cmd);
15855: install_element (VIEW_NODE, &show_bgp_ipv4_community2_exact_cmd);
15856: install_element (VIEW_NODE, &show_bgp_ipv4_community3_exact_cmd);
15857: install_element (VIEW_NODE, &show_bgp_ipv4_community4_exact_cmd);
15858: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community_exact_cmd);
15859: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community2_exact_cmd);
15860: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community3_exact_cmd);
15861: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community4_exact_cmd);
15862: install_element (VIEW_NODE, &show_bgp_ipv4_community_list_cmd);
15863: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community_list_cmd);
15864: install_element (VIEW_NODE, &show_bgp_ipv4_community_list_exact_cmd);
15865: install_element (VIEW_NODE, &show_bgp_ipv4_safi_community_list_exact_cmd);
15866: install_element (VIEW_NODE, &show_bgp_ipv4_prefix_longer_cmd);
15867: install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_longer_cmd);
15868: install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_longer_cmd);
15869: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_advertised_route_cmd);
15870: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_advertised_route_cmd);
15871: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_received_routes_cmd);
15872: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_received_routes_cmd);
15873: install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
15874: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_routes_cmd);
15875: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_routes_cmd);
15876: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_received_prefix_filter_cmd);
15877: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_received_prefix_filter_cmd);
15878: install_element (VIEW_NODE, &show_bgp_ipv4_safi_dampened_paths_cmd);
15879: install_element (VIEW_NODE, &show_bgp_ipv6_safi_dampened_paths_cmd);
15880: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_dampened_paths_cmd);
15881: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_dampened_paths_cmd);
15882: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_statistics_cmd);
15883: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_statistics_cmd);
15884: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_statistics_cmd);
15885: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_statistics_cmd);
15886: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_address_cmd);
15887: install_element (VIEW_NODE, &show_bgp_ipv6_flap_address_cmd);
15888: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_address_cmd);
15889: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_prefix_cmd);
15890: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_prefix_cmd);
15891: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_cmd);
15892: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_cmd);
15893: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_cidr_only_cmd);
15894: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_cidr_only_cmd);
15895: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_regexp_cmd);
15896: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_regexp_cmd);
15897: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_regexp_cmd);
15898: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_regexp_cmd);
15899: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_filter_list_cmd);
15900: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_filter_list_cmd);
15901: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_filter_list_cmd);
15902: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_filter_list_cmd);
15903: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_prefix_list_cmd);
15904: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_prefix_list_cmd);
15905: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_list_cmd);
15906: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_list_cmd);
15907: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_prefix_longer_cmd);
15908: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_prefix_longer_cmd);
15909: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_longer_cmd);
15910: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_longer_cmd);
15911: install_element (VIEW_NODE, &show_bgp_ipv4_safi_flap_route_map_cmd);
15912: install_element (VIEW_NODE, &show_bgp_ipv6_safi_flap_route_map_cmd);
15913: install_element (VIEW_NODE, &show_bgp_ipv4_safi_damp_flap_route_map_cmd);
15914: install_element (VIEW_NODE, &show_bgp_ipv6_safi_damp_flap_route_map_cmd);
15915: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_flap_cmd);
15916: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_flap_cmd);
15917: install_element (VIEW_NODE, &show_bgp_ipv4_safi_neighbor_damp_cmd);
15918: install_element (VIEW_NODE, &show_bgp_ipv6_safi_neighbor_damp_cmd);
15919: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
15920: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
15921: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
15922: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
15923: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
15924: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
15925:
15926: /* Restricted node: VIEW_NODE - (set of dangerous commands) */
15927: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
15928: install_element (RESTRICTED_NODE, &show_bgp_ipv4_vpn_rd_route_cmd);
15929: install_element (RESTRICTED_NODE, &show_bgp_ipv6_vpn_rd_route_cmd);
15930: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rd_route_cmd);
15931: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rd_route_cmd);
15932: install_element (RESTRICTED_NODE, &show_bgp_ipv4_prefix_cmd);
15933: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
15934: install_element (RESTRICTED_NODE, &show_bgp_ipv4_vpn_prefix_cmd);
15935: install_element (RESTRICTED_NODE, &show_bgp_ipv6_vpn_prefix_cmd);
15936: install_element (RESTRICTED_NODE, &show_bgp_ipv4_encap_prefix_cmd);
15937: install_element (RESTRICTED_NODE, &show_bgp_ipv6_encap_prefix_cmd);
15938: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rd_prefix_cmd);
15939: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rd_prefix_cmd);
15940: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_route_cmd);
15941: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_prefix_cmd);
15942: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community_cmd);
15943: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community2_cmd);
15944: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community3_cmd);
15945: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community4_cmd);
15946: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community_cmd);
15947: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community2_cmd);
15948: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community3_cmd);
15949: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community4_cmd);
15950: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
15951: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
15952: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
15953: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
15954: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
15955: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community_exact_cmd);
15956: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community2_exact_cmd);
15957: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community3_exact_cmd);
15958: install_element (RESTRICTED_NODE, &show_bgp_ipv4_community4_exact_cmd);
15959: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community_exact_cmd);
15960: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community2_exact_cmd);
15961: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community3_exact_cmd);
15962: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_community4_exact_cmd);
15963: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
15964: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
15965: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
15966: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
15967:
15968: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
15969: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
15970: install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_route_cmd);
15971: install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_route_cmd);
15972: install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_route_cmd);
15973: install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_route_cmd);
15974: install_element (ENABLE_NODE, &show_bgp_ipv4_encap_route_cmd);
15975: install_element (ENABLE_NODE, &show_bgp_ipv6_encap_route_cmd);
15976: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rd_route_cmd);
15977: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rd_route_cmd);
15978: install_element (ENABLE_NODE, &show_bgp_ipv4_prefix_cmd);
15979: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
15980: install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_prefix_cmd);
15981: install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_prefix_cmd);
15982: install_element (ENABLE_NODE, &show_bgp_ipv4_encap_prefix_cmd);
15983: install_element (ENABLE_NODE, &show_bgp_ipv6_encap_prefix_cmd);
15984: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rd_prefix_cmd);
15985: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rd_prefix_cmd);
15986: install_element (ENABLE_NODE, &show_bgp_afi_safi_view_cmd);
15987: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_route_cmd);
15988: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_prefix_cmd);
15989: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_regexp_cmd);
15990: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_regexp_cmd);
15991: install_element (ENABLE_NODE, &show_bgp_ipv4_prefix_list_cmd);
15992: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_list_cmd);
15993: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_list_cmd);
15994: install_element (ENABLE_NODE, &show_bgp_ipv4_filter_list_cmd);
15995: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_filter_list_cmd);
15996: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_filter_list_cmd);
15997: install_element (ENABLE_NODE, &show_bgp_ipv4_route_map_cmd);
15998: install_element (ENABLE_NODE, &show_bgp_ipv4_cidr_only_cmd);
15999: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cidr_only_cmd);
16000: install_element (ENABLE_NODE, &show_bgp_ipv4_community_cmd);
16001: install_element (ENABLE_NODE, &show_bgp_ipv4_community2_cmd);
16002: install_element (ENABLE_NODE, &show_bgp_ipv4_community3_cmd);
16003: install_element (ENABLE_NODE, &show_bgp_ipv4_community4_cmd);
16004: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community_cmd);
16005: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community2_cmd);
16006: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community3_cmd);
16007: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community4_cmd);
16008: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
16009: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
16010: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
16011: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
16012: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
16013: install_element (ENABLE_NODE, &show_bgp_ipv4_community_exact_cmd);
16014: install_element (ENABLE_NODE, &show_bgp_ipv4_community2_exact_cmd);
16015: install_element (ENABLE_NODE, &show_bgp_ipv4_community3_exact_cmd);
16016: install_element (ENABLE_NODE, &show_bgp_ipv4_community4_exact_cmd);
16017: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community_exact_cmd);
16018: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community2_exact_cmd);
16019: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community3_exact_cmd);
16020: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community4_exact_cmd);
16021: install_element (ENABLE_NODE, &show_bgp_ipv4_community_list_cmd);
16022: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community_list_cmd);
16023: install_element (ENABLE_NODE, &show_bgp_ipv4_community_list_exact_cmd);
16024: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_community_list_exact_cmd);
16025: install_element (ENABLE_NODE, &show_bgp_ipv4_prefix_longer_cmd);
16026: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_longer_cmd);
16027: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_longer_cmd);
16028: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_advertised_route_cmd);
16029: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_advertised_route_cmd);
16030: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_received_routes_cmd);
16031: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_received_routes_cmd);
16032: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
16033: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_routes_cmd);
16034: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_routes_cmd);
16035: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_received_prefix_filter_cmd);
16036: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_received_prefix_filter_cmd);
16037: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_dampened_paths_cmd);
16038: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_dampened_paths_cmd);
16039: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_dampened_paths_cmd);
16040: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_dampened_paths_cmd);
16041: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_statistics_cmd);
16042: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_statistics_cmd);
16043: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_statistics_cmd);
16044: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_statistics_cmd);
16045: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_address_cmd);
16046: install_element (ENABLE_NODE, &show_bgp_ipv6_flap_address_cmd);
16047: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_address_cmd);
16048: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_prefix_cmd);
16049: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_prefix_cmd);
16050: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_cmd);
16051: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_cmd);
16052: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_cidr_only_cmd);
16053: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_cidr_only_cmd);
16054: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_regexp_cmd);
16055: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_regexp_cmd);
16056: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_regexp_cmd);
16057: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_regexp_cmd);
16058: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_filter_list_cmd);
16059: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_filter_list_cmd);
16060: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_filter_list_cmd);
16061: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_filter_list_cmd);
16062: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_prefix_list_cmd);
16063: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_prefix_list_cmd);
16064: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_list_cmd);
16065: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_list_cmd);
16066: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_prefix_longer_cmd);
16067: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_prefix_longer_cmd);
16068: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_prefix_longer_cmd);
16069: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_prefix_longer_cmd);
16070: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_flap_route_map_cmd);
16071: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_flap_route_map_cmd);
16072: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_damp_flap_route_map_cmd);
16073: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_damp_flap_route_map_cmd);
16074: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_flap_cmd);
16075: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_flap_cmd);
16076: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_damp_cmd);
16077: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_damp_cmd);
16078: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
16079: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
16080: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
16081: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
16082: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
16083: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
16084:
16085: /* BGP dampening clear commands */
16086: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
16087: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
16088: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
16089: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
16090:
16091: /* prefix count */
16092: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_neighbor_prefix_counts_cmd);
16093: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_neighbor_prefix_counts_cmd);
16094: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
16095:
16096: /* New config IPv6 BGP commands. */
16097: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
16098: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
16099: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
16100: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
16101:
16102: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
16103: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
16104: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
16105: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
16106:
16107: install_element (BGP_IPV6M_NODE, &ipv6_bgp_network_cmd);
16108: install_element (BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd);
16109:
16110: /* Old config IPv6 BGP commands. */
16111: install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
16112: install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
16113:
16114: install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
16115: install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
16116: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
16117: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
16118:
16119: install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
16120: install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
16121: install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
16122: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
16123: install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
16124: install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
16125: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
16126: install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
16127: install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
16128: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community_cmd);
16129: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community2_cmd);
16130: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community3_cmd);
16131: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community4_cmd);
16132: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community_exact_cmd);
16133: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community2_exact_cmd);
16134: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community3_exact_cmd);
16135: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community4_exact_cmd);
16136: install_element (VIEW_NODE, &show_bgp_community_list_cmd);
16137: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
16138: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
16139: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
16140: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
16141: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
16142: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
16143: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
16144: install_element (VIEW_NODE, &show_bgp_ipv4_rsclient_cmd);
16145: install_element (VIEW_NODE, &show_bgp_ipv6_rsclient_cmd);
16146: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
16147: install_element (VIEW_NODE, &show_bgp_ipv6_rsclient_route_cmd);
16148: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
16149: install_element (VIEW_NODE, &show_bgp_ipv6_rsclient_prefix_cmd);
16150: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
16151: install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
16152: install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
16153: install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
16154: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
16155: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
16156: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
16157: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
16158: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
16159: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
16160: install_element (VIEW_NODE, &show_bgp_view_ipv4_rsclient_cmd);
16161: install_element (VIEW_NODE, &show_bgp_view_ipv6_rsclient_cmd);
16162: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
16163: install_element (VIEW_NODE, &show_bgp_view_ipv6_rsclient_route_cmd);
16164: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
16165: install_element (VIEW_NODE, &show_bgp_view_ipv6_rsclient_prefix_cmd);
16166: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
16167:
16168: /* Restricted:
16169: * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
16170: */
16171: install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
16172: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
16173: install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
16174: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
16175: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community_cmd);
16176: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community2_cmd);
16177: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community3_cmd);
16178: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community4_cmd);
16179: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community_exact_cmd);
16180: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community2_exact_cmd);
16181: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community3_exact_cmd);
16182: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_community4_exact_cmd);
16183: install_element (RESTRICTED_NODE, &show_bgp_ipv6_rsclient_route_cmd);
16184: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
16185: install_element (RESTRICTED_NODE, &show_bgp_ipv6_rsclient_prefix_cmd);
16186: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
16187: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
16188: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
16189: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
16190: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_rsclient_route_cmd);
16191: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
16192: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_rsclient_prefix_cmd);
16193: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
16194:
16195: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
16196: install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
16197: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
16198: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
16199: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
16200: install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
16201: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
16202: install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
16203: install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
16204: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community_cmd);
16205: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community2_cmd);
16206: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community3_cmd);
16207: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community4_cmd);
16208: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community_exact_cmd);
16209: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community2_exact_cmd);
16210: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community3_exact_cmd);
16211: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community4_exact_cmd);
16212: install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
16213: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community_list_exact_cmd);
16214: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
16215: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
16216: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
16217: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
16218: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
16219: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
16220: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
16221: install_element (ENABLE_NODE, &show_bgp_ipv4_rsclient_cmd);
16222: install_element (ENABLE_NODE, &show_bgp_ipv6_rsclient_cmd);
16223: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
16224: install_element (ENABLE_NODE, &show_bgp_ipv6_rsclient_route_cmd);
16225: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
16226: install_element (ENABLE_NODE, &show_bgp_ipv6_rsclient_prefix_cmd);
16227: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
16228: install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
16229: install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
16230: install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
16231: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
16232: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
16233: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
16234: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
16235: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
16236: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
16237: install_element (ENABLE_NODE, &show_bgp_view_ipv4_rsclient_cmd);
16238: install_element (ENABLE_NODE, &show_bgp_view_ipv6_rsclient_cmd);
16239: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
16240: install_element (ENABLE_NODE, &show_bgp_view_ipv6_rsclient_route_cmd);
16241: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
16242: install_element (ENABLE_NODE, &show_bgp_view_ipv6_rsclient_prefix_cmd);
16243: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
16244:
16245: /* Statistics */
16246: install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
16247: install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
16248:
16249: install_element (BGP_NODE, &bgp_distance_cmd);
16250: install_element (BGP_NODE, &no_bgp_distance_cmd);
16251: install_element (BGP_NODE, &no_bgp_distance2_cmd);
16252: install_element (BGP_NODE, &bgp_distance_source_cmd);
16253: install_element (BGP_NODE, &no_bgp_distance_source_cmd);
16254: install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
16255: install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
16256:
16257: install_element (BGP_NODE, &bgp_damp_set_cmd);
16258: install_element (BGP_NODE, &bgp_damp_set2_cmd);
16259: install_element (BGP_NODE, &bgp_damp_set3_cmd);
16260: install_element (BGP_NODE, &bgp_damp_unset_cmd);
16261: install_element (BGP_NODE, &bgp_damp_unset2_cmd);
16262: install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
16263: install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
16264: install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
16265: install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
16266: install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
16267:
16268: /* Deprecated AS-Pathlimit commands */
16269: install_element (BGP_NODE, &bgp_network_ttl_cmd);
16270: install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
16271: install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
16272: install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
16273: install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
16274: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
16275:
16276: install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
16277: install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
16278: install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
16279: install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
16280: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
16281: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
16282:
16283: install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
16284: install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
16285: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
16286: install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
16287: install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
16288: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
16289:
16290: install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
16291: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
16292: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
16293: install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
16294: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
16295: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
16296:
16297: install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
16298: install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
16299: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
16300: install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
16301: install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
16302: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
16303:
16304: install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
16305: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
16306: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
16307: install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
16308: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
16309: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
16310:
16311: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
16312: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
16313:
16314: /* old style commands */
16315: install_element (VIEW_NODE, &show_ip_bgp_cmd);
16316: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
16317: install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
16318: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
16319: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
16320: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
16321: install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
16322: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
16323: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
16324: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
16325: install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
16326: install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
16327: install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
16328: install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
16329: install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
16330: install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
16331: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
16332: install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
16333: install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
16334: install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
16335: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
16336: install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
16337: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
16338: install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
16339: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
16340: install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
16341: install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
16342: install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
16343: install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
16344: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
16345: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
16346: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
16347: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
16348: install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
16349: install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
16350: install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
16351: install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
16352: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
16353: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
16354: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
16355: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
16356: install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
16357: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
16358: install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
16359: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
16360: install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
16361: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
16362: install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
16363: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
16364: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
16365: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
16366: install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
16367: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
16368: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
16369: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
16370: install_element (VIEW_NODE, &show_ip_bgp_dampening_params_cmd);
16371: install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
16372: install_element (VIEW_NODE, &show_ip_bgp_damp_dampened_paths_cmd);
16373: install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
16374: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_statistics_cmd);
16375: install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
16376: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_address_cmd);
16377: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
16378: install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
16379: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_cidr_only_cmd);
16380: install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
16381: install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
16382: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_filter_list_cmd);
16383: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
16384: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_prefix_list_cmd);
16385: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
16386: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_prefix_longer_cmd);
16387: install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
16388: install_element (VIEW_NODE, &show_ip_bgp_damp_flap_route_map_cmd);
16389: install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
16390: install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
16391: install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
16392: install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
16393: install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
16394: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
16395: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
16396: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
16397: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
16398: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
16399: install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
16400: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
16401: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
16402: install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
16403: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
16404: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
16405: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
16406: install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
16407: install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
16408: install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
16409: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
16410: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
16411: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
16412: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
16413: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
16414: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
16415: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
16416: install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
16417: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
16418: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
16419: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
16420: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
16421: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
16422: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
16423: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
16424: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
16425: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
16426: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
16427: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
16428: install_element (ENABLE_NODE, &show_ip_bgp_cmd);
16429: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
16430: install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
16431: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
16432: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
16433: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
16434: install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
16435: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
16436: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
16437: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
16438: install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
16439: install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
16440: install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
16441: install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
16442: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
16443: install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
16444: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
16445: install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
16446: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
16447: install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
16448: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
16449: install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
16450: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
16451: install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
16452: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
16453: install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
16454: install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
16455: install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
16456: install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
16457: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
16458: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
16459: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
16460: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
16461: install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
16462: install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
16463: install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
16464: install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
16465: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
16466: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
16467: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
16468: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
16469: install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
16470: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
16471: install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
16472: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
16473: install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
16474: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
16475: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
16476: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
16477: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
16478: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
16479: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
16480: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
16481: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
16482: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
16483: install_element (ENABLE_NODE, &show_ip_bgp_dampening_params_cmd);
16484: install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
16485: install_element (ENABLE_NODE, &show_ip_bgp_damp_dampened_paths_cmd);
16486: install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
16487: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_statistics_cmd);
16488: install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
16489: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_address_cmd);
16490: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
16491: install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
16492: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_cidr_only_cmd);
16493: install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
16494: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_regexp_cmd);
16495: install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
16496: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_filter_list_cmd);
16497: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
16498: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_prefix_list_cmd);
16499: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
16500: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_prefix_longer_cmd);
16501: install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
16502: install_element (ENABLE_NODE, &show_ip_bgp_damp_flap_route_map_cmd);
16503: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
16504: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
16505: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
16506: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
16507: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
16508: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
16509: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
16510: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
16511: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
16512: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
16513: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
16514: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
16515: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
16516: install_element (VIEW_NODE, &show_bgp_cmd);
16517: install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
16518: install_element (VIEW_NODE, &show_bgp_route_cmd);
16519: install_element (VIEW_NODE, &show_bgp_prefix_cmd);
16520: install_element (VIEW_NODE, &show_bgp_regexp_cmd);
16521: install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
16522: install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
16523: install_element (VIEW_NODE, &show_bgp_route_map_cmd);
16524: install_element (VIEW_NODE, &show_bgp_community_all_cmd);
16525: install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
16526: install_element (VIEW_NODE, &show_bgp_community_cmd);
16527: install_element (VIEW_NODE, &show_bgp_community2_cmd);
16528: install_element (VIEW_NODE, &show_bgp_community3_cmd);
16529: install_element (VIEW_NODE, &show_bgp_community4_cmd);
16530: install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
16531: install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
16532: install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
16533: install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
16534: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community_list_cmd);
16535: install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
16536: install_element (VIEW_NODE, &show_bgp_ipv6_safi_community_list_exact_cmd);
16537: install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
16538: install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
16539: install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
16540: install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
16541: install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
16542: install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
16543: install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
16544: install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
16545: install_element (VIEW_NODE, &show_bgp_view_cmd);
16546: install_element (VIEW_NODE, &show_bgp_view_route_cmd);
16547: install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
16548: install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
16549: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
16550: install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
16551: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
16552: install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
16553: install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
16554: install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
16555: install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
16556: install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
16557: install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
16558: install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
16559: install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
16560: install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
16561: install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
16562: install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
16563: install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
16564: install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
16565: install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
16566: install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
16567: install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
16568: install_element (ENABLE_NODE, &show_bgp_cmd);
16569: install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
16570: install_element (ENABLE_NODE, &show_bgp_route_cmd);
16571: install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
16572: install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
16573: install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
16574: install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
16575: install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
16576: install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
16577: install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
16578: install_element (ENABLE_NODE, &show_bgp_community_cmd);
16579: install_element (ENABLE_NODE, &show_bgp_community2_cmd);
16580: install_element (ENABLE_NODE, &show_bgp_community3_cmd);
16581: install_element (ENABLE_NODE, &show_bgp_community4_cmd);
16582: install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
16583: install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
16584: install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
16585: install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
16586: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_community_list_cmd);
16587: install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
16588: install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
16589: install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
16590: install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
16591: install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
16592: install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
16593: install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
16594: install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
16595: install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
16596: install_element (ENABLE_NODE, &show_bgp_view_cmd);
16597: install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
16598: install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
16599: install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
16600: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
16601: install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
16602: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
16603: install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
16604: install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
16605: install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
16606: install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
16607: install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
16608: install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
16609: install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
16610: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
16611: install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
16612: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
16613: install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
16614: install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
16615: install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
16616: install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
16617: install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
16618: install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
16619: install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
16620: install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
16621: install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
16622: install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
16623: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
16624: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
16625: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
16626: install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
16627: install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
16628: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
16629: install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
16630: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
16631: install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
16632: install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
16633: install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
16634: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
16635: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
16636: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
16637: install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
16638: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
16639: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
16640: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
16641: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
16642: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
16643: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
16644: install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
16645: install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
16646: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
16647: install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
16648: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
16649: install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
16650: install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
16651: install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
16652: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
16653: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
16654: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
16655: install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
16656: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
16657: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
16658: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
16659: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
16660: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
16661: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
16662: install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
16663: install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
16664: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
16665: install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
16666: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
16667: install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
16668: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
16669: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
16670: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
16671: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
16672: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
16673: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
16674: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
16675: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
16676: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
16677: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
16678: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
16679: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
16680: install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
16681: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
16682: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
16683: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
16684: install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
16685: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
16686: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
16687: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
16688: install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
16689: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
16690: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
16691: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
16692: /* old with name safi collision */
16693: install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
16694: install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
16695: install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
16696: install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
16697: install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
16698: install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
16699: install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
16700: install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
16701: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
16702: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
16703: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
16704: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
16705: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
16706: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
16707: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
16708: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
16709: install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
16710: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
16711: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
16712: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
16713: install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
16714: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
16715: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
16716: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
16717: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
16718: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
16719: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
16720: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
16721:
16722: install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
16723: install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
16724: install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
16725: install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
16726: install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
16727: install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
16728:
16729: install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
16730: install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
16731: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
16732: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
16733: install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
16734: install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
16735: }
16736:
16737: void
16738: bgp_route_finish (void)
16739: {
16740: bgp_table_unlock (bgp_distance_table);
16741: bgp_distance_table = NULL;
16742: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>